今天服务器突然出现故障,所有数表不能写入,经查看:
# df -h
显示:/dev/xvda1 磁盘空间占用100%
想着系统盘怎么会有这么大的写入量(其实是公司申请的云服务器系统盘太小,只有20G,嫌麻烦,没有升级!)
# cd /var
# du -sh*
最终确定/var/lib/mysql/ibdata1文件占磁盘高达11G
度娘了一下:“mysql ibdata1存放数据,索引等,是MYSQL的最主要的数据。如果不把数据分开存放的话,这个文件的大小很容易就上了G,甚至几十G。MySql innodb如果是共享表空间,ibdata1文件越来越大,达到了30多个G”
对于系统盘只有20G,公司不给升级的运维D来说,情何以堪。幸亏挂载盘/mnt够大。
两个思路:1、ibdata1瘦身 2、更换datadir路径
第一个方法网上很多,大家度娘、搜狗一下。
此处,我采用的是第二种:
首先:在/mnt/lib目录创建mysql文件夹
# mkdir /mnt/lib/mysql
编辑mysql配置文件:ubuntu系统一般在/etc/mysql/my.cnf
# vim /etc/mysql/my.cnf
我将datadir改成/mnt/lib/mysql下,则在my.cnf中做如下更改,在[mysqld]段
port = 3306
basedir = /usr
datadir = /mnt/lib/mysql
更改完成保存退出,可以重启mysql服务,结果mysql启动不起来,但是将datadir换回来就能启动,于是各种度娘度狗度Google,终于发现问题的原因是在ubuntu中存在一个apparmor的服务,这个服务主要作用是主要的作用是设置某个可执行程序的访问控制权限,可以限制程序 读/写某个目录/文件,打开/读/写网络端口等等。他的配置文件在/etc/apparmor.d/中,在这里我们可以看到一个usr.sbin.mysqld的配置文件,所以我们要改datadir路径,这里也需要做更改。
我做了如下更改:
/logs/mysql/mysql.log rw,
/logs/mysql/mysql.err.log rw,
/mnt/lib/mysql/ r,
/mnt/lib/mysql/** rwk,
/logs/mysql/ r,
/logs/mysql/* rw,
红色区域是更改的地方。更改完成以后,因为这是一个服务,所以我们需要重启一下这个服务:
# /etc/init.d/apparmor restart
给/mnt/lib/mysql赋权限
chown -R mysql:mysql mysql
因为mysql虽然启动失败,但是/mnt/lib/mysql目录仍然生成有:ibdata1 ib_logfile*文件,删除/mnt/lib/mysql目录下的几个文件
# rm -rf ibdata1 ib_logfile*
此时心情那叫一个愉悦,重启myslq准备关灯睡觉,然并卵。
重启mysql
/etc/init.d/mysql start
mysql仍然无法启动。
查看错误日志vim /var/log/mysql/error.log
161027 23:43:36 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
161027 23:43:36 InnoDB: The InnoDB memory heap is disabled
161027 23:43:36 InnoDB: Mutexes and rw_locks use GCC atomic builtins
161027 23:43:36 InnoDB: Compressed tables use zlib 1.2.3.4
161027 23:43:36 InnoDB: Initializing buffer pool, size = 128.0M
161027 23:43:36 InnoDB: Completed initialization of buffer pool
161027 23:43:36 InnoDB: highest supported file format is Barracuda.
InnoDB: Log scan progressed past the checkpoint lsn 49439
161027 23:43:36 InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
又奋战半小时,各种更改,各种尝试。最终被一条指令莫名其妙的一锤定音。
神之指令:
# mysql_install_db --user=mysql --ldata=/mnt/lib/mysql/ 其中/mnt/lib/mysql/是自己需要更好的路径。
再启动mysql
/etc/init.d/mysql start
一切搞定,此时已经凌晨1:00,运维D赶紧关灯睡觉,以迎接新的挑战。