Предположим, что вы используете два сервера mysql: один - мастер, другой - подчиненный. Мастер имеет триггеры, которые устанавливают для столбцов обновления значение COUNT из числа строк в других таблицах. Например, у вас есть таблица новостей и таблица комментариев. В новостях содержится столбец INT с именем "total_comments
", который увеличивается с помощью триггера каждый раз, когда новая строка помещается в "комментарии". Требуется ли подчиненному этот триггер (чтобы сохранить "news.total_comments
" в актуальном состоянии), или ему будет предложено обновить соответствующий "news.total_comments
" напрямую?
Из документов http://dev.mysql.com/doc/refman/5.0/en/faqs-triggers.html:
22.5.4: Как выполняются действия с помощью триггеров на главном реплицируется на подчиненный? Во-первых, триггеры, которые существуют на сервере, должны воссоздаваться на подчиненном сервере. Как только это будет сделано, репликация поток работает как любой другой стандарт DML выражение, которое участвует в Репликация. Например, рассмотрим таблица EMP, которая имеет вставку AFTER триггер, который существует на главном Сервер MySQL. Та же таблица EMP и ПОСЛЕ Вставки триггера существуют на подчиненного сервера. Репликация поток будет: Инструкция INSERT сделанных для ПУЭ. Триггер AFTER для EMP активируется. Инструкция INSERT записанный в двоичный журнал. ведомый репликации поднимает INSERT для EMP и выполняет его. ПОСЛЕ запуска на EMP, который существует ведомый активируется.
и
22.5.4 Действия, выполняемые с помощью триггеров мастера, не реплицируется на подчиненный сервер.
Таким образом, вам нужны триггеры на подчиненном устройстве.
Это зависит от используемой вами репликации. Если вы используете репликацию на основе инструкций, то вы должны использовать соответствующие триггеры в главном и подчиненном. Если вы используете репликацию на основе строк, то вы не должны включать триггеры на подчиненном устройстве.
У вас может быть действие запросов, созданных триггерами в двоичном журнале с объединенными таблицами (MySQL5), путем добавления той же таблицы с локальным подключением.
---------------------------------------------------------------------------------------
-- EXEMPLE :
-- We want install a replication of the table test_table that will be managed by Trg_Update triggers.
---------------------------------------------------------------------------------------
Create database TEST;
USE TEST;
CREATE TABLE test_trigger (
id INT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL DEFAULT '',
PRIMARY KEY (id),
INDEX name (name),
) ;
DELIMITER |
CREATE TRIGGER Trg_Update AFTER INSERT ON test_trigger
FOR EACH ROW BEGIN
INSERT INTO federated_table (name, other) values (NEW.name, ‘test trigger on federated table -> OK’)
END|
DELIMITER ;
CREATE TABLE test_table (
id INT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL DEFAULT '',
other VARCHAR(32) NOT NULL DEFAULT '',
PRIMARY KEY (id),
INDEX name (name),
INDEX other_key (other)
) ;
CREATE TABLE federated_table (
id INT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL DEFAULT '',
other VARCHAR(32) NOT NULL DEFAULT '',
PRIMARY KEY (id),
INDEX name (name),
INDEX other_key (other)
)
ENGINE=FEDERATED
CONNECTION='mysql://root@localhost/TEST/test_table';
---------------------------------------------------------------------------------------