AUTO_INCREMENT
、LAST_INSERT_ID()
、および TIMESTAMP
値のステートメントレベルレプリケーションは正しく行われますが、次の例外があります。
MySQL 5.6.10 より前のステートメントベースレプリケーションを使用するときは、スレーブ上のテーブル内の
AUTO_INCREMENT
カラムは、マスター上の同じカラムに一致する必要があります。つまり、AUTO_INCREMENT
カラムはAUTO_INCREMENT
カラムに複製される必要があります。(Bug #12669186)AUTO_INCREMENT
カラムを更新するトリガーまたは関数を呼び出すステートメントは、ステートメントベースレプリケーションでは正しく複製されません。MySQL 5.6 では、このようなステートメントは安全でないとマークされます。(Bug #45677)-
複合主キーを持ち、この複合キーの先頭カラムでない
AUTO_INCREMENT
カラムを含むテーブルにINSERT
を実行することは、ステートメントベースロギングまたはレプリケーションにとって安全ではありません。MySQL 5.6.6 以降では、このようなステートメントは安全でないとマークされます。(Bug #11754117、Bug #45670)この問題は
InnoDB
ストレージエンジンを使用するテーブルに影響しません。AUTO_INCREMENT カラムを持つInnoDB
テーブルには、自動インクリメントカラムが唯一または左端のカラムであるキーが少なくとも 1 つ必要であるためです。 -
ALTER TABLE
でテーブルにAUTO_INCREMENT
カラムを追加した場合、行の順序がスレーブとマスターで同じにならない場合があります。これが発生するのは、行が番号付けされる順序が、テーブルに使用される固有のストレージエンジンおよび行が挿入された順序に依存するためです。マスターとスレーブで同じ順序を持つことが重要である場合は、行を並べ替えてからAUTO_INCREMENT
番号を割り当てる必要があります。カラムcol1
とcol2
を持つテーブルt1
にAUTO_INCREMENT
カラムを追加するものと仮定すると、次のステートメントはt1
と同じであるけれどもAUTO_INCREMENT
カラムを持つ新しいテーブルt2
を生成します。CREATE TABLE t2 LIKE t1; ALTER TABLE t2 ADD id INT AUTO_INCREMENT PRIMARY KEY; INSERT INTO t2 SELECT * FROM t1 ORDER BY col1, col2;
重要マスターとスレーブの両方で同じ順序を保証するには、
ORDER BY
句でt1
のすべてのカラムの名前を指定する必要があります。上記の指示には
CREATE TABLE ... LIKE
の制限が適用されます。外部キー定義はDATA DIRECTORY
およびINDEX DIRECTORY
テーブルオプションと同様に無視されます。テーブル定義がこれらの特性を含む場合、t1
の作成に使用したものと同じであるけれどもAUTO_INCREMENT
カラムを追加したCREATE TABLE
ステートメントを使用して、t2
を作成してください。AUTO_INCREMENT
カラムを持つコピーを作成および移入するために使用する方法にかかわらず、最終手順は元のテーブルを削除してコピーの名前を変更することです。DROP t1; ALTER TABLE t2 RENAME t1;
セクションB.5.7.1「ALTER TABLE での問題」も参照してください。