[生产库实战] 如何使用触发器对生产库上亿级大表进行实时同步

触发器迁移数据和MV的原理相同,通过在源表创建Trigger,记录源表的DML操作日志,然后通过存储过程同步DML受影响的记录,达到目标表和源表数据一致的效果。此方法只是对Prebuilt
MV操作的一个补充。物化视图/在线重定义对DML频繁的大表进行处理时,存在一个弊端,主要是在全量初始化这个步骤上,比如:
本应该多块扫描,直接路径读效率很高的,但由于个别数据块在内存造成单块读;
或由于DML操作相对频繁,可能读到的数据需要与undo构造一致性读数据块的几率也较高,此时查看等待事件都是采用单块读方式,从表面现象来看刚开始同步时同步速度很快,越到后面越慢,最终无法快速完成或出现快照过旧问题。当然,在DML频繁的表上创建Trigger,会源表的DML性能造成影响,需要提前评估。对于一些小表的同步,仍然建议使用Prebuilt
MV,原因简单方便,此思想也适合于其他数据库。

本示例实现目标:

将源端
user01.user_table 表数据迁移至目标端 user02.user_table,并实现目标端数据与源端数据定期实时的数据一致性同步。若进行业务迁移,对业务影响控制在1分钟时间内并,选择合适的时间点切换,基本可以做到重启应用程序所需时间,换句话说就是对业务的影响取决于应用程序的重启时间。

   数据库源 端:业务数据库1

数据库目标端业务数据库2

源   端 user01.user_table表:
   
表大小:60GB+,记录数:4.8亿+,每天DML量:200W左右,晚上22点后至第二天早上8点DML量较少,此时间段为空闲时间段,可在此时间段做初始化操作;
  
采用user_id做hash分区,分区数:16,主键字段:user_id+serviceid,唯一索引字段:uin+serviceid;

 目标端 user02.user_table表:
   
采用uin做hash分区,分区数:64,主键字段:uin+serviceid,唯一索引字段:user_id+serviceid(目前生产库上依据业务情况,已不用该索引查询)。

限制:

      1、源表需要有主键或者非空的唯一约束;
      2、在同步期间,不支持对源表做DDL操作(注: 可以改进代码达成支持DDL的效果);
     
3、DML频繁的表不适合,可能会导致增量跟不上(注:没标准,取决于数据库性能)。

 实施步骤简要说明:

       注:红色字体为目标端操作,绿色字体为源端操作。

1、创建目标表:user02.user_table,并打开行移动(alter table
user02.user_table enable row
movement;),源端会对uin进行update,暂且不创建索引,待全量同步完成后创建索引,以免影响全量同步速度;
       2、创建同步状态表(user02.rep_table_flag),用于记录同步存储过程运行状态;
       3、创建错误日志表(user02.os_err_info)及序列(user02.seq_os_err_info
注:如果计划该表是和业务系统共用,请建成范围分区表);
       4、创建同步日志表(user01.user_table_rep_sync_log)及序列(user01.seq_user_table_rep_sync_log),用于记录源表的DML操作信息;
       5、创建触发器(user01.trigger_user_table_rep),将捕获的到信息插入日志同步表(注:创建触发器在改业务表空闲时间段进行,减少DML日志量生产,并对业务影响较小,并且一定要在全量同步前创建);
      
6、创建目标库连接源数据库的dblink(TO_XXXXX.LOCALDOMAIN),并且对同步同步表user01.user_table_rep_sync_log有DML权限;
       7、创建增量数据同步存储过程(user02.proc_user_table_repl);
       8、全量同步源表数据至目标表,如:exp/imp、impdp无落地迁移、存储过程拉数据等均可,本示例采用存储过程拉数据;
       9、为目标表创建主键及相关索引;
      10、以上完成后在目标库执行数据同步存储过程(user02.proc_user_table_repl),可建job定时刷新;
      11、监控同步日志表(user01.user_table_rep_sync_log),观察需要同步的数据量。

如果做业务系统割接则需要业务程序配合,监控需要同步的数据量在刷新间隔时间期间最少时,停止定时刷新job,关闭旧业务程序,在目标库手动执行同步刷新直至同步日志表无新记录生成,启动新业务程序,以达到对业务系统影响最小的效果。

时间: 2024-11-08 01:27:28

[生产库实战] 如何使用触发器对生产库上亿级大表进行实时同步的相关文章

JAVA架构师大型分布式高并发电商项目实战,性能优化,集群,亿级高并发,web安全,缓存架构实战

现任58到家技术委员会主席,高级技术总监,负责企业,支付,营销.客户关系等多个后端业务部门.本质,技术人一枚.互联网架构技术专家,"架构师之路"公众号作者.曾任百度高级工程师,58同城高级架构师,58同城技术委员会主席,58同城C2C技术部负责人. 内容介绍 1.大数据量时,数据库架构设计原则 2.数据库水平切分架构设计方向 3.用户中心,帖子中心,好友中心,订单中心水平切分架构实践 下面是58沈剑老师的演讲实录 大家好,我是58沈剑,架构师之路的小编,后端程序员一枚,平时比较喜欢写写

