SQL变更 本文介绍如何提交SQL变更工单,数据管理服务DMS SQL变更功能支持INSERT、DELETE、UPDATE、DROP TABLE、TRUNCATE等SQL语句,可以对数据库中的数据进行变更操作。 前提条件 数据库类型为MySQL、PostgreSQL、DRDS、Oracle、Doris。 功能介绍 SQL变更工单是DMS工单系统中的一种类型,用于提交SQL变更语句,确保SQL语句经过工单的预检查、审批流程后才能执行,确保SQL变更操作的规范、安全和可控。 注意 基础版和企业版都支持SQL变更工单,区别在于只有企业版支持预检查和审批功能,基础版工单一经提交,会直接到执行阶段,执行时可选择手动执行或者自动执行。 操作步骤 创建SQL变更工单 1. 登录DMS控制台。 2. 在左侧导航栏,选择开发空间 > SQL变更 ,进入SQL变更管理页面。 3. 单击SQL变更按钮,弹出SQL变更工单填写界面,工单需要输入的内容说明见下表1。 4. 填写完SQL变更工单后,单击提交按钮,即完成工单的提交,进入SQL变更工单后续阶段。 表1 SQL变更工单输入内容说明 输入内容 说明 目标数据库(必填) 选择有变更权限的数据库/模式,支持MySQL、PostgreSQL、DRDS、Oracle数据源,其中MySQL、DRDS、Oracle可选择到库级别,PostgreSQL可选择到模式级别。 变更SQL(必填) 输入需要变更的SQL语句,或者上传SQL文件,上传后文件内容的语句会自动解析至文本输入框中。 开启事务 事务当前只支持MySQL和PostgreSQL类型。只有纯DML方可开启事务。 错误处理 默认为执行出错后终止,SQL执行报错后会中断后续SQL执行;勾选后为执行出错后继续,会默认跳过执行报错的SQL,继续执行后续SQL。 备份回滚 可手动开启备份回滚功能,对工单执行的DML语句进行备份回滚,支持MySQL、PostgreSQL、DRDS、Oracle数据源,其中MySQL支持binlog级别的精确备份回滚。 无锁结构变更 仅支持MySQL数据源,开启后所有表变更语句都会采用DMS无锁方式执行。 执行方式(必填) 为企业版配置,可选自动执行、手动执行和定时执行,选择自动执行,工单审批通过后立即执行;选择手动执行,工单审批通过后手动执行;选择定时执行,可指定执行时间,工单审批通过后到配置的定时时间自动执行。 最晚执行时间 选择SQL最晚执行时间,超过该时间后,即使工单已被审批通过也讲无法执行。 关联人 选择需要看到此工单的用户名,可多选,关联人可在工单列表页面查看此工单。 工单说明 描述工单备注内容。 说明 其中备份回滚功能仅支持DML语句,回滚涉及的变更数据上限为50万条,回滚脚本保存24小时,备份回滚分为普通备份和精确备份。 普通备份回滚:仅支持更新和删除语句的回滚,工单执行完成后会同步生成备份回滚文件。 精确备份回滚:支持更新、插入和删除语句的回滚,精确备份需数据库已开启Binlog,并且 需要Binlog 相关参数设置为:binlogformat ROW、binlogrowimage FULL,工单执行完成后会异步生成备份回滚文件。 其中无锁结构变更功能仅支持MySQL数据源,开启后以下参数可以修改: 自动清理临时表:勾选后每条无锁结构变更语句执行成功/失败后,都将自动删除临时表。 切表锁等待超时(s):在切表阶段,DMS需要同时给原表和临时表加锁禁写(加锁等待期间,也会阻塞表上的DML),然后实现两表的互换,该参数可以控制给表加锁的等待超时时间。时间越长,加锁成功率越高,但对业务DML影响时间越大。当表上有大事务、大查询导致频繁加锁失败时,可以酌情增加超时时间。 切表重试次数:在切换表阶段,当无法获取表的MDL锁或其它原因导致切表失败时,该参数可以控制累计重试次数。重试次数越多,切换表成功率越高,但同时短时间内频繁尝试切换表对业务的影响也会越大。 全量拷贝批次大小:在全量拷贝阶段,将原表分为N个小块逐个拷贝到临时表,该参数可以更改手动指定单次拷贝的大小。单次拷贝越大,全量拷贝的时间越短,但同时对业务的影响越大。勾选自适应,DMS根据数据库的性能,自动调整每次拷贝行数大小,兼顾速率和稳定性。 增量拷贝批次大小:在增量同步阶段,DMS 会持续回放原表执行期间产生的增量变更,将其同步到临时表。该参数用于控制单次处理增量变更的批次大小。批次越大,越有利于更快追平增量数据、降低同步延迟,但也会增加增量回放时的瞬时压力;当业务写入较频繁或实例负载较高时,建议谨慎调大。 注意 变更SQL上传文件仅支持SQL格式,最大不能超过1M。 变更SQL仅支持DDL、DML语句,单次SQL变更执行语句最多2000条。 开启无锁结构变更时,每条表变更语句都将新建临时表用于拷贝数据,请务必确保磁盘剩余空间为所有目标表之和的两倍以上,磁盘空间不足将导致实例被锁定。当开启"自动清理临时表"时,语句执行结束后会直接删除临时表,以释放磁盘空间。