全部产品
云市场

无锁数据变更

更新时间:2019-08-18 22:53:50

需求背景

  • 由于业务的持续发展累积了大量数据,在数据库磁盘空间和数据库性能的权衡考虑下需要对在线数据与历史数据进行分隔管理,或定期一次性清除大量表中的数据。常见的现象是:

    • 1.单条SQL影响行数非常多(会出现日志超过参数阀值而执行失败造成回滚)
    • 2.SQL不走索引(会导致锁表,增加数据库负载甚至引起业务故障)
  • 举例:清理历史数据

    • 删除SQL:
      • delete from base_exp_log where gmt_create<’2018-01-01’
    • 删除信息:
      • base_exp_log这个表大小76GB,总行数2亿多,现在要删除2018年以前的数据(占比可能60%),gmt_create字段上并没有索引
    • 变更风险:
      • 1、如果使用上面的SQL删除数据,肯定会长时间锁表(gmt_create字段没有索引,影响数据非常多),导致期间业务不可写数据;
      • 2、即使业务允许长时间锁表,还是有可能会失败,因为数据库会对单条SQL产生的bin_log有大小限制,删除这么大量的数据,产生的日志大小会超过该阈值,最终还是会失败!(通常的见到的报错信息:“Multi-statement transaction required more than ‘max_binlog_cache_size’ bytes ofstorage”)
  • 当然除了清理历史数据,还有其他业务需求,比如无索引更新大量数据,也会存在上面所有的风险!

  • 在这之前遇到此类问题,通常都会想到分批执行,解决办法有以下两种:

    • 1、研发同学自己写程序分批做
    • 2、DBA提取目标数据手动拆分,分批执行
  • 这两种方式的风险,都非常大:

    • 1、对于研发同学来说,并不是每个研发都能知道潜在的风险!
      • 如果分批的方式不当(比如直接用limit分批,可能仍然会锁表)、分批执行的频率没有很好控制(造成主备延迟多大),都会对数据库造成影响,进而影响业务!
    • 2、对于DBA来说,人工拆分非常繁琐,工作量非常大,还容易出错,并且很难动态调整一些信息(比如分批的大小、sleep的时间等)
  • 基于此,DMS企业版目前需要将【无锁数据变更】,做成一个通用功能,来更好地满足业务方对大量数据变更的需求(比如:历史数据清理、全表更新字段等),同时会注重执行效率、以及对数据库性能、数据库空间等的影响,做到不影响业务。

步骤

  • 1.产品页内左侧导航栏数据变更-无锁数据变更工单

    入口

  • 2.填写表单(可参考数据变更-步骤2的填写表单)

    • 1)这里的脚本是原始SQL,不需要拆分,最终执行时,系统会自动拆分;
    • 2)这里也支持选择逻辑库,提交脚本时,直接将表名替换为逻辑表名即可;
    • 3)目前支持的SQL类型仅UPDATE、DELETE、INSERT…SELECT,其中UPDATE、DELETE仅支持单表更新
    • 4)目前仅支持MySQL INNODB引擎
  1. ![提交工单](http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/pic/96145/cn_zh/1541490144086/Snip20181106_32.png)
  • 3.提交申请

    • 预检查通过后,即可按需提交审批

      提交审批

  • 4.确认提交

    • 对变更脚本信息进行二次汇总确认后可提交进入审批环节

      确认

  • 5.审批

    • 【无锁数据变更】工单对应的审批流程为数据库目标实例对应的【安全规则】-【数据变更】-是否允许DML

      • 允许,小于一个阀值/大于一个阀值,指定审批流程===》工单可以提交成功,需要完成审批后方可执行
      • 允许,小于一个阀值/大于一个阀值,不指定审批流程===》不需要审批即可执行
      • 关闭===》工单可提交成功,但不能提交审批不能做后续的执行
    • 审批流程节点人员可按需自定义组合,最细到一个实例级别可控

      安全规则

      审批

  • 6.执行变更

    • 在审批通过之后,可按需定义执行时间

      • 默认需要指定具体开始的时间,也可以选择立即执行;
      • 默认需要指定结束时间,也可取消指定即任务执行完自动结束(若指定结束时间,在时间到达后还未完成的更新将会终止不再发起;主要规避在业务高峰期到来时减少额外影响)

      提交执行

      确认

  • 7.任务调度

    • 立即执行的任务会进行即刻调度,定时执行的任务会在指定时间点再进行调度

      • 每扫描1W行需要更新的数据后,会sleep暂停0.5s
      • 默认每一批以主键或唯一键进行更新,初始值为1000条记录,若还是失败则会自动降低阀值;执行直至没有满足条件的数据后完成更新

      调度

  • 8.查看详情

    • 执行完成后或执行出现失败等需要,可以点击调度列表的查看详情查看具体每个SQL的执行情况

      执行成功

      查看详情

注:

  • 1.无锁数据变更的执行不支持事务指定、不支持变更前镜像的备份处理
  • 2.无锁数据变更暂不支持工单的快速复制,即暂无“类似创建”功能

使用tips

  • 1.工单提交后会后台异步进行校验,若校验通过才可提交审批,若校验不通过则可按需申请权限、修改脚本等方式后重新检测直至校验通过
  • 2.仅工单参与人、DBA、管理员可打开工单查看,若非工单参与人想查看工单,可联系创建者编辑相关人(工单内顶部-【提交工单】信息模块内操作)
  • 3.工单的完整操作日志(工单内顶部-【提交工单】信息模块内)可按需查看操作历史