我使用的是 MySQL 8.0.26,并且有主副本设置。我的目标是当插入新行或更新表上的行时,自动将副本中的列更新为当前时间戳。
这是我的架构:
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;
然后在副本上,我添加了此列并创建了这些触发器:
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();
但是,当我尝试在主数据库上插入新数据或更新现有行时,副本上不会调用触发器。这意味着副本上的 Updated_at 列保持为空。有关如何告诉副本在该表上发生插入/更新时运行这些触发器或更新该列的任何想法吗?
注意:binlog_format 为“ROW”。
为什么不在主节点上运行 ALTER TABLE ???
这样,副本上就不需要存储过程(当 binlog_format 为 ROW 时,通常不会在副本上触发)。
在主数据库上使用 pt-online-schema-change。
这是一个可以帮助您入门的 bash 脚本
这是一个示例
my.cnf