mysql-bin 日志文件太大导致系统磁盘空间不足

突然接收到程序bug邮件通知,报错SQLSTATE[HY000]: General error: 1030 Got error 28 from storage engine,经过一点一点的原因查询原来是系统没有空间了

查询到/usr/local/占用硬盘空间大

[root@iZbp153yczpm4pp9pjs0u3Z /]# du -h --max-depth=1 /usr/local/
23M    /usr/local/share
114M    /usr/local/mongodb
13G    /usr/local/mysql
648K    /usr/local/memcached
4.0K    /usr/local/games
204M    /usr/local/php
11M    /usr/local/freetype
36K    /usr/local/man
4.0K    /usr/local/lib64
20M    /usr/local/acme.sh
4.0K    /usr/local/tmp
7.5M    /usr/local/libmemcached
644K    /usr/local/rabbitmq-c-0.7.1
4.0K    /usr/local/sbin
63M    /usr/local/gocache
4.0K    /usr/local/etc
991M    /usr/local/kibana-7.2.0
158M    /usr/local/aegis
251M    /usr/local/ffmpeg
4.0K    /usr/local/src
137M    /usr/local/node
334M    /usr/local/go
22M    /usr/local/redis
222M    /usr/local/python3.7
116K    /usr/local/include
50M    /usr/local/cloudmonitor
43M    /usr/local/lib
11M    /usr/local/bin
4.0K    /usr/local/libexec
13M    /usr/local/nginx
9.3M    /usr/local/rabbitmq_server
514M    /usr/local/elasticsearch-7.2.0
16G    /usr/local/

继续跟踪到mysql的var目录,是默认存放mysql-bin log日志的地方

[root@iZbp153yczpm4pp9pjs0u3Z /usr/local/mysql/var]# ll
total 12042260
-rw-rw---- 1 mysql mysql         56 Jan 27  2019 auto.cnf
-rw-rw---- 1 mysql mysql   33554432 Oct 12 20:45 ib_logfile0
-rw-rw---- 1 mysql mysql   33554432 Oct 12 20:45 ib_logfile1
-rw-rw---- 1 mysql mysql     335872 Oct 12 20:23 iZbp153yczpm4pp9pjs0u3Z.err
-rw-rw---- 1 mysql mysql          6 Oct 10 09:19 iZbp153yczpm4pp9pjs0u3Z.pid
-rw-rw---- 1 mysql mysql 1073770620 Oct  8 08:40 mysql-bin.000048
-rw-rw---- 1 mysql mysql 1073765660 Oct  9 03:52 mysql-bin.000049
-rw-rw---- 1 mysql mysql 1073776600 Oct  9 14:10 mysql-bin.000050
-rw-rw---- 1 mysql mysql 1073768758 Oct 10 01:01 mysql-bin.000051
-rw-rw---- 1 mysql mysql  630564306 Oct 10 09:19 mysql-bin.000052
-rw-rw---- 1 mysql mysql 1073789707 Oct 11 00:29 mysql-bin.000053
-rw-rw---- 1 mysql mysql 1073760602 Oct 11 08:41 mysql-bin.000054
-rw-rw---- 1 mysql mysql 1073790453 Oct 11 17:47 mysql-bin.000055
-rw-rw---- 1 mysql mysql 1073842414 Oct 12 03:58 mysql-bin.000056
-rw-rw---- 1 mysql mysql 1073969816 Oct 12 09:20 mysql-bin.000057
-rw-rw---- 1 mysql mysql 1073782837 Oct 12 14:47 mysql-bin.000058
-rw-rw---- 1 mysql mysql  817240818 Oct 12 20:46 mysql-bin.000059
-rw-rw---- 1 mysql mysql        228 Oct 12 14:47 mysql-bin.index

看到结果,惊呆了,没想到时间不长产生了这么大的日志.

解决方案

我们连接mysql


[root@iZbp153yczpm4pp9pjs0u3Z var]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 137691
Server version: 5.6.40-log Source distribution

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

