Mysql大表加字段工具ptonline
by ET posted on 2021年11月4日 17:31 under 技术分享
标签: 数据库 mysql 运维
mysql表加字段很简单,直接alter语句就可以了,但是碰到数据量非常大的表,加字段非常麻烦,执行时间长,io高的情况下可能会导致锁表,而且会影响到业务正常修改插入和查询。
这时候可以使用pt-online-schema-change来加字段,这个工具会先按原表结构新建一个表table_new,更新表字段,然后把原表的数据全部复制到新表,并且在原表建一个触发器,一单原表有新的插入和修改都会同步到新表,完成所有数据同步后,会把原表丢弃,把新表表名改成原表名table。
下面来介绍一下如何安装和使用ptonline
一、安装
1、安装percona toolkit包
sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
或者
sudo yum install percona-toolkit
2、安装后通过下面命令验证是否安装成功
sudo pt-query-digest --help
sudo pt-table-checksum --help
二、使用
例如给数据库为 jxxt 表为 user 添加字段 uuid
sudo /usr/bin/pt-online-schema-change \
--user=root \
--password=123456 \
--host=127.0.0.1 \
--port=3306 \
--charset=utf8 \
--nodrop-old-table \
--alter="add column uuid varchar(60) null default null" \
D=jxxt,t=user --exec
注意:alter里的语句不能出现 " ,如果要直接删除老表的话不要加参数nodrop-old-table,此参数会保留老表
三、使用限制
1、如果修改表有外键,除非使用 --alter-foreign-keys-method 指定特定的值,否则工具不予执行
2、被修改表必须要有主键,否则报错:Cannot chunk the original table houyi
.ga
: There is no good index and the table is oversized. at ./pt-online-schema-change line 5353.
3、被修改表上不能有针对after delete|insert|update三个触发器,否则修改表结构操作失败
四、原来ALTER所执行的操作
1、按照原始表(original_table)的表结构和ddl语句,新建一个不可见的临时表(temporary_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
五、pt-online-schema-change所执行的操作
1、首先创建一个和你要执行的alter操作的表一样的空的表结构。
2、执行我们赋予的表结构的修改,然后copy原表中的数据到新表里面。
3、在原表上创建一个触发器在数据copy的过程中,将原表的更新数据的操作全部更新到新的表中来。
这里特别注意一下,如果原表中已经定义了触发器那么工具就不能工作了。
4、copy完成之后,用rename table 新表代替原表,默认删除原表。