由于老系统满足不了业务需求,因此需要开发新系统,并且使用新的语言和架构,老系统的数据库数据肯定是不能弃掉,需要平滑迁移。而且还由于老系统的开发人员不在和严重不足,无法配合新旧系统迁移。基于这个环境有以下方案。
分为两部分:静态数据的数据迁移和动态数据的数据同步。
历史数据迁移
数据迁移部分,主要完成的是静态数据,可以理解为历史数据的迁移,实际业务不要求很高的实时性,有很多方案,比如使用新旧库中的中间表,copy表,停机迁移、使用迁移工具sqlload等。可以线下调试完毕,然后上线,也可以在用户访问低峰期访问只读库的方式迁移。网上有很多方案,在这里不再赘述。
实时数据同步
现状最大的问题是,我们的老系统没有人维护,只能是新系统驱动的模式进行mapping。但是业务的实时性还得保证。因此提出使用以下方案保证实时性。
- 创建实时同步表
DDL如下
CREATE TABLE `table_action_log` (
`id` bigint(22) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`table_name` varchar(100) DEFAULT NULL COMMENT '被操作表名称column_value',
`table_id_value` bigint(100) DEFAULT NULL COMMENT '设定的被比对的列值,最好是主键',
`action_type` tinyint(1) DEFAULT NULL COMMENT '操作类型(1、insert 2、update 3、delete)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
具体里面有备注,这个表记录的是各个表的操作明细,insert,update,delete操作。
- 为每个需要实时同步的表增加触发器,记录修改记录
插入
CREATE DEFINER=`root`@`%` TRIGGER `insert` AFTER INSERT ON `t_order` FOR EACH ROW
BEGIN
INSERT INTO
table_action_log
(table_name,table_id_value,`action_type`)
VALUES
("t_order",new.id,1);
END;
更新
CREATE DEFINER=`root`@`%` TRIGGER `update` AFTER UPDATE ON `t_order` FOR EACH ROW BEGIN
BEGIN
INSERT INTO
table_action_log
(table_name,table_id_value,`action_type`)
VALUES
("t_order",new.id,2);
END;
删除
CREATE DEFINER=`root`@`%` TRIGGER `delete` AFTER DELETE ON `t_order` FOR EACH ROW
BEGIN
INSERT INTO
table_action_log
(table_name,table_id_value,`action_type`)
VALUES
("t_order",old.id,3);
END;
- 在新系统中建立定时同步任务,每隔30秒(看公司对实时性的要求进行自己设定)进行mapping业务逻辑。
通过以上三步,相信大家也对这个同步方法有一个了解了,就是通过需要实时同步的表建立触发器的方式,把修改过的表以及字段保存table_action_log中,然后根据该log进行实时同步,避免了扫库。
以上为自己的一点心得,如果有什么不合理的地方,欢迎大家指正,或者大家有什么更好的方案,请指教。