mysql-bin 文件过大造成服务器500错误的解决办法

网站好久没出现500错误了,今天上班的时候收到 Uptime Robot 发来的信息 “The monitor Forece Blog (http://www.forece.net) is currently DOWN (Connection Timeout). ” 然后我就知道网站又挂了。晚上回家,看了看,发现 Mysql 启动不了了。然后分析日志,发现原来是磁盘空间满了。

1. 查看日志

/usr/local/mysql/var/主机名.err 找到日志,发现错误提示如下:

2019-04-08 01:59:09 30216 [Warning] Disk is full writing './mysql-bin.000046' (Errcode: 28 - No space left on device). Waiting for someone to free space...

2. df -l 查看下空间使用情况

Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/xvda1      20641404 16963004   16929876  100% /
tmpfs             960368        0    960368   0% /dev/shm
/dev/xvdb1      51599192  4845536  44132564  10% /home/sam/share

果然100%被写满了,接下来就要去清理mysql-bin日志文件了。

3. 清理mysql-bin日志文件

输入命令 mysql -u root -p 进入mysql控制台,然后 show binary logs; (注意mysql每句命令都要加分号)

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 | 234592362 |
| mysql-bin.000002 | 425234342 |
| mysql-bin.000003 | 425345345 |
| mysql-bin.000004 | 234234222 |
| mysql-bin.000005 | 425994852 |
+------------------+-----------+
1 row in set (0.00 sec)

发现很多mysql-bin文件,然后再用 show master status; 看看现在使用的是哪个文件,一般是数字最大的。

mysql> show master status;
+------------------+-----------+--------------+------------------+-------------------+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+--------------+------------------+-------------------+
| mysql-bin.000005 | 425994852 |              |                  |                   |
+------------------+-----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

当前正在使用的日志文件是mysql-bin.000005,那么删除日志文件的时候应该排除掉该文件。删除除mysql-bin.000005以外的日志文件的命令:purge binary logs to 'mysql-bin.000005'; 删除后就能释放大部分空间。

mysql> purge binary logs to 'mysql-bin.000005';

当然也可以直接用 reset master 重置所有mysql-bin文件

mysql> reset master;

4. 修改mysql设置,禁止产生日志文件

如果嫌麻烦的话,可以直接修改 my.cnf 然后将bin日志文件关闭
#log-bin=mysql-bin

最后一步记得重启mysql服务。

5. 查找其他大型log日志文件

虽然删除了mysql日志文件,但是空间只释放了5%,我的20G空间只放了我的博客,不可能我的博客占用了19G吧。继续检查,利用 find 命令查找服务器大于800M的文件

find . -type f -size +800M

最后发现是 Nginx 的 access.log 日志文件占用了绝大空间,10来个G,自从建站就没清过。删除这个文件的时候,需要关闭nginx,删除,然后重启即可。再看下空间,一下宽敞多了。

附:
PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY); //删除10天前的MySQL binlog日志,附录2有关于PURGE MASTER