MySQL海量表增加字段
方案1.直接新增字段 结果:不行太卡
方案2.修改原表名 结果:不行太卡
方案3:pt-online-schema-change
-
首先它会新建一张一模一样的表,表名一般是_new后缀
-
然后在这个新表执行更改字段操作
-
然后在原表上加三个触发器,DELETE/UPDATE/INSERT,将原表中要执行的语句也在新表中执行
-
最后将原表的数据拷贝到新表中,然后替换掉原表
下载:
wget percona.com/get/percona-toolkit.tar.gz
备份链接:
https://downloads.percona.com/downloads/percona-toolkit/2.2.13/tarball/percona-toolkit-2.2.13.tar.gz
安装:
tar xzvf percona-toolkit-2.2.13.tar.gz
cd percona-toolkit-2.2.13
perl Makefile.PL
make
make install
验证:
pt-query-digest --help
使用:
新增列:
pt-online-schema-change --alter "ADD COLUMN age INT NOT NULL DEFAULT 0" D=mydb,t=users --user=root --password=123456 --host=localhost --execute
修改字段类型:
pt-online-schema-change --alter "MODIFY COLUMN age BIGINT" D=mydb,t=users --user=root --password=123456 --host=localhost --execute
增加索引:
pt-online-schema-change --alter "ADD INDEX idx_name (name)" D=mydb,t=users --user=root --password=123456 --host=localhost --execute
删除列:
pt-online-schema-change --alter "DROP COLUMN old_col" D=mydb,t=mytable --user=root --password=123456 --host=localhost --execute
关键参数:
--alter 指定 ALTER TABLE 变更内容
--execute 正式执行(默认不会执行,需加)
--dry-run 只模拟,不执行
--chunk-size=N 控制每次复制的数据量(默认 1000)
--chunk-time=0.5 设定复制时间,自动调整 chunk-size
--max-load="Threads_running=50" 服务器负载过高时暂停
--nocheck-replication-filters 忽略复制过滤器检查
--nodrop-old-table 保留旧表(防止误删数据)
--set-vars innodb_lock_wait_timeout=50 避免长时间锁等待
执行:
建议先模拟一次:
pt-online-schema-change --alter "ADD COLUMN user VARCHAR(500);" D=database,t=MyTable--user=root --password=123456 --host=192.168.1.1 --port=3306 --dry-run
然后执行:
nohup pt-online-schema-change --alter "ADD COLUMN user VARCHAR(500);" D=database,t=MyTable--user=root --password=123456 --host=192.168.1.1 --port=3306 --dry-run > pt_osc.log 2>&1 &