Spec-Zone .ru
спецификации, руководства, описания, API

14.2.2.6. InnoDB и MySQL Replication

Репликация MySQL работает на InnoDB таблицы, как это делает для MyISAM таблицы. Также возможно использовать репликацию в пути, где механизм хранения на ведомом устройстве не является тем же самым как исходным механизмом хранения на ведущем устройстве. Например, можно тиражировать модификации в InnoDB таблица на ведущем устройстве к a MyISAM таблица на ведомом устройстве.

Чтобы установить новое ведомое устройство для ведущего устройства, сделайте копию InnoDB табличная область и файлы журнала, так же как .frm файлы InnoDB таблицы, и перемещение копии к ведомому устройству. Если innodb_file_per_table опция включается, копия .ibd файлы также. Для надлежащей процедуры, чтобы сделать это, см. Раздел 14.2.2.4, "Поддерживая и Восстановление InnoDB База данных".

Чтобы сделать новое ведомое устройство, не приводя в нерабочее состояние ведущее устройство или существующее ведомое устройство, используйте Резервный продукт MySQL Enterprise. Если можно завершить работу ведущего устройства или существующего ведомого устройства, возьмите холодное резервное копирование InnoDB табличные области и файлы журнала и использование, что, чтобы установить ведомое устройство.

Транзакции, которые перестали работать на ведущем устройстве, не влияют на репликацию вообще. Репликация MySQL основана на двоичном журнале, где MySQL пишет SQL-операторы, которые изменяют данные. Транзакция, которая перестала работать (например, из-за нарушения внешнего ключа, или потому что она откатывается) не пишется двоичному журналу, таким образом, она не отправляется ведомым устройствам. См. Раздел 13.3.1,"START TRANSACTION, COMMIT, и ROLLBACK Синтаксис".

Репликация и CASCADE. Расположение каскадом действий для InnoDB таблицы на ведущем устройстве тиражируются в ведомое устройство, только если таблицы, совместно использующие отношение внешнего ключа, используют InnoDB и на ведущем устройстве и на ведомом устройстве. Это - истина, используете ли Вы основанную на операторе или построчную репликацию. Предположите, что Вы запустили репликацию, и затем составляете две таблицы на ведущем устройстве, использующем следующий CREATE TABLE операторы:

CREATE TABLE fc1 (    i INT PRIMARY KEY,    j INT) ENGINE = InnoDB;CREATE TABLE fc2 (    m INT PRIMARY KEY,    n INT,    FOREIGN KEY ni (n) REFERENCES fc1 (i)        ON DELETE CASCADE) ENGINE = InnoDB;

Предположите, что ведомое устройство не имеет InnoDB поддержка включается. Если это верно, тогда таблицы на ведомом устройстве составляются, но они используют MyISAM механизм хранения, и FOREIGN KEY опция игнорируется. Теперь мы вставляем некоторые строки в таблицы на ведущем устройстве:

master> INSERT INTO fc1 VALUES (1, 1), (2, 2);Query OK, 2 rows affected (0.09 sec)Records: 2  Duplicates: 0  Warnings: 0master> INSERT INTO fc2 VALUES (1, 1), (2, 2), (3, 1);Query OK, 3 rows affected (0.19 sec)Records: 3  Duplicates: 0  Warnings: 0

В этой точке, и на ведущем устройстве и на ведомом устройстве, таблице fc1 содержит 2 строки, и таблицу fc2 содержит 3 строки, как показано здесь:

master> SELECT * FROM fc1;+---+------+| i | j    |+---+------+| 1 |    1 || 2 |    2 |+---+------+2 rows in set (0.00 sec)master> SELECT * FROM fc2;+---+------+| m | n    |+---+------+| 1 |    1 || 2 |    2 || 3 |    1 |+---+------+3 rows in set (0.00 sec)slave> SELECT * FROM fc1;+---+------+| i | j    |+---+------+| 1 |    1 || 2 |    2 |+---+------+2 rows in set (0.00 sec)slave> SELECT * FROM fc2;+---+------+| m | n    |+---+------+| 1 |    1 || 2 |    2 || 3 |    1 |+---+------+3 rows in set (0.00 sec)

Теперь предположите, что Вы выполняете следующий DELETE оператор на ведущем устройстве:

master> DELETE FROM fc1 WHERE i=1;Query OK, 1 row affected (0.09 sec)

Из-за каскада, таблицы fc2 на ведущем устройстве теперь содержит только 1 строку:

master> SELECT * FROM fc2;+---+---+| m | n |+---+---+| 2 | 2 |+---+---+1 row in set (0.00 sec)

Однако, каскад не распространяет на ведомом устройстве потому что на ведомом устройстве DELETE для fc1 не удаляет строк из fc2. Копия ведомого устройства fc2 все еще содержит все строки, которые были первоначально вставлены:

slave> SELECT * FROM fc2;+---+---+| m | n |+---+---+| 1 | 1 || 3 | 1 || 2 | 2 |+---+---+3 rows in set (0.00 sec)

Это различие - то, вследствие того, что расположение каскадом удаляет, обрабатываются внутренне InnoDB механизм хранения, что означает, что ни одно из изменений не регистрируется.