事情的起因是年前放了一个用户同步的脚本在服务器上面验证稳定性,全部用户跑完之后数据库里面多了300多万条数据。
年后回来发现微信上面的测试号基本所有请求的超时了,当时想法是先去看mysql的日志,然而mysql并没有开启slowlog。
后来该去查看php-fpm的slowlog,悲剧的是php也没开。
打开php-fpm的慢日志之后,观察发现是由于用户表没有索引造成的(测试服务器上面的数据库用的都是MyISAM而且没有加索引)。
于是在服务器上面登陆MySQL客户端,添加索引。
又悲剧地发现由于主磁盘的空间已经满了,这是时候有两个思路,一个是清理一下磁盘空间,另一个是把MySQL的数据移库到另外一个挂载盘上。由于考虑到移库比较麻烦,而且也怕中间出现其他的问题,所以一开始是想着先清理一下磁盘空间。
在MySQL的数据文件里面有一个ibdata的文件,一个文件就占到的12G,于是选择优化ibdata文件。
首先用mysqldump 导出了所有的表数据
mysqldump -uroot -p -R -q --all-databases > 20170217.sql
然后drop 掉了所有的业务表,停止mysqld。
删除ibdata1中,ib_logfile0和ib_logfile1.
修改配置文件 my.cnf
在[mysqld]下添加配置选项
innodb_file_per_table(添加了这个选项之后,innodb表的数据会分开到各个表去记录,而不是写入到ibdata中)
重启mysql
(优化参考链接 https://yq.aliyun.com/articles/58732)
mysql成功重启后发现并没有什么卵用……表数据加起来还是那么多……其中一个user表就占到了接近8G,如果再跑个创建索引的命令,还会再生成一个8G的临时表文件,磁盘GG没有任何商量。
这样就只好选择移库了。
移库先删除了datadir中的临时表文件以及ib_logfile_0,ib_logfile1,复制数据文件到新的文件夹(注意文件夹操作权限问题)。
然后修改my.cnf中[mysqld]的datadir以及socket地址,另外还需要修改[client]内的socket地址,否则在调用mysql客户端的时候会由于socket路径问题无法链接。
重启mysq,建立索引,成功