触发器迁移数据和Oracle 物化视图(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,关闭旧业务程序,在目标库手动执行同步刷新直至同步日志表无新记录生成,启动新业务程序,以达到对业务系统影响最小的效果。

转载于:https://blog.51cto.com/8858975/1784753

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

  1. 亿级大表分库分表实战总结(万字干货,实战复盘)

    亿级大表分库分表实战总结(万字干货,实战复盘) 以下文章来源于阿丸笔记 ,作者阿丸笔记 阿丸笔记 分库分表的文章网上非常多,但是大多内容比较零散,以讲解知识点为主,没有完整地说明一个大表的切分.新架构 ...

  2. 千万级大表如何更快速的创建索引_分享一份生产环境mysql数据库大表归档方案,值得收藏...

    概述 分享下最近做的一个mysql大表归档方案,仅供参考. 整体思路 一.明确哪些大表需做归档 1.数据库表概要信息统计 SELECTt1.table_schema,t1.table_name,`EN ...

  3. kafka跨库同步mysql表_canal实时同步mysql表数据到Kafka

    准备 对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下 [mysqld] log-bin=mysql-bin ...

  4. 万字长文详解大数据应用实战案例-万亿级大数据监控平台建设方案

    前言 随着互联网业务的迅速发展,用户对系统的要求也越来越高,而做好监控为系统保驾护航,能有效提高系统的可靠性.可用性及用户体验.监控系统是整个运维环节乃至整个项目及产品生命周期中最重要的一环.百分点大 ...

  5. mysql latid1_【转】mysql触发器的实战经验(触发器执行失败,sql会回滚吗) | 学步园...

    1   引言Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序.触发器是mysql5新增的功能,目前线上凤巢系统.北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多程 ...

  6. sql server 触发器实时同步数据库表数据

    sql server 触发器实时同步数据库表数据 创建两个相同结构的数据库表 CREATE TABLE [dbo].[Table_1]([id] [varchar](50) NOT NULL,[nam ...

  7. 生产环境实战spark (5)分布式集群 5台设备之间hosts文件配置 ssh免密码登录

    生产环境实战spark (5)分布式集群 5台设备之间 ssh免密码登录 之前已经在master节点单台设备上配置ssh免密码的登录工作,现在要做的事情是在5台设备之间实现ssh免密码操作.我在整个大 ...

  8. 2022年危险化学品生产单位安全生产管理人员操作证考试题库及答案

    题库来源:安全生产模拟考试一点通公众号小程序 2022危险化学品生产单位安全生产管理人员上岗证题库为危险化学品生产单位安全生产管理人员试卷全真模拟题!2022年危险化学品生产单位安全生产管理人员操作证 ...

  9. 【kafka实战】分区重分配可能出现的问题和排查问题思路(生产环境实战,附视频)

    超强!!! Kafka高质量专栏学习大全,点我获取!!! 文章目录 前提 所有异常情况 1. TargetBroker若不在线,迁移脚本执行会失败 情景演示 2. TargetBroker在开始迁移过 ...

最新文章

  1. 【硬件】运放的那些事儿
  2. .NET零基础入门之01:开篇及CSharp程序、解决方案的结构
  3. 蚂蚁科技 Service Mesh 落地实践与挑战
  4. 扩展语法检查(SLIN检查)
  5. 实体词典 情感词典_人工智能技术落地:情感分析概述
  6. 廖雪峰JavaScript学习笔记(基础及数据类型、变量)
  7. Qt数字与字符串之间的相互转换
  8. css属性基础以及wxss——居中,渐变色边框,圆角边框,横向布局,重叠div,div固定在底部,input的无边框显示下划线
  9. 网上订单管理-新增、修改
  10. html 导航栏跟着动_“跟着导航来,现在不敢动!”浙江深山男游客吓坏,4岁儿子冻得直跺脚...
  11. listview mysql源码_用ListView实现对数据库的内容显示
  12. mysql 表的存储类型_MySQL的表类型和存储引擎
  13. 网站左边栏制作的小技巧
  14. SPSS实现重复测量方差分析
  15. 单片机之矩阵键盘(花样编程)
  16. Excel合并单元格中间插入斜杠和数字保留一位小数
  17. 工作经验应该这么写,有模板哦!
  18. python有趣小程序 表白-python表白小程序
  19. linux下tomcat查看端口
  20. git rebase的两种用法(最全)

热门文章

  1. C++程序设计:原理与实践(进阶篇)15.4 链表
  2. .net IntPtr ==interoperable pointer
  3. 输出10000以内的第M到第N个素数(Eclipse gcc下)
  4. 百度 合肥地区 软件研发工程师 笔试题
  5. keepalived实现双机备份
  6. SQL 的 left join 和 right join
  7. influxDB集群模式实践
  8. 浅析ElasticSearch原理
  9. ZooKeeper(二) idea中使用Java操作zookeeper
  10. MySQL数据库常用的操作命令(一)