おそらく、2つの形式のバイナリロギング 、ステートメントベース-マスター上のデータを変更してスレーブ上で実行できるようにする実際のクエリをログに記録し、行ベース-実際の行データの前後の画像をログに記録しますスレーブがそれらの変更をデータに直接適用できるように、クエリによって変更されます...および混合モードでは、オプティマイザとストレージエンジンが、クエリごとに最適な形式を決定します。
実行しているステートメントは安全ではありません原則として INSERT ... SELECT
を使用しているため 自動インクリメント列を持つテーブルに。 その一般的な形式のクエリの場合 STATEMENT
で使用されました ベースの環境、およびSELECT
マスターとスレーブで同じ順序で行を返さなかった場合、行は異なる順序で選択される可能性があり、その結果、異なる自動インクリメント値になります。
実際には、特定の 実行しているクエリは 挿入する行は1つだけであり、自動インクリメント値を明示的に指定しているため、決定論的です。それがあなたの混乱の原因だと思います。ただし、INSERT ... SELECT
を実行しているため、まだ警告がトリガーされているようです。 自動インクリメントを使用してテーブルに追加すると、サーバーは、精度ではなく、原則として、一般化された「安全でない」判断をクエリに適用しているように見えます。
binlog_format
を切り替える MIXED
へ サーバーはその裁量でモードを切り替えることができるため、警告が消えるはずです...そして悪影響が生じる可能性はほとんどありません。 STATEMENT
という事実がなかった場合 常にデフォルトでした(最初はそれが利用可能な唯一の種類のレプリケーションだったので)、私は彼らがMIXED
を作ったのではないかと思います ずっと前のデフォルト...実際、バイナリログの内部に精通している場合は、おそらく私と同じようにROW
を使用する傾向があります。 「古い」行データはDELETE
に記録されるため、トラブルシューティングやトラブルからの脱却に非常に役立つバイナリログが作成される傾向があります。 およびUPDATE
。