Репликация и внешние ключи
В репликации исторически использовались термины мастер и раб, но сейчас предпочтительнее термины примарный и реплика. Старые термины по-прежнему используются в некоторых частях документации и в командах 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 | +---+------+--------+
© 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/