跨Percona服务器实现MySQL表更新同步的方案咨询
可行方案:触发器+跨服务器连接(无需修改原表引擎)
核心逻辑
不用改动A服务器上现有export_transaction表的结构或引擎,而是通过在A服务器上创建一个指向B服务器目标表的FEDERATED中间表,再给A的原表绑定触发器,将变更同步到这个中间表,间接完成B表的同步。
具体操作步骤
在A服务器创建FEDERATED同步通道表
这个表仅作为跨服务器数据传递的桥梁,不替代原表:-- 在A服务器的proddb库下执行 CREATE TABLE export_transaction_sync ( -- 完全复制B服务器export_transaction表的结构,与A原表结构一致 id INT PRIMARY KEY AUTO_INCREMENT, transaction_no VARCHAR(50) NOT NULL, amount DECIMAL(10,2) NOT NULL, create_time DATETIME NOT NULL, -- 其他字段需与原表一一对应 INDEX idx_transaction_no (transaction_no) ) ENGINE=FEDERATED CONNECTION='mysql://[B端用户名]:[B端密码]@[B服务器IP]:[端口]/proddb/export_transaction';前置要求:A服务器的MySQL配置需开启
federated引擎(在my.cnf/my.ini中添加federated配置项,重启服务生效)。给A服务器的原表绑定触发器
针对INSERT、UPDATE、DELETE三类操作分别创建触发器:- INSERT触发器:
DELIMITER // CREATE TRIGGER trg_et_insert AFTER INSERT ON export_transaction FOR EACH ROW BEGIN INSERT INTO export_transaction_sync (id, transaction_no, amount, create_time) -- 列出所有字段 VALUES (NEW.id, NEW.transaction_no, NEW.amount, NEW.create_time); END // DELIMITER ; - UPDATE触发器:
DELIMITER // CREATE TRIGGER trg_et_update AFTER UPDATE ON export_transaction FOR EACH ROW BEGIN UPDATE export_transaction_sync SET transaction_no = NEW.transaction_no, amount = NEW.amount, create_time = NEW.create_time WHERE id = OLD.id; END // DELIMITER ; - DELETE触发器:
DELIMITER // CREATE TRIGGER trg_et_delete AFTER DELETE ON export_transaction FOR EACH ROW BEGIN DELETE FROM export_transaction_sync WHERE id = OLD.id; END // DELIMITER ;
- INSERT触发器:
同步初始数据
把A原表的10000条记录一次性同步到B表:-- 在A服务器执行 INSERT INTO export_transaction_sync SELECT * FROM export_transaction;
关键注意事项
- 性能影响:行级触发器会在每次变更时发起跨网络请求,低到中并发场景可正常使用;高并发场景下可能增加A服务器延迟,需结合业务量级评估。
- 权限配置:确保A服务器用来连接B的MySQL账号,拥有B服务器
proddb.export_transaction表的增删改权限。 - 故障容错:若B服务器不可用,默认情况下A的触发器操作会失败,导致原表变更无法提交。可在触发器中添加
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION忽略错误,但会引发数据不一致,需根据业务容忍度选择。
内容的提问来源于stack exchange,提问作者gobsidian
相关产品推荐
相关产品推荐

