online ddl 工具之pt-online-schema-change

本文介绍了MySQL中Percona Toolkit提供的pt-online-schema-change工具,该工具可在进行DDL操作时避免读写阻塞。文章详细解释了工具的工作原理及依赖条件,并通过实例展示了如何使用此工具进行字段添加、索引创建及字段删除。

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

 

 

MySQL ddl 的问题现状
在运维mysql数据库时,我们总会对数据表进行ddl 变更,修改添加字段或者索引,对于mysql 而已,ddl 显然是一个令所有MySQL dba 诟病的一个功能,因为在MySQL中在对表进行ddl时,会锁表,当表比较小比如小于1w上时,对前端影响较小,当时遇到千万级别的表 就会影响前端应用对表的写操作。
目前InnoDB引擎是通过以下步骤来进行DDL的:
1 按照原始表(original_table)的表结构和DDL语句,新建一个不可见的临时表(tmp_table)
2 在原表上加write lock,阻塞所有更新操作(insert、delete、update等)
3 执行insert into tmp_table select * from original_table
4 rename original_table和tmp_table,最后drop original_table
5 释放 write lock。
我们可以看见在InnoDB执行DDL的时候,原表是只能读不能写的。为此 perconal 推出一个工具 pt-online-schema-change ,其特点是修改过程中不会造成读写阻塞。
工作原理:
如果表有外键,除非使用 --alter-foreign-keys-method 指定特定的值,否则工具不予执行。
1 创建一个和你要执行 alter 操作的表一样的空表结构。
2 执行表结构修改,然后从原表中的数据到copy到 表结构修改后的表,
3 在原表上创建触发器将 copy 数据的过程中,在原表的更新操作 更新到新表.
   注意:如果表中已经定义了触发器这个工具就不能工作了。
4 copy 完成以后,用rename table 新表代替原表,默认删除原表。
 
用法介绍:
pt-online-schema-change [OPTIONS] DSN
options 可以自行查看 help,DNS 为你要操作的数据库和表。这里有两个参数需要介绍一下:
--dry-run 
 这个参数不建立触发器,不拷贝数据,也不会替换原表。只是创建和更改新表。
--execute 
这个参数的作用和前面工作原理的介绍的一样,会建立触发器,来保证最新变更的数据会影响至新表。注意:如果不加这个参数,这个工具会在执行一些检查后退出。
 
依赖条件
1操作的表必须有主键否则 报如下错误。
[root@rac1 bin]#  ./pt-online-schema-change -u root -h 10.250.7.50  -p yang --alter='add column vid int ' --execute D=houyi,t=ga      
Cannot connect to D=houyi,h=127.0.0.1,p=...,u=root
Cannot chunk the original table `houyi`.`ga`: There is no good index and the table is oversized. at ./pt-online-schema-change line 5353.
 
测试例子:
1 添加字段
[root@rac1 bin]#  ./pt-online-schema-change -u root -h 10.250.7.50  -p yang --alter='add column vid int ' --execute D=houyi,t=ga  
Cannot connect to D=houyi,h=127.0.0.1,p=...,u=root
Operation, tries, wait:
  copy_rows, 10, 0.25
  create_triggers, 10, 1
  drop_triggers, 10, 1
  swap_tables, 10, 1
  update_foreign_keys, 10, 1
Altering `houyi`.`ga`...
Creating new table...
Created new table houyi._ga_new OK.
Altering new table...
Altered `houyi`.`_ga_new` OK.
Creating triggers...
Created triggers OK.
Copying approximately 746279 rows...
Copied rows OK.
Swapping tables...
Swapped original and new tables OK.
Dropping old table...
Dropped old table `houyi`.`_ga_old` OK.
Dropping triggers...
Dropped triggers OK.
Successfully altered `houyi`.`ga`.
2 添加索引
[root@rac1 bin]# ./pt-online-schema-change -u root -h 10.250.7.50  -p yang --alter='add key indx_vid(vid) ' --execute D=houyi,t=ga    
3 删除字段         
[root@rac1 bin]# ./pt-online-schema-change -u root -h 10.250.7.50  -p yang --alter='drop  column vid ' --execute D=houyi,t=ga             
详细的教程请参看:
http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html
 
 
 

转载于:https://www.cnblogs.com/zengkefu/p/5678304.html

### 使用 `pt-online-schema-change` 进行数据库表结构变更 `pt-online-schema-change` 是一个由 Percona 提供的在线 DDL 工具,专门用于在不影响 MySQL 数据库正常运行的情况下进行表结构变更。它通过创建临时表并逐步迁移数据的方式,实现无锁操作,从而避免了传统 `ALTER TABLE` 命令可能带来的性能问题和锁表现象。以下是如何使用 `pt-online-schema-change` 工具进行数据库表结构变更的详细方法。 #### 1. 安装 `pt-online-schema-change` 工具 `pt-online-schema-change` 是 Percona Toolkit 的一部分,可以通过安装 Percona Toolkit 来获取该工具。在 Linux 系统中,可以通过以下命令安装: ```bash # 对于基于 Debian 的系统 sudo apt-get install percona-toolkit # 对于基于 Red Hat 的系统 sudo yum install percona-toolkit ``` 安装完成后,确保 `pt-online-schema-change` 命令可用。 #### 2. 基本使用方法 `pt-online-schema-change` 的基本命令格式如下: ```bash pt-online-schema-change [OPTIONS] D=database,t=table ``` 其中,`D=database` 指定数据库名称,`t=table` 指定表名,`[OPTIONS]` 是可选参数。 #### 3. 常用参数 - `--alter`: 指定要执行的表结构变更操作,例如添加列、修改列类型、删除列等。 - `--execute`: 表示立即执行变更操作。 - `--no-drop-old-table`: 在执行完成后不删除旧表,通常用于调试或备份。 - `--dry-run`: 模拟执行变更操作,不实际修改数据表。 - `--user` 和 `--password`: 指定数据库连接的用户名和密码。 - `--host`: 指定数据库服务器的地址。 #### 4. 示例:添加字段并修改存储引擎 假设需要将数据库 `test` 中的表 `user` 的存储引擎从 InnoDB 改为 MyISAM,并新增字段 `signup_time`,可以按照以下步骤进行操作。 ##### 步骤1:添加新字段 ```bash pt-online-schema-change \ --alter "ADD COLUMN signup_time DATETIME" \ --execute \ D=test,t=user ``` ##### 步骤2:修改存储引擎 ```bash pt-online-schema-change \ --alter "ENGINE=MyISAM" \ --no-drop-old-table \ --execute \ D=test,t=user ``` #### 5. 注意事项 - **锁表问题**: `pt-online-schema-change` 通过创建临时表并逐步迁移数据的方式,避免了传统 `ALTER TABLE` 命令可能带来的锁表现象。然而,在某些情况下,例如表结构变更涉及大量数据时,仍然可能会对数据库性能产生一定影响。 - **数据一致性**: 在使用 `pt-online-schema-change` 进行表结构变更时,确保数据库的主从复制配置正确,以避免数据不一致的问题。 - **测试环境**: 在生产环境中使用 `pt-online-schema-change` 之前,建议在测试环境中进行充分的验证,以确保变更操作的正确性和安全性。 #### 6. 替代方案 除了 `pt-online-schema-change`,还有一些其他工具可以用于在线表结构变更,例如: - **Online DDL in MySQL 5.6+**: MySQL 5.6 及以上版本引入了在线 DDL 功能,允许在不锁定表的情况下进行某些表结构变更操作。 - **gh-ost**: GitHub 开发的在线表结构变更工具,支持更复杂的变更场景,并提供了更高的灵活性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值