数据迁移&数据同步


由于老系统满足不了业务需求,因此需要开发新系统,并且使用新的语言和架构,老系统的数据库数据肯定是不能弃掉,需要平滑迁移。而且还由于老系统的开发人员不在和严重不足,无法配合新旧系统迁移。基于这个环境有以下方案。

分为两部分:静态数据的数据迁移和动态数据的数据同步。

历史数据迁移

数据迁移部分,主要完成的是静态数据,可以理解为历史数据的迁移,实际业务不要求很高的实时性,有很多方案,比如使用新旧库中的中间表,copy表,停机迁移、使用迁移工具sqlload等。可以线下调试完毕,然后上线,也可以在用户访问低峰期访问只读库的方式迁移。网上有很多方案,在这里不再赘述。

实时数据同步

现状最大的问题是,我们的老系统没有人维护,只能是新系统驱动的模式进行mapping。但是业务的实时性还得保证。因此提出使用以下方案保证实时性。

  1. 创建实时同步表
    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操作。

  1. 为每个需要实时同步的表增加触发器,记录修改记录

插入

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;
  1. 在新系统中建立定时同步任务,每隔30秒(看公司对实时性的要求进行自己设定)进行mapping业务逻辑。

通过以上三步,相信大家也对这个同步方法有一个了解了,就是通过需要实时同步的表建立触发器的方式,把修改过的表以及字段保存table_action_log中,然后根据该log进行实时同步,避免了扫库。

以上为自己的一点心得,如果有什么不合理的地方,欢迎大家指正,或者大家有什么更好的方案,请指教。

猜你喜欢

转载自blog.csdn.net/weixin_37924923/article/details/85046210