mysql触发器-表数据实时同步

今天遇到一个需求,是同一个实例里面的两个库中的几张表需要做单向同步,刚开始想直接使用Otter&Canal的架构去做同步.但是因为这个架构依赖的是binlog进行同步的,但是阿里云RDS对于binlog是有做定时清理操作的.所以如果用canal去通过binlog同步的话 一旦RDS的binlog 清理了 将无法同步,并且无法找回之前的数据.所以考虑到只是同步极少数的表,就用了mysql的触发器. mysql的触发器只支持行级触发器不支持语句级触发器,行级触发器又分为单行触发器以及多行触发器. 单

Netty Redis 亿级流量 高并发 实战 (长文 修正版)

目录 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -30[ 博客园 总入口 ] 写在前面 1.1. 快速的能力提升,巨大的应用价值 1.1.1. 飞速提升能力,并且满足实际开发要求 1.1.2. 越来越多.大量的应用场景 1.2. 高并发架构中的6大集群 1.2.1. 支撑亿级流量的IM整体架构 1.2.2. IM通讯协议介绍 1.2.3. 长连接和短连接 1.2.4. 技术选型 1.3. 基于Redis 设计分布式Session 1.3.1. SessionLocal本地会话

[生产库实战] 采用存储过程对生产线历史表数据进行归档

生产线历史数据归档是数据库运维的一项日常基本工作.在建表设计时,通常都将数据流水表(如:日志.用户登录历史,软件下载记录,用户属性更改历史表等)设计为范围分区表.间隔分区表(11G),当超过业务要求的保留范围时,此数据基本是静态数据且应用程序再不对其进行访问,但有可能会由于某些特殊要求需要手动查询.在这个情况下,都将其数据从生产库归档至历史库,并对其进行压缩保存,如果超出特殊要求查询的范围,那就直接将其导出压缩备份到磁带. 在Oracle数据库中,用做表数据归档操作的方法很多,如:exp/imp

屌炸天实战 MySQL 系列教程(四)【秒杀七年经验 LowB工程师】 主从复制、读写分离、模拟宕机、备份恢复方案生产环境实战

第一篇:屌炸天实战 MySQL 系列教程(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:屌炸天实战 MySQL 系列教程(二) 史上最屌.你不知道的数据库操作 第三篇:屌炸天实战 MySQL 系列教程(三)你不知道的 视图.触发器.存储过程.函数.事物.索引.语句 第四篇:屌炸天实战 MySQL 系列教程(四) 主从复制.读写分离.模拟宕机.备份恢复方案生产环境实战 去年公司有一个七年PHP开发经验的工程师,想要跳槽. 去国内某知名互联网公司面试后,被虐惨了,非要我给他讲讲什么是主从

mysql 生产库大表delete

mysql 生产库大表删除 一般线上业务增长较快,造成某些表达到分表的临界值,表行数超过2000w且查询频繁,如表业务没有较多的聚合查询的话,可以考虑按时间归档部分历史数据.现推荐2种本人之前使用过的删除方式. 按照主键或者索引拆分后分段执行,使用存储过程 需要注意这种大表删除,如果是在主库执行,尽量把会话改成语句格式,以保证不会出现复制延迟 语句如下:set session binlog_format='STATEMENT'; CREATE PROCEDURE sp_delete_data()

查看当前库中所有的触发器

--查看当前库中所有的触发器: SELECT * FROM Sysobjects WHERE xtype = 'TR' --查看当前库中所有的触发器和与之相对应的表: SELECT tb2.name AS tableName,tb1.name AS triggerName FROM Sysobjects tb1 JOIN Sysobjects tb2 ON tb1.parent_obj=tb2.id WHERE tb1.type='TR' --显示触发器的定义: EXEC sp_helptext

.NET跨平台之旅:生产环境中第2个跑在Linux上的ASP.NET Core站点

今天我们在生产环境中上线了第2个跑在Linux上的ASP.NET Core站点.这是一个简单的Web API站点,通过命令行的方式调用安装在Linux服务器上的程序完成操作.之前用的是nodejs,现在换成了ASP.NET Core,主要代码如下: var psi = new ProcessStartInfo(command, arguments) { RedirectStandardOutput = true, RedirectStandardInput = true, CreateNoWin

组件化-动态库实战

http://www.cocoachina.com/articles/19136 组件化-动态库实战 sasukeo·2017-04-27阅读数 22643 本文来自南栀倾寒,作者 sasukeo 起因 理论功底 动态库和静态库 介绍 静态库和动态库的区别 举个例子, iOS 项目中使用 Embeded Framework 静态库和动态库如何构建和加载 静态库和动态库依赖关系 Xcode 项目结构 iOS 依赖管理事实上的标准 解决问题 制作动态库 剖析下动态库 Framework 吧 回过头来