然后显示文件:

mysql> show master logs;
+------------------+------------+
| Log_name         | File_size  |
+------------------+------------+
| mysql-bin.000048 | 1073770620 |
| mysql-bin.000049 | 1073765660 |
| mysql-bin.000050 | 1073776600 |
| mysql-bin.000051 | 1073768758 |
| mysql-bin.000052 |  630564306 |
| mysql-bin.000053 | 1073789707 |
| mysql-bin.000054 | 1073760602 |
| mysql-bin.000055 | 1073790453 |
| mysql-bin.000056 | 1073842414 |
| mysql-bin.000057 | 1073969816 |
| mysql-bin.000058 | 1073782837 |
| mysql-bin.000059 |  822121073 |
+------------------+------------+
12 rows in set (0.00 sec)

然后清理之前没用的日志

bin-log日志使用来恢复数据库用的,谨慎清除

mysql> PURGE BINARY LOGS BEFORE '2019-10-12 00:00:00';
Query OK, 0 rows affected (0.03 sec)

再次查看空间 很明显下去了10G之多,看来我们也要定时清理日志,差点就让我花费钱加了硬盘.

[root@iZbp153yczpm4pp9pjs0u3Z mysql]# du -h --max-depth=1 
16K    ./docs
2.8M    ./sql-bench
3.3M    ./share
12K    ./data
185M    ./mysql-test
696K    ./man
40K    ./scripts
36K    ./support-files
1.3G    ./var
948K    ./include
267M    ./lib
539M    ./bin
2.3G    .
[root@iZbp153yczpm4pp9pjs0u3Z mysql]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G   22G   16G  58% /
devtmpfs        909M     0  909M   0% /dev
tmpfs           920M     0  920M   0% /dev/shm
tmpfs           920M  580K  919M   1% /run
tmpfs           920M     0  920M   0% /sys/fs/cgroup
tmpfs           184M     0  184M   0% /run/user/0

bin-log的作用

MySQL数据库中,mysql-bin.000001、mysql- bin.000002等文件是数据库的操作日志,例如UPDATE一个表,或者DELETE一些数据,即使该语句没有匹配的数据,这个命令也会存储到日志文件中,还包括每个语句执行的时间,也会记录进去的。

这样做主要有以下两个目的:

1:数据恢复

如果你的数据库出问题了,而你之前有过备份,那么可以看日志文件,找出是哪个命令导致你的数据库出问题了,想办法挽回损失。

2:主从服务器之间同步数据

主服务器上所有的操作都在记录日志中,从服务器可以根据该日志来进行,以确保两个同步。

处理方法分两种情况:

1:只有一个mysql服务器,关闭MySQL的日志功能步骤:

1) 删除日志:

登录后执行:mysql> reset master;

2)禁用MySQL日志:修改/etc/my.cnf 文件,找到

log-bin=mysql-bin
binlog_format=mixed

这两行前面加上#,将其注释掉,再执行/etc/init.d/mysql restart即可。

如果实在想保留日志,可以在/etc/my.cnf里加入expire_logs_days = 10 然后重启mysql,这样10天就会自动清理日志。

2:如果你的环境是主从服务器,那么就需要做以下操作了。

A:在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。

B:使用SHOW MASTER LOGS获得主服务器上的一系列日志。

C:在所有的从属服务器中判定最早的日志,这个是目标日志,如果所有的从属服务器是更新的,就是清单上的最后一个日志。

D:清理所有的日志,但是不包括目标日志,因为从服务器还要跟它同步。

清理日志方法为:

PURGE MASTER LOGS TO 'mysql-bin.010';

PURGE MASTER LOGS BEFORE '2019-08-02 21:00:00';

如果你确定从服务器已经同步过了,跟主服务器一样了,那么可以直接RESET MASTER将这些文件删除。

Last modification:October 12th, 2019 at 09:08 pm
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment