DBAtlas · データベース運用アトラス

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 を追加する。

DBAtlas で開く →

同じデータベースの他の項目