pt-online-schema-change 使用解析

pt-online-schema-change是一种用于在线修改MySQL表结构的工具。它在ALTER操作期间支持DML,通过创建新表、拷贝数据、触发器同步及rename实现,期间会考虑从库延迟和服务器负载。在执行期间,它对数据库锁的影响减至最低,但会占用大量IO和CPU资源。使用前需确保表有主键或唯一索引,且注意相关环境准备、语法和选项设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 本文简单介绍 pt-online-schema-change 工具。

 

1 原理介绍

    表格必须带有主键或者唯一索引!!

    假设现有tbosc需要做ALTER操作,使用pt-online-schema-change的时候,根据tbddl表结构及索引情况,创建一个新的空表_tbosc_new,然后从原始表格 tbosc 中拷贝数据到新的表格 _tbosc_new,copy data结束后,使用_tbosc_new替换tbddl,同时,删除旧表。

 

     简单流程如上描述,那么详细流程是怎么样的呢?

     带着这几个问题来了解:

  • ALTER操作期间,表格是否支持DML?
  • 如果支持DML,是如何把DML同步到新的临时表上?
  • 整个操作流程锁情况是怎么样的?
  • 执行期间有什么性能影响?
  • 该工具有什么限制情况?

1.1 详细执行流程

    如何查看其详细的执行流程呢?数据库开启general log,然后执行pt-online-schema-change,它对数据库的所有操作,就都呈现在眼前。

     详细执行流程如下:

  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. 删除新表上的删除、更新、插入 触发器

1.2 问题解答

   根据其执行流程,可以对一开始的提问一 一来解答。

  • ALTER操作期间,表格是否支持DML?
    • ALTER过程采用Copy Table To New Table的方式,新建一个表格,然后在原表上创建3个触发器:DELETE\UPDATE\INSERT触发器,一旦新表,拷贝数据到新表的过程中,如果原表数据发生变化,则会通过触发器更新到新表上。
    • 如果支持DML,是如何把DML同步到新的临时表上?
    • ALTER过程采用Copy Table To New Table的方式,新建一个表格,然后在原表上创建3个触发器:DELETE\UPDATE\INSERT触发器,一旦新表,拷贝数据到新表的过程中,如果原表数据发生变化,则会通过触发器更新到新表上。
    • INSERT原表的时候,触发器根据其主键ID把新纪录INSERT到新表上;
    • UPDATE原表的时候,触发器根据其主键ID判断新旧ID是否一致,如果一致则删除,然后在REPLACE INTO新纪录到新表
    • DELETE原表的时候,触发器根据其主键ID直接删除行记录
    • 如果数据修改的时候,还没有拷贝到新表,修改后再拷贝,虽然重复覆盖,但是数据也没有出错;如果是数据已经拷贝,原表发生修改,这时触发器同步修改数据,两种情况下都保证了数据的一致性;
  • 整个操作流程锁情况是怎么样的?
    • 创建新表后,按照每一个chunk的大小拷贝数据到新表,每次SELECT都是share mode,带S锁,但是每个chunk都比较小,所以锁时间不大
    • 最后数据拷贝结束,会有一个rename操作,这个操作过程中,是不支持DML操作的,但其速度很快,不会造成长时间锁表情况
    • 该工具会设置该DDL操作的锁等待超时为1s,当出现异常的时候,会是ALTER操作异常,而不是其他业务操作异常,这样可以最大程度的不影响其他事务的进行
  • 执行期间有什么性能影响?
    • 总体而言,对数据库的锁影响降低到了最小,执行期间允许DML操作
    • 但是注意,任何DDL SQL在这里,都是转换成copy table to new table的形式,这个过程中,会极大占用磁盘的IO跟CPU资源,同时跟住从延时带来一定的影响,还是那句老话,重复了解DDL的影响程度后,再选择合适时机执行。
    • copy data过程中,如果主从延迟异常超过 max-lag则停止copy da
### 关于 `pt-online-schema-change` 的安装和部署 #### 工具概述 `pt-online-schema-change` 是由 Percona 公司开发的一款工具,属于 Percona Toolkit 中的一部分。该工具允许用户在不锁定数据库的情况下执行表结构调整操作[^2]。 #### 安装方法 Percona Toolkit 可通过多种方式安装,以下是常见的几种方法: 1. **基于操作系统包管理器的安装** 对于支持 APT 或 YUM 的 Linux 发行版,可以直接使用官方仓库来安装 Percona Toolkit。 使用 APT (Debian/Ubuntu) 进行安装: ```bash sudo apt-get update sudo apt-get install percona-toolkit ``` 使用 YUM (RHEL/CentOS) 进行安装: ```bash sudo yum install percona-toolkit ``` 2. **手动下载并解压二进制文件** 如果无法通过包管理器安装,则可以从 Percona 官方网站下载最新版本的压缩包,并手动解压到指定目录。 下载地址通常位于 [Percona Toolkit Downloads](https://www.percona.com/software/database-tools/percona-toolkit)[^1] 页面上。 解压命令如下: ```bash wget https://downloads.percona.com/downloads/percona-toolkit/3.4.0/binary/tarball/percona-toolkit-3.4.0.tar.gz tar -xzvf percona-toolkit-3.4.0.tar.gz cd percona-toolkit-3.4.0/bin/ chmod +x pt-online-schema-change ``` 3. **验证安装成功** 成功安装后可以通过以下命令确认工具是否存在以及其版本号: ```bash pt-online-schema-change --version ``` #### 部署配置 完成安装之后,可以根据实际需求编写脚本来调用此工具。下面是一个简单的例子展示如何运行 `pt-online-schema-change` 来更改 MySQL 表结构[^4]: ```bash pt-online-schema-change \ --user=root \ --password=your_password \ --host=localhost \ --alter "ADD COLUMN new_column INT DEFAULT NULL" \ D=database_name,t=table_name \ --nocheck-replication-filters \ --alter-foreign-keys-method=auto \ --recursion-method=none \ --print --execute ``` 上述命令中的参数解释如下: - `--user`: 数据库用户名; - `--password`: 用户密码; - `--host`: 主机名/IP 地址; - `--alter`: SQL 语句用于定义要做的变更; - `D`: 目标数据库名称; - `t`: 目标数据表名称; - `--nocheck-replication-filters`: 不检查复制过滤设置; - `--alter-foreign-keys-method`: 处理外键的方式,默认为自动处理; - `--recursion-method`: 设置递归方法,这里设为无递归; - `--print`: 打印生成的 SQL 到标准输出; - `--execute`: 实际执行变更。 #### 故障恢复机制 从 Percona Toolkit 版本 3.6.0 开始引入了一项新特性——当进程被意外中断时能够继续未完成的任务而无需重新开始整个过程[^3]。这极大地提高了长时间运行作业的安全性和可靠性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值