Estou usando o MySQL 8.0.26 e tenho uma configuração de réplica primária. Meu objetivo é atualizar automaticamente uma coluna em uma réplica para o carimbo de data/hora atual quando uma nova linha é inserida ou uma linha é atualizada na tabela.
Este é o meu esquema:
CREATE TABLE `t1` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`cus_id` int unsigned NOT NULL DEFAULT '0',
`created_at` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
Depois, na réplica, adicionei esta coluna e criei estes gatilhos:
ALTER TABLE t1 ADD COLUMN updated_at timestamp;
CREATE TRIGGER t1__before_insert
BEFORE INSERT ON t1
FOR EACH ROW SET NEW.updated_at = NOW();
CREATE TRIGGER t1__before_update
BEFORE UPDATE ON t1
FOR EACH ROW SET NEW.updated_at = NOW();
Mas quando tentei inserir novos dados ou atualizar uma linha existente no primário, o gatilho não foi invocado na réplica. Isso significa que a coluna atualizada_at na réplica permanece nula. Alguma idéia de como posso dizer à réplica para executar esses gatilhos ou atualizar esta coluna quando ocorre uma inserção/atualização nesta tabela?
Nota: o binlog_format é "ROW".
Por que não apenas executar ALTER TABLE no Primário???
Dessa forma, não há necessidade de procedimentos armazenados na réplica (que geralmente não são acionados em uma réplica quando o binlog_format é ROW).
Use pt-online-schema-change no primário.
Aqui está um script bash para você começar
Aqui está uma amostra
my.cnf