1592: ER_BINLOG_UNSAFE_STATEMENT: Unsafe statement written to the binary log(安全でない文がバイナリログに書き込まれた)
MySQL意味
STATEMENT ベースの binlog フォーマット使用中に、結果が非決定的な文 (レプリカで異なる結果を生じ得る文) が実行された。ソースとレプリカ間でデータ不整合のリスクがあるため、MySQL は binlog への書き込み時に警告を出す。
原因
binlog_format=STATEMENT の場合: UUID()、SYSDATE()、USER() などの非決定的関数 (NOW() は STATEMENT でも安全にレプリケートされる)、ORDER BY なしで LIMIT 付きの UPDATE/DELETE、AUTO_INCREMENT が絡む INSERT、または特定のユーザー定義/システム関数。これらの文はすべてのサーバーで同じ結果になるとは限らない。
対処方法
binlog フォーマットを行ベースに切り替える (推奨。MySQL 5.7.7 以降は ROW がデフォルト): my.cnf で binlog_format=ROW、または SET PERSIST binlog_format = ROW; (binlog_format 変数は 8.0.34 以降非推奨。変更は新しいセッションから有効)。ROW フォーマットでは非決定的な文も安全にレプリケートされる。STATEMENT のままにする必要がある場合は、非決定的な関数/式を定数値に置き換え、LIMIT 付き DML に決定的な ORDER BY を追加する。
同じデータベースの他の項目
- 3819ER_CHECK_CONSTRAINT_VIOLATED: Check constraint is violated(CHECK 制約違反)
- 1118ER_TOO_BIG_ROWSIZE: Row size too large(行サイズが大きすぎる)
- 1170ER_BLOB_KEY_WITHOUT_LENGTH: BLOB/TEXT column used in key specification without a key length(キー長を指定せずに BLOB/TEXT 列をキーに使用)
- 3140ER_INVALID_JSON_TEXT: Invalid JSON text(無効な JSON テキスト)
- 1526ER_NO_PARTITION_FOR_GIVEN_VALUE: Table has no partition for value(値に対応するパーティションがない)
- 1049Unknown database 'name'(不明なデータベース 'name')
- 1364Field 'name' doesn't have a default value(フィールド 'name' にデフォルト値がない)