文中案例说明
需要在大表中添加一个字段,表中有个1千万的数据量,而且有几个索引字段,如果直接在客户端通过sql ALTER TABLE ADD (20) 会造成数据库卡顿,耗费时间很长,直接影响线上正常使用。
一般对于较大数据量的修改方式,如果线上并发不是很高的情况下是可以手动处理的,方式如下:
我们的处理方式是通过pt— 工具在线修改正式环境的字段,添加。
此工具的好处:
建议:
在业务低峰期做,将影响降到最低
直接原表修改缺点:
当表的数据量很大的时候,如果直接在线修改表结构,严重影响线上环境,而且耗时不可预估
注意:
原理:
1、数据备份
无论操作多么有把握,也要把备份做好(万一很可怕的)
2、安装
下载安装包:
wget https://downloads.percona.com/downloads/percona-toolkit/3.3.1/source/tarball/percona-toolkit-3.3.1.tar.gz
解压:
tar -xvf percona-toolkit-3.3.1.tar.gz
安装一些依赖包:
yum install perl-DBIyum install perl-DBD-MySQLyum install perl-Time-HiResyum install perl-IO-Socket-SSLyum -y install perl-Digest-MD5
3、测试可用
在解压包的bin目录下执行,看是否正常,查看命令
./pt-online-schema-change --help
4、参数字段及含义
5、具体操作
1. 添加一个字段
如果执行失败,检查alter语句,如果确认无误 可以避免检查 –no-check-alter
./pt-online-schema-change --user=xxxx --password=xxxx --host=xxx.xxx.xxx.xxxx --alter "add column group_id bigint(20) not NULL default '0' comment 'test' " P=30306,D=h_pushcenter,t=h_message --charset=utf8 --no-version-check --print --execute
2. 修改字段
sql语句:
ALTER TABLE `h_message` MODIFY COLUMN `group_id` int(20) NOT NULL DEFAULT '1';ALTER TABLE `h_message` MODIFY COLUMN `group_id` int(20) NOT NULL DEFAULT '1';
pt命令:
--alter "MODIFY COLUMN group_id int(20) NOT NULL DEFAULT '1'"
3. 修改字段名
sql语句:
ALTER TABLE `h_message` CHANGE column group_id group_id_0 bigint(20);
pt命令:
--alter "CHANGE group_id group_id_0 bigint(20)"
4. 添加索引
sql语句:
ALTER TABLE `h_message` ADD INDEX h_message_n1(group_id);
pt命令:
--alter "ADD INDEX h_message_n1(group_id)"
6、操作日志
Creating new table...
CREATE TABLE `h_pushcenter`.`_h_message_new` .....
Created new table h_pushcenter._h_message_new OK.
Altering new table...
ALTER TABLE `h_pushcenter`.`_h_message_new` add column group_id bigint(20) not NULL default '0' comment 'test'
Altered `h_pushcenter`.`_h_message_new` OK.
Creating triggers...
Event : DELETE
Event : UPDATE
Event : INSERT
Created triggers OK.
Copying approximately 8187 rows...
Copied rows OK.
2021-05-19T10:33:08 Swapping tables...
RENAME TABLE `h_pushcenter`.`h_message` TO `h_pushcenter`.`_h_message_old`, `h_pushcenter`.`_h_message_new` TO `h_pushcenter`.`h_message`
2021-05-19T10:33:09 Swapped original and new tables OK.
2021-05-19T10:33:09 Dropping old table...
DROP TABLE IF EXISTS `h_pushcenter`.`_h_message_old`
2021-05-19T10:33:09 Dropped old table `h_pushcenter`.`_h_message_old` OK.
2021-05-19T10:33:09 Dropping triggers...
DROP TRIGGER IF EXISTS `h_pushcenter`.`pt_osc_h_pushcenter_h_message_del`
DROP TRIGGER IF EXISTS `h_pushcenter`.`pt_osc_h_pushcenter_h_message_upd`
DROP TRIGGER IF EXISTS `h_pushcenter`.`pt_osc_h_pushcenter_h_message_ins`
2021-05-19T10:33:09 Dropped triggers OK.