您现在的位置是:首页 > 博客日记 > 数据库 数据库

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

2019-10-12 20:51:07 【数据库】 人已围观

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

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

  1. [root@iZbp153yczpm4pp9pjs0u3Z /]# du -h --max-depth=1 /usr/local/
  2. 23M /usr/local/share
  3. 114M /usr/local/mongodb
  4. 13G /usr/local/mysql
  5. 648K /usr/local/memcached
  6. 4.0K /usr/local/games
  7. 204M /usr/local/php
  8. 11M /usr/local/freetype
  9. 36K /usr/local/man
  10. 4.0K /usr/local/lib64
  11. 20M /usr/local/acme.sh
  12. 4.0K /usr/local/tmp
  13. 7.5M /usr/local/libmemcached
  14. 644K /usr/local/rabbitmq-c-0.7.1
  15. 4.0K /usr/local/sbin
  16. 63M /usr/local/gocache
  17. 4.0K /usr/local/etc
  18. 991M /usr/local/kibana-7.2.0
  19. 158M /usr/local/aegis
  20. 251M /usr/local/ffmpeg
  21. 4.0K /usr/local/src
  22. 137M /usr/local/node
  23. 334M /usr/local/go
  24. 22M /usr/local/redis
  25. 222M /usr/local/python3.7
  26. 116K /usr/local/include
  27. 50M /usr/local/cloudmonitor
  28. 43M /usr/local/lib
  29. 11M /usr/local/bin
  30. 4.0K /usr/local/libexec
  31. 13M /usr/local/nginx
  32. 9.3M /usr/local/rabbitmq_server
  33. 514M /usr/local/elasticsearch-7.2.0
  34. 16G /usr/local/

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

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

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

解决方案

我们连接mysql

  1. [root@iZbp153yczpm4pp9pjs0u3Z var]# mysql -uroot -p
  2. Enter password:
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is 137691
  5. Server version: 5.6.40-log Source distribution
  6. Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

然后显示文件:

  1. mysql> show master logs;
  2. +------------------+------------+
  3. | Log_name | File_size |
  4. +------------------+------------+
  5. | mysql-bin.000048 | 1073770620 |
  6. | mysql-bin.000049 | 1073765660 |
  7. | mysql-bin.000050 | 1073776600 |
  8. | mysql-bin.000051 | 1073768758 |
  9. | mysql-bin.000052 | 630564306 |
  10. | mysql-bin.000053 | 1073789707 |
  11. | mysql-bin.000054 | 1073760602 |
  12. | mysql-bin.000055 | 1073790453 |
  13. | mysql-bin.000056 | 1073842414 |
  14. | mysql-bin.000057 | 1073969816 |
  15. | mysql-bin.000058 | 1073782837 |
  16. | mysql-bin.000059 | 822121073 |
  17. +------------------+------------+
  18. 12 rows in set (0.00 sec)

然后清理之前没用的日志

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

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

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

  1. [root@iZbp153yczpm4pp9pjs0u3Z mysql]# du -h --max-depth=1
  2. 16K ./docs
  3. 2.8M ./sql-bench
  4. 3.3M ./share
  5. 12K ./data
  6. 185M ./mysql-test
  7. 696K ./man
  8. 40K ./scripts
  9. 36K ./support-files
  10. 1.3G ./var
  11. 948K ./include
  12. 267M ./lib
  13. 539M ./bin
  14. 2.3G .
  15. [root@iZbp153yczpm4pp9pjs0u3Z mysql]# df -h
  16. Filesystem Size Used Avail Use% Mounted on
  17. /dev/vda1 40G 22G 16G 58% /
  18. devtmpfs 909M 0 909M 0% /dev
  19. tmpfs 920M 0 920M 0% /dev/shm
  20. tmpfs 920M 580K 919M 1% /run
  21. tmpfs 920M 0 920M 0% /sys/fs/cgroup
  22. 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 文件,找到

  1. log-bin=mysql-bin
  2. 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:清理所有的日志,但是不包括目标日志,因为从服务器还要跟它同步。

清理日志方法为:

  1. PURGE MASTER LOGS TO 'mysql-bin.010';
  2. PURGE MASTER LOGS BEFORE '2019-08-02 21:00:00';

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



关注TinyMeng博客,更多精彩分享,敬请期待!
 

很赞哦! ()