You need to enable JavaScript to run this app.
文档中心
数据库工作台

数据库工作台

复制全文
下载 pdf
故障排查
在无锁结构变更工单的预检查中,若遇到“检测到您的无锁变更任务,执行时将会存在部分隐患,如因数据重复带来的数据丢失等”的提示,该如何处理?
复制全文
下载 pdf
在无锁结构变更工单的预检查中,若遇到“检测到您的无锁变更任务,执行时将会存在部分隐患,如因数据重复带来的数据丢失等”的提示,该如何处理?
您需要根据以下提示操作:
  1. 在创建数据变更工单控制面板,单击 Online DDL 添加唯一键结果详情列的立即处理
  1. 添加索引检查对话框,选择任务执行方式,取值如下:
  • 无锁执行:通过外部工具创建影子表来模拟变更,兼容性高但耗资源,需确保磁盘空间大于等于当前表的大小,适用于表数量较大超过 1GB 或 100 万行的场景。
  • 原生执行:直接在目标表上执行 ALTER TABLE 语句,效率更高但依赖版本,适用于 MySQL 5.6 及以上版本且表数量较少的场景。
建议您在业务低峰期执行,以降低对线上服务的潜在影响。关于任务执行方式的详细信息,请参见执行方案简介
执行方案简介
在为数据库表添加唯一索引时,系统提供两种执行方案。您可以根据表的数据量、业务高峰期以及对稳定性的要求,选择最适合的方案。下文将介绍这两种执行方案的简介和区别,以便您选择合适的方案。
注意事项
无论选择哪种方案,在执行添加唯一索引操作前,请务必完成以下检查,否则会导致任务失败:
  1. 排查重复数据:唯一索引要求字段值具有唯一性。若表中已存在重复数据,两种方案均会报错或中止。请提前在目标数据库实例中执行以下 SQL 语句进行确认不存在重复数据:
SELECT 目标列, COUNT(*) AS cnt
FROM 你的表名
GROUP BY 目标列
HAVING cnt > 1;
  1. 评估资源:选择无锁执行(gh-ost 在线变更)方案时,请确保磁盘剩余空间不小于当前表的大小。
  1. 选择窗口期:建议在业务相对低峰期进行操作,以最大程度降低对线上服务可能产生的潜在影响。
方案简
维度
无锁执行(gh-ost 在线变更)
原生执行(Online DDL)
适用场景
大表变更(> 100 万行或 > 1GB)、业务高峰期、不允许阻塞读写、需要随时暂停或中止变更任务。
小表变更(< 100 万行且 < 1GB)、业务低峰期、追求快速完成、磁盘空间有限。
核心原理
gh-ost 是一款无触发器的在线表结构变更工具。该工具通过影子表机制,在不影响原表正常读写的情况下完成结构变更,具体步骤如下:
  1. 创建影子表:在同库下创建一张结构相同的空表,并应用目标 DDL,例如添加唯一索引。
  1. 全量数据迁移:分批将原表数据拷贝至影子表。
  1. 增量数据同步:模拟 MySQL 从库解析 Binlog,实时将原表变更同步到影子表,确保数据最终一致。
  1. 原子切换(Cut-over):数据追平后,通过毫秒级的 RENAME TABLE 操作将原表与影子表互换。
  1. 清理:自动删除或保留旧表。
直接在原表上执行 ALTER TABLE 语句。
MySQL 5.6 及以上版本引入的 Online DDL 机制(通常采用 INPLACE 算法)会在 InnoDB 引擎内部原地构建索引,并在执行期间通过 Online log 记录增量变更,最后在提交阶段短暂锁表应用变更。
方案优势
  • 对业务影响极低:变更过程中原表始终保持正常的读写能力,完全不会阻塞线上的 DML 操作。
  • 可暂停、可中止:支持在迁移过程中随时暂停或取消任务,且不会对原表造成任何负面影响。
  • 无触发器依赖:不同于 pt-osc 使用触发器的机制,该方案避免了触发器带来的性能开销和锁竞争风险。
  • 数据校验充分:迁移完成后,支持在最终切换前进行数据一致性校验,确认无误后再执行 cut-over。
  • 支持限流控制:允许配置迁移速度,从而避免对主库造成过大的 I/O 和 CPU 压力。
  • 极简操作,零额外依赖:仅需执行一条标准 SQL 即可完成变更,无需引入任何第三方工具或搭建复杂的运维流程。
  • 原地执行,效率极高:采用 INPLACE 算法原地构建索引,无需全表拷贝数据,在常规场景下执行速度通常远超 gh-ost 等在线变更工具。
  • 极低磁盘开销:无需创建影子表,磁盘空间的增量占用仅限于新索引本身的大小,资源利用率极高。
  • 原生原子性保障:依托 MySQL 内部机制严格保证 DDL 的原子性,操作要么完全成功,要么完全回滚,杜绝中间状态。
潜在劣势
  • 性能瓶颈:全表拷贝导致大表迁移耗时极长。
  • 空间开销:影子表机制使磁盘占用在迁移期翻倍。
  • 数据风险:原表若含重复数据,会导致迁移中途因唯一键冲突而失败。
  • 依赖限制:强依赖 MySQL binlog_format=ROW 配置。
  • 运维成本:涉及多阶段操作(建表/迁移/解析/切表),流程繁琐。
  • 不可中止:中途无法安全取消,强制中断会导致长时间回滚。
  • 锁表风险:MDL 锁等待易阻塞全表读写,引发连接数暴涨。
  • 大表高危:超长执行周期内,任何异常都可能导致失败与长时间回滚。
  • 容错率低:遇重复数据直接报错失败,前期时间成本全部浪费。
  • 无法限流:I/O 开销不可控,严重影响线上查询性能。
流程图
方案对比与选择建议
维度
无锁执行 (gh-ost)
原生执行 (Online DDL)
执行方式
  1. 创建影子表。
  1. 迁移数据。
  1. 原子切换。
直接在原表执行 ALTER TABLE。
业务影响
极小。全程不阻塞读写操作。
存在 MDL 锁等待风险,可能短暂阻塞。
执行速度
较慢。需拷贝全量数据。
较快。原地构建索引。
磁盘开销
高。需额外约 1 倍表空间。
低。仅需索引大小空间。
可控性
支持暂停、中止、限流。
不可中止,无法限流。
推荐场景
大表、业务高峰期、高稳定性要求。
小表、业务低峰期、追求效率。
最近更新时间:2026.06.02 14:20:56
这个页面对您有帮助吗?
有用
有用
无用
无用