pt-osc 执行流程

地址 https://github.com/percona/percona-toolkit/tree/3.x/bin 使用文档

详细执行流程如下:

  1. 相关环境参数检查
  2. 检查该表格是否存在
  3. show create table tbosc
  4. create table _tbosc_new
  5. alter table _tbosc_new 
  6. 创建删除触发器 pt_osc_dbddl_tbosc_del (如果数据修改的时候,还没有拷贝过来,修改后再拷贝则是覆盖,正确;如果是已经拷贝过来,再修改,也是正确,这里同时会检查是否具有主键或者唯一索引,如果都没有,这一步会报错,提示The new table dbosc._tbosc_new does not have a PRIMARY KEY or a unique index which is required for the DELETE trigger.)
  7. 创建更新触发器 pt_osc_dbddl_tbosc_upd
  8. 创建插入触发器 pt_osc_dbddl_tbosc_ins
  9. 按块拷贝数据到新表,拷贝过程对数据行持有S锁
  10. analyze 新表
  11. rename 表名,RENAME TABLE dbddl.tbosc TO dbddl._tbosc_old, dbddl._tbosc_new TO dbddl.tbosc
  12. 删除旧表
  13. 删除新表上的删除、更新、插入 触发器

如果有表存在会新建表

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 触发器:

  1. 创建新表:基于原表结构创建影子表,应用指定的 ALTER 语句
  2. 创建触发器:在原表上创建 INSERT、UPDATE、DELETE 触发器来捕获变更
  3. 安全检查:验证权限、磁盘空间、复制状态等 1

第二阶段:数据复制阶段 (Copy Phase)

使用 nibble-based 分块复制机制:

  1. 分块处理:通过 TableNibblerNibbleIterator 将大表分成小块处理
  2. 增量复制:每次复制一个 chunk 的数据到新表 2
  3. 并发控制:同时触发器捕获原表上的实时变更 3

第三阶段:同步阶段 (Sync Phase)

应用捕获的变更并验证一致性:

  1. 应用变更:将触发器捕获的变更应用到新表
  2. 验证一致性:确保新表数据与原表一致
  3. 复制延迟检查:通过 ReplicaLagWaiter 确保复制不会过度延迟

第四阶段:原子交换阶段 (Swap Phase)

执行快速的表重命名操作:

  1. 短暂锁定:获取表级锁
  2. 原子重命名:使用 RENAME TABLE 原子性地交换表名 4
  3. 清理工作:删除触发器和旧表

关键安全机制

工具包含多层安全保护:

  • 外键处理:自动处理外键约束的重建和重命名 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:

同步阶段一致性验证机制

在 pt-osc 的同步阶段,工具主要通过以下方式验证新表与原表的数据一致性:

1. 行数据对比验证

测试代码显示了核心的一致性验证逻辑: 1

工具会对原表和新表执行相同的查询,然后逐行比较结果: 2

2. CHECKSUM 表验证

在更复杂的验证场景中,工具使用 MySQL 的 CHECKSUM TABLE 命令来验证整表数据的一致性: 3

这种方法通过计算表的校验和来快速检测数据差异,比逐行对比更高效。

3. 触发器状态验证

同步阶段还会验证触发器的状态,确保数据捕获机制正常工作: 4

4. 最大 ID 值验证

工具还会验证主键的最大值是否一致,确保没有数据丢失: 5

5. 复制延迟监控

在同步过程中,工具持续监控复制延迟,确保从库不会过度滞后: 6

验证失败处理

如果一致性验证失败,工具会:

  1. 停止操作:立即停止当前的变更过程
  2. 保留状态:保留新表和触发器以便调试 7
  3. 错误报告:提供详细的错误信息说明不一致的具体内容

Notes

pt-osc 的一致性验证是多层次的,包括数据内容、行数、校验和等多个维度。这种全面的验证机制确保了在线变更过程中数据的完整性和一致性。测试套件中的验证逻辑反映了生产环境中实际使用的验证方法。

Wiki pages you might want to explore: