Wardon&ET 博客

Mysql大表加字段工具ptonline

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 新表代替原表,默认删除原表。