这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战sql
在上一篇中介绍了如何优化慢sql,提升应用的速度,详细的请移步优化系统慢查询数据库
文中案例说明须要在大表中添加一个字段group_id,表中有个1千万的数据量,并且有几个索引字段,若是直接在客户端经过sql ALTER TABLE h_app_message ADD group_id bigint(20)
会形成数据库卡顿,耗费时间很长,直接影响线上正常使用。markdown
通常对于较大数据量的修改方式,若是线上并发不是很高的状况下是能够手动处理的,方式以下:并发
咱们的处理方式是经过pt-online-schame-change 工具在线修改正式环境的字段,添加group_id。app
此工具的好处:工具
下降主从延时的风险
能够限速、限资源,避免操做时MySQL负载太高
复制代码
建议:post
在业务低峰期作,将影响降到最低
复制代码
直接原表修改缺点:测试
当表的数据量很大的时候,若是直接在线修改表结构,严重影响线上环境,并且耗时不可预估
复制代码
注意:大数据
须要确认表必须包含主键或者惟一索引优化
工具会建立触发器,因此原表上不能有触发器
有外键的表须要注意使用参数--alter-foreign-keys-method(如今业务上不建议表中外键关联,建议在业务中控制)
原理:
不管操做多么有把握,也要把备份作好(万一很可怕的)
下载安装包:
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
复制代码
在解压包的bin目录下执行,看是否正常,查看命令
./pt-online-schema-change --help
复制代码
参数 | 含义 |
---|---|
--user= | 链接用户名 |
--password= | 链接密码 |
--host= | 链接IP |
P= | 端口 |
--alter= | 执行表变动的语句 |
D= | database 库名 |
t= | table 表名 |
--charset=utf8 | 使用utf8编码,避免中文乱码 |
--no-check-alter | 不检查alter语句 |
打印操做日志 | |
--execute | 执行修改表结构,真正的执行alter,–dry-run与–execute必须指定一个,两者相互排斥 |
–dry-run | 建立和修改新表,但不会建立触发器、复制数据、和替换原表。并不真正执行,与--print配合查看执行细节 |
若是执行失败,检查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
复制代码
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'"
复制代码
sql语句:
ALTER TABLE `h_message` CHANGE column group_id group_id_0 bigint(20);
复制代码
pt命令:
--alter "CHANGE group_id group_id_0 bigint(20)"
复制代码
sql语句:
ALTER TABLE `h_message` ADD INDEX h_message_n1(group_id);
复制代码
pt命令:
--alter "ADD INDEX h_message_n1(group_id)"
复制代码
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.
复制代码
以上就是正式环境大数据表结构修改操做的使用方式,大家是怎么处理大表结构修改的呢,欢迎留言告知, 有问题欢迎留言告知!