Spec-Zone.ru › MariaDB

Репликация и внешние ключи

В репликации исторически использовались термины мастер и раб, но сейчас предпочтительнее термины примарный и реплика. Старые термины по-прежнему используются в некоторых частях документации и в командах MariaDB, хотя MariaDB 10.5 начала процесс переименования. Процесс документации продолжается. Следите за прогрессом этого проекта в MDEV-18777.

Репликация основана на двоичном журнале. Однако каскадные удаления или обновления на основе внешних ключей — это внутренний механизм и не записываются в двоичный журнал.

Из-за этого одинаковые операторы, запущенные на мастере и на рабе, могут привести к разным результатам, если отношения внешних ключей не идентичны на обоих. Это может быть в случае, если движок хранения на одном сервере поддерживает каскадные удаления (например, InnoDB), а на другом нет (например, MyISAM), или один сервер определил отношение внешнего ключа, а другой — нет.

Рассмотрим следующий пример:

CREATE TABLE employees (
    x INT PRIMARY KEY,
    name VARCHAR(10)
) ENGINE = InnoDB;

CREATE TABLE children (
    y INT PRIMARY KEY,
    f INT,
    name VARCHAR(10),
    FOREIGN KEY fk (f) REFERENCES employees (x)
        ON DELETE CASCADE
) ENGINE = InnoDB;

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

INSERT INTO employees VALUES (1, 'Yaser'), (2, 'Prune');

INSERT INTO children VALUES (1, 1, 'Haruna'), (2, 1, 'Hera'), (3, 2, 'Eva');

На этом этапе раб и мастер синхронизированы:

SELECT * FROM employees;
+---+-------+
| x | name  |
+---+-------+
| 1 | Yaser |
| 2 | Prune |
+---+-------+
2 rows in set (0.00 sec)

SELECT * FROM children;
+---+------+--------+
| y | f    | name   |
+---+------+--------+
| 1 |    1 | Haruna |
| 2 |    1 | Hera   |
| 3 |    2 | Eva    |
+---+------+--------+

Однако после:

DELETE FROM employees WHERE x=1;

на рабе и на мастере появляются разные результаты.

На мастере каскадные удаления вступили в силу:

SELECT * FROM children;
+---+------+------+
| y | f    | name |
+---+------+------+
| 3 |    2 | Eva  |
+---+------+------+

На рабе каскадные удаления не вступили в силу:

SELECT * FROM children;
+---+------+--------+
| y | f    | name   |
+---+------+--------+
| 1 |    1 | Haruna |
| 2 |    1 | Hera   |
| 3 |    2 | Eva    |
+---+------+--------+
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержание не предварительно проверяется MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/replication-and-foreign-keys/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API