pt-osc 执行流程
地址 https://github.com/percona/percona-toolkit/tree/3.x/bin 使用文档
详细执行流程如下:
- 相关环境参数检查
- 检查该表格是否存在
- show create table tbosc
- create table _tbosc_new
- alter table _tbosc_new
- 创建删除触发器 pt_osc_dbddl_tbosc_del (如果数据修改的时候,还没有拷贝过来,修改后再拷贝则是覆盖,正确;如果是已经拷贝过来,再修改,也是正确,这里同时会检查是否具有主键或者唯一索引,如果都没有,这一步会报错,提示The new table
dbosc._tbosc_newdoes not have a PRIMARY KEY or a unique index which is required for the DELETE trigger.) - 创建更新触发器 pt_osc_dbddl_tbosc_upd
- 创建插入触发器 pt_osc_dbddl_tbosc_ins
- 按块拷贝数据到新表,拷贝过程对数据行持有S锁
- analyze 新表
- rename 表名,RENAME TABLE
dbddl.tboscTOdbddl._tbosc_old,dbddl._tbosc_newTOdbddl.tbosc - 删除旧表
- 删除新表上的删除、更新、插入 触发器
如果有表存在会新建表
failed to find a unique new table name after 10 attemps. the following tables exist which may be left over from previous failed runs of the tool:
`test_db`.`_big_table_new`
`test_db`.`__big_table_new`
`test_db`.`___big_table_new`
`test_db`.`____big_table_new`
`test_db`.`_____big_table_new`
`test_db`.`______big_table_new`
`test_db`.`_______big_table_new`
`test_db`.`________big_table_new`
`test_db`.`_________big_table_new`
`test_db`.`__________big_table_new`
examine these tables and drop some or all of them if they are no longer need, then re-run the tool.
https://deepwiki.com/percona/percona-toolkit/2.1-pt-online-schema-change
您询问的是 pt-online-schema-change 的变更流程。这是 Percona Toolkit 中用于在线修改 MySQL 表结构的核心工具,位于 bin/pt-online-schema-change 文件中。
变更流程概述
pt-online-schema-change 采用四阶段的非阻塞式架构来执行表结构变更:
第一阶段:设置阶段 (Setup Phase)
工具首先创建影子表并设置 DML 触发器:
- 创建新表:基于原表结构创建影子表,应用指定的 ALTER 语句
- 创建触发器:在原表上创建 INSERT、UPDATE、DELETE 触发器来捕获变更
- 安全检查:验证权限、磁盘空间、复制状态等 1
第二阶段:数据复制阶段 (Copy Phase)
使用 nibble-based 分块复制机制:
第三阶段:同步阶段 (Sync Phase)
应用捕获的变更并验证一致性:
- 应用变更:将触发器捕获的变更应用到新表
- 验证一致性:确保新表数据与原表一致
- 复制延迟检查:通过
ReplicaLagWaiter确保复制不会过度延迟
第四阶段:原子交换阶段 (Swap Phase)
执行快速的表重命名操作:
- 短暂锁定:获取表级锁
- 原子重命名:使用
RENAME TABLE原子性地交换表名 4 - 清理工作:删除触发器和旧表
关键安全机制
工具包含多层安全保护:
- 外键处理:自动处理外键约束的重建和重命名 5
- 复制监控:持续监控复制延迟,超过阈值时自动暂停
- 集群支持:特别支持 Percona XtraDB Cluster 环境 6
- 错误恢复:提供
--resume功能支持中断后恢复 7
执行示例
典型的执行命令如下: 8
pt-online-schema-change --execute --alter 'ADD COLUMN foo INT' D=database,t=table
Notes
该工具的设计重点是最小化停机时间和对生产环境的影响。通过分阶段处理和多重安全检查,确保即使在大表上也能安全地执行结构变更。测试套件覆盖了各种场景,包括活跃表变更、外键处理、字符集变更等复杂情况。
Wiki pages you might want to explore:
- Percona Toolkit Overview (percona/percona-toolkit)
- pt-online-schema-change (percona/percona-toolkit)
同步阶段一致性验证机制
在 pt-osc 的同步阶段,工具主要通过以下方式验证新表与原表的数据一致性:
1. 行数据对比验证
测试代码显示了核心的一致性验证逻辑: 1
工具会对原表和新表执行相同的查询,然后逐行比较结果: 2
2. CHECKSUM 表验证
在更复杂的验证场景中,工具使用 MySQL 的 CHECKSUM TABLE 命令来验证整表数据的一致性: 3
这种方法通过计算表的校验和来快速检测数据差异,比逐行对比更高效。
3. 触发器状态验证
同步阶段还会验证触发器的状态,确保数据捕获机制正常工作: 4
4. 最大 ID 值验证
工具还会验证主键的最大值是否一致,确保没有数据丢失: 5
5. 复制延迟监控
在同步过程中,工具持续监控复制延迟,确保从库不会过度滞后: 6
验证失败处理
如果一致性验证失败,工具会:
- 停止操作:立即停止当前的变更过程
- 保留状态:保留新表和触发器以便调试 7
- 错误报告:提供详细的错误信息说明不一致的具体内容
Notes
pt-osc 的一致性验证是多层次的,包括数据内容、行数、校验和等多个维度。这种全面的验证机制确保了在线变更过程中数据的完整性和一致性。测试套件中的验证逻辑反映了生产环境中实际使用的验证方法。
Wiki pages you might want to explore: