【问题背景】公司的一个销售系统运行了有5年的时间了,最近需要对该系统升级,其中有个问题一直导致整个升级过程一直停滞;升级的过程中,需要对一个表做添加字段的操作,直接运行alter语句进行操作,需要消耗大概8个小时,由于操作的过程中会进行锁表的操作,但是业务允许的停机操作只有4个小时;经过了一系列的测试终于完成了系统的更新,以下是更新过程中的一些经验。
【1】环境说明:
数据库版本:5.5.36
数据库架构:主从架构
数据库引擎:innodb
需要修改的表大小:300W行,大小4GB
计算表占用的空间,方法如下
|
alter table add column的原理:整个过程跟oracle的在线重定义表很像,首先创建一个临时表,再把数据从源表一条条insert到这个临时表中,当所有的数据都insert完成后,再把运来的表drop掉,把临时表rename成源表;
- 整个过程会对源表进行加锁的操作,避免这个过程被锁定;
- 临时表会写到数据库的tmp空间里,当这部分的空间不足时,再写入到磁盘中;
知道了我们要处理的对象和整个操作的原理之后,初步的优化如下:
1、参数的调优
修改参数tmp_table_size和max_heap_table_size的值
mysql> show variables like '%tmp%'; |
max_tmp_tables 默认值为32M
tmp_table_size默认值为16M
调整后的参数为
max_tmp_tables 值为256M
tmp_table_size值为128M
调整结果:经过调整后,整个过程的更新速度提升了30%;
2、使用pt-online-schema-change工具
通过上面的优化后,还是不能达到要求,万能的谷歌告诉我,这个mysql在线增加字段其实很多大的互联网公司都会碰到的,Percona公司早就为这种业务场景提供了相应的解决方法:使用pt-online-schema-change进行添加字段,这种方法跟oracle的在线重定义表很像。这样再进行增加列的同时,不会影响当前业务的插入操作;
详细的操作如下:
2.1 pt-online-schema-change的下载,通过下载percona-toolkit软件即可,软件的下载方法已经介绍过,麻烦找下本博客的连接;
2.2 设置可以直接运行命令,在/usr/local/percona-toolkit/bin目录下运行, ln pt-table-checksum /usr/bin/pt-table-checksum
2.3 使用方法,
pt-online-schema-change的执行分成试运行和执行两个步骤
- 试运行
pt-online-schema-change --alter "ADD org_id INT(11) NULL DEFAULT 0 COMMENT '组织ID' " D='pos',t='record_detail' -uroot -p123456 --dry-run |
- 执行
pt-online-schema-change --alter "ADD org_id INT(11) NULL DEFAULT 0 COMMENT '组织ID' " D='retail',t='record_detail' -uroot -p123456 –execute |
【2】经过以上操作,在两个夜深人静的晚上,顺利的完成了系统的升级;有时候我们遇到的很多问题,其实网上都有了很好的解决方法,学以致用,感谢网友们的智慧;
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
本文作者:JOHN,某上市公司DBA,业余时间专注于数据库的技术管理,从管理的角度去运用技术。
技术博客:猎人笔记 数据库技术群:367875324 (请备注数据库类型)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++