このドキュメントでは、自動増分主キーの追加によってマスタースタンバイインスタンスのデータ照会が不一致になる可能性のある原因と解決策について説明します。
問題の現象
プライマリインスタンスとスタンバイインスタンスでそれぞれ同じ自動増分主キー値(自動増分ID)を使用してクエリを実行すると、クエリ結果のデータが一致しません。
考えられる原因
主キーなしテーブルに自動増分主キーを追加すると、自動増分主キー値はデータのテーブル内での物理的な格納順序に従って割り当てられます。主キーなしテーブルには明示的な主キー制約がないため、その行データの順序はストレージエンジン内部のRowIDによって決定されます。しかし、プライマリインスタンスとスタンバイインスタンスでは同じデータのRowIDが異なる可能性があり、データの物理的な配置順序がプライマリインスタンスとスタンバイインスタンスで一致しなくなることがあります。その結果、同じデータに異なるインスタンスで割り当てられる自動増分主キー値が異なります。したがって、同じ自動増分主キー値を使用してプライマリインスタンスとスタンバイインスタンスをそれぞれクエリすると、得られる結果に差異が生じる可能性があります。詳細はBUG#92949およびMySQL公式ドキュメンテーションを参照してください。 ソリューション
1. プライマリインスタンスで元の主キーなしテーブルと同じ新しいテーブルを作成し、自動増分主キーを追加します。
2. データをすべてのフィールドでソートしてから新しいテーブルに挿入します。
3. 元の主キーなしテーブルを削除し、新しいテーブルを元の主キーなしテーブル名に名称変更します。
例
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;
DROP TABLE t1;
RENAME TABLE t2 TO t1;