ITPub博客

首页 > 数据库 > MySQL > 一次系统升级的过程

一次系统升级的过程

原创 MySQL 作者:wzq609 时间:2015-09-22 17:07:12 0 删除 编辑

【问题背景】公司的一个销售系统运行了有5年的时间了,最近需要对该系统升级,其中有个问题一直导致整个升级过程一直停滞;升级的过程中,需要对一个表做添加字段的操作,直接运行alter语句进行操作,需要消耗大概8个小时,由于操作的过程中会进行锁表的操作,但是业务允许的停机操作只有4个小时;经过了一系列的测试终于完成了系统的更新,以下是更新过程中的一些经验。

 

【1】环境说明:

数据库版本:5.5.36

数据库架构:主从架构

数据库引擎:innodb

需要修改的表大小:300W行,大小4GB

 

计算表占用的空间,方法如下

select concat(round(sum(data_length/1024/1024),2),'MB') as data_length_MB,concat(round(sum(index_length/1024/1024),2),'MB') as index_length_MB   
   from information_schema.tables 
      where  table_schema='schema_name'
           and table_name = 'table_name'; 

 

alter  table add column的原理:整个过程跟oracle的在线重定义表很像,首先创建一个临时表,再把数据从源表一条条insert到这个临时表中,当所有的数据都insert完成后,再把运来的表drop掉,把临时表rename成源表;

  • 整个过程会对源表进行加锁的操作,避免这个过程被锁定;
  • 临时表会写到数据库的tmp空间里,当这部分的空间不足时,再写入到磁盘中;

 

知道了我们要处理的对象和整个操作的原理之后,初步的优化如下:

1、参数的调优

修改参数tmp_table_size和max_heap_table_size的值

mysql>  show variables like '%tmp%';
+-------------------+----------+
| Variable_name     | Value    |
+-------------------+----------+
| max_tmp_tables    | 32       |
| slave_load_tmpdir | /tmp     |
| tmp_table_size    | 16777216 |
| tmpdir            | /tmp     |
+-------------------+----------+
4 rows in set (0.00 sec)

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 (请备注数据库类型)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12679300/viewspace-1806414/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-06-16

  • 博文量
    173
  • 访问量
    3083836