ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
このエラーの概要
ERROR 1665 (HY000):
Cannot execute statement: impossible to write to binary log since
BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine
limited to row-based logging.
InnoDB is limited to row-logging when transaction isolation level is
READ COMMITTED or READ UNCOMMITTED.
ERROR 1592 (HY000):
Unsafe statement written to the binary log using statement format
since BINLOG_FORMAT = STATEMENT. ...
MySQL のレプリケーションは binary log(binlog) をマスタ→スレーブへ転送して再生する仕組みです。binlog のフォーマットには 3 種類あります:
| 形式 | 記録内容 | 長所 | 短所 |
|---|---|---|---|
| STATEMENT | SQL 文そのもの | ログサイズ小 | 非決定的関数で再現不可 |
| ROW | 行の変更内容 | 常に安全 / 正確 | ログサイズ大 |
| MIXED | 原則 STATEMENT、危険時のみ ROW | バランス | 判定ロジック分の負荷 |
このエラーは、STATEMENT モードで レプリカで結果が変わってしまう可能性のあるクエリを実行しようとして、MySQL が安全装置として止めたものです。
「危険」と判定される代表的なクエリ
- 非決定的関数:
UUID()、NOW()、SYSDATE()、RAND()、USER()、CURRENT_USER()、LOAD_FILE() - INSERT ... SELECT で AUTO_INCREMENT を含む
- UPDATE ... LIMIT N(ORDER BY 無し)
- READ COMMITTED 分離レベル + InnoDB の組み合わせ
- 関数内のテーブル参照
- システム変数 参照(
@@hostname等)
対処1: セッション単位で ROW に切替(最速)
-- 現在の設定確認
SHOW VARIABLES LIKE 'binlog_format';
-- +---------------+-----------+
-- | binlog_format | STATEMENT |
-- +---------------+-----------+
-- セッション内のみ切替(接続切れたら戻る)
SET SESSION binlog_format = 'ROW';
-- 問題のクエリを実行
UPDATE users SET token = UUID() WHERE id = 1;
-- 元に戻したい場合
SET SESSION binlog_format = 'STATEMENT';
アプリ側で実装する場合(Java/JDBC 例):
try (Connection conn = dataSource.getConnection()) {
try (Statement stmt = conn.createStatement()) {
stmt.execute("SET SESSION binlog_format = 'ROW'");
}
// この後、危険なクエリを実行
try (PreparedStatement ps = conn.prepareStatement(
"UPDATE users SET token = UUID() WHERE id = ?")) {
ps.setLong(1, userId);
ps.executeUpdate();
}
}
対処2: グローバル設定変更(一時的)
-- 全接続に影響、ただし再起動で戻る
SET GLOBAL binlog_format = 'ROW';
-- 推奨: MIXED に
SET GLOBAL binlog_format = 'MIXED';
-- 確認
SHOW VARIABLES LIKE 'binlog_format';
-- 既存接続には反映されない。新規接続から有効
対処3: my.cnf で永続化(推奨)
# /etc/my.cnf または /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server-id = 1
log-bin = /var/log/mysql/mysql-bin
# ★ 推奨: ROW (MySQL 5.7.7+ / 8.0 のデフォルト)
binlog_format = ROW
# あるいは MIXED(GTID 利用時推奨)
# binlog_format = MIXED
# 関連設定
binlog_row_image = MINIMAL # ROW 時のサイズ削減
expire_logs_days = 7 # 古い binlog を自動削除
sync_binlog = 1 # クラッシュ耐性
gtid_mode = ON
enforce_gtid_consistency = ON# 設定再読込(要再起動)
sudo systemctl restart mysqld
# 確認
mysql -e "SHOW VARIABLES LIKE 'binlog_format'"
# RDS / Aurora の場合は Parameter Group で binlog_format を変更
# → DB インスタンス再起動が必要
対処4: クエリを書き換える
binlog_format をいじれない環境(マネージド DB 等)では、クエリ側で非決定性を排除します:
-- 悪い例1: UUID() を直接埋め込む
UPDATE users SET token = UUID() WHERE id = 1;
-- 良い例1: アプリ側で生成して渡す
-- (Java) String token = UUID.randomUUID().toString();
UPDATE users SET token = '550e8400-e29b-41d4-a716-446655440000' WHERE id = 1;
-- 悪い例2: NOW() を埋め込む
INSERT INTO logs (msg, created_at) VALUES ('event', NOW());
-- 良い例2: アプリでタイムスタンプ生成
INSERT INTO logs (msg, created_at) VALUES ('event', '2026-05-17 12:34:56');
-- 悪い例3: ORDER BY なしの LIMIT
UPDATE items SET processed = 1 WHERE processed = 0 LIMIT 100;
-- 良い例3: PRIMARY KEY 指定 or ORDER BY
UPDATE items SET processed = 1
WHERE processed = 0
ORDER BY id LIMIT 100;
-- 悪い例4: INSERT ... SELECT で AUTO_INCREMENT
INSERT INTO archive (data) SELECT data FROM logs;
-- 良い例4: 明示的に PK を指定
INSERT INTO archive (id, data) SELECT id, data FROM logs;
関連: REPLICATION の確認
-- マスタ側: binlog の状態
SHOW MASTER STATUS;
-- +------------------+----------+--------------+------------------+
-- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
-- +------------------+----------+--------------+------------------+
-- | mysql-bin.000003 | 1234 | | |
-- レプリカ側: 状態確認
SHOW REPLICA STATUS\G -- MySQL 8.0.22+
SHOW SLAVE STATUS\G -- 旧式
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- Seconds_Behind_Master: 0
-- Last_SQL_Error: ... ← ここにエラーが出ていないか
-- binlog 内容のダンプ
mysqlbinlog --start-position=1234 /var/log/mysql/mysql-bin.000003
binlog_format ごとの注意点
| 形式 | レプリカ整合性 | ログサイズ | 推奨用途 |
|---|---|---|---|
| STATEMENT | △(非決定的関数で不一致) | 小 | 非推奨(5.7 でデフォルトから外れた) |
| ROW | ◎ | 大(UPDATE で全カラム) | 推奨(5.7.7+ デフォルト) |
| MIXED | ○ | 中 | GTID 環境 / 互換性重視 |
ROW 形式のログサイズ削減
[mysqld]
binlog_format = ROW
binlog_row_image = MINIMAL # 変更カラム + PK のみ記録(全カラムでなく)
binlog_row_metadata = MINIMAL # メタデータ最小化
binlog_rows_query_log_events = ON # 元の SQL もコメントで残す(デバッグ用)
# 圧縮 (MySQL 8.0.20+)
binlog_transaction_compression = ON
FAQ
Q: AWS RDS で binlog_format を変えたい
A: DB Parameter Group の binlog_format を ROW または MIXED に変更し、インスタンス再起動。読み取りレプリカも同じ Parameter Group を使うこと。
Q: ORM (Hibernate/Eloquent) が自動的に UUID() を発行する
A: アプリ側で生成するモードに変更してください。Hibernate なら @GeneratedValue(strategy = GenerationType.UUID) を org.hibernate.id.UUIDGenerator で Java 側生成に。
Q: GTID 利用時の注意
A: GTID 有効時は enforce_gtid_consistency = ON も必須で、ROW か MIXED が事実上必須になります。STATEMENT 単独では GTID と相性が悪いです。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
- 1071 Specified key was too long; max key length is 767 bytes
- ERROR 1063 (42000): Incorrect column specifier for column '~'
- mysqld: Can't change dir to '...\MySQL\MySQL Server X.X\data\' (OS errno 2 - No such file or directory)
- Install/Remove of the Service Denied!
- Datetime 型が NULL に見える
- Warning: World-writable config file '/etc/mysql/my.cnf' is ignored
- ERROR 1698 (28000): Access denied for user 'root'@'localhost'
- Exception: Wrong MySQL configuration
- [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
- ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
- ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
- Incorrect column specifier for column 'カラム名'
- BLOB/TEXT column 'description' used in key specification without a key length
- ERROR: /bin/sh: mysql_config: コマンドが見つかりません
- Host '...' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
- CSVエクスポート時に「ERROR 1045 (28000): Access denied for user 'username'@'localhost'」エラーが表示される
- Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT
- 1
- 1
- 1)
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1"'`--
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1)
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1"'`--
- 1
- 1
- SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: ~
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Laravel キャッシュクリア完全ガイド(cache:clear / config:clear / 2026-05-18 07:42:07
- プロジェクトの作成と削除 2026-05-18 07:42:07
- インストール直後にNetbeansが反応しない 2026-05-18 07:42:07
- 動画やチャンネルの検索 2026-05-18 07:42:07
- APIキー取得方法 2026-05-18 07:42:07
- チャンネル情報の取得 2026-05-18 07:42:07
- API 入門 — Web API(REST / GraphQL / gRPC / 2026-05-18 07:42:07
- インストール(eclipseプラグイン) 2026-05-18 07:42:07
- Laravel「Dotenv values containing spaces must be surrounded 2026-05-18 07:42:07
- エラー一覧 2026-05-18 07:42:07
- curl: (51) SSL: certificate subject name '~' does not match 2026-05-18 07:42:07
- インストール方法(Windows版) 2026-05-18 07:42:07
- JSONから配列に変換 2026-05-18 07:42:07
- 処理を一定時間待つ 2026-05-18 07:42:07
- A non well formed numeric value encountered 2026-05-18 07:42:07
コメントを削除してもよろしいでしょうか?