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
一般会把bin-log转移,没有bin-log备份回写不好操作