开启MySQL
binlog日志的服务器,如果不设置自动清理日志,默认binlog日志一直保留着,时间一长,服务器磁盘空间被binlog日志占满,导致MySQL数据库出错。

   现象:网站访问越来越慢,最后无法访问了,经过检查发现磁盘满了。仔细查询下来确认是由于mysql的binlog太多太大占用了空间。

基本概念 定义:
二进制日志包含了所有更新了数据或者已经潜在更新了数据的所有语句。 作用:
1。二进制日志的主要目的是在恢复使能够最大可能地更新数据库,因为二进制日志包含备份后进行的所有更新。
2。二进制日志还用于在主复制服务器上记录所有将发送给从服务器的语句。
不良影响: 运行服务器时若启用二进制日志则性能大约慢1%。 如何启动: 通过
–log-bin=file选项可以启用 日志位置
>>如果没有指定文件名,则Mysql使用hostname-bin文件.
>>如果指定了相对路径,则假定该路径相对于数据目录
>>Mysql在文件名后添加了数字索引.所以该文件最后的形式为filename.number
如果你在日志名中提供了扩展名(例如,–log-bin=file_name.extension),则扩展名被悄悄除掉并忽略。
更换策略: 使用索引来循环文件,在以下条件将循环至下一个索引 1。服务器重启
2。服务器被更新 3。日志到达了最大日志长度 max_binlog_size
4。日志被刷新 mysql> flush logs; 工具介绍: shell>>mysqlbinlog
[option] binlogFile> newfile 如: D:\mysql\log>mysqlbinlog
binlog.000001 > 1.txt 一个例子: log-bin=”D:/mysql/log/binlog”
那么,在该文件夹下就会有文件D:/mysql/log/binlog.000001等 常见问题
1.如何清除binlog >>>使用下面的两个命令 PURGE {MASTER | BINARY}
LOGS TO ‘log_name’ //log_name不会被清除 PURGE {MASTER | BINARY} LOGS
BEFORE ‘date’ //date不会被清除 实例如下: mysql> purge master logs to
‘binlog.000004′; Query OK, 0 rows affected mysql> purge master logs
before ‘2009-09-22 00:00:00′; Query OK, 0 rows affected
>>>或使用命令 RESET MASTER
删除之前所有的binlog,并重新生成新的binlog 后缀从000001开始
注:如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之一,
则本语句不会起作用,而是会失败,并伴随一个错误。
不过,如果从属服务器是休止的,并且您碰巧清理了其想要读取的日志之一,则从属服务器启动后不能复制。
当从属服务器正在复制时,本语句可以安全运行。您不需要停止它们。
2.记录到二进制日志知的内容配置 binlog-do-db=sales 只记录sales库
binlog-ignore-db=sales 除sales库不记录,其他都记录
但是如果在操作数据库之前,不使用use $dbname 那么所有的SQL都不会记录
如果使用了use
$dbname,那么判断规则取决于这里的$dbname,而不是SQL中操作的库
3.二进制日志不准确的处理
默认情况下,并不是每次写入时都将二进制日志与硬盘同步。因此如果操作系统或机器崩溃,有可能二进制日志中最后的语句丢失。
要想防止这种情况,你可以使用sync_binlog全局变量,使二进制日志在每N次二进制日志写入后与硬盘同步。
即使sync_binlog设置为1,出现崩溃时,也有可能表内容和二进制日志内容之间存在不一致性。
如果崩溃恢复时MySQL服务器发现二进制日志变短了, 如果sync_binlog
=1并且硬盘/文件系统的确能根据需要进行同步则不会发生,则输出错误消息 。
在这种情况下,二进制日志不准确,复制应从主服务器的数据快照开始。

使用下面方法可以安全清理binlog日志

  分析过程及解决方案:通常出现这种问题都应该登录服务器检查磁盘、内存和进程使用的情况,通过top、df
–h和free –m来检查,发现磁盘空间满了。再进一步通过du
–sh对可以的目录进行检查,发现是mysql的binlog占用空间过大。清理binlog的方法如下:

一、没有主从同步的情况下清理日志

  1) 设置日志保留时长expire_logs_days自动删除

mysql -uroot -p123456 -e ‘PURGE MASTER LOGS BEFORE DATE_SUB,INTERVAL 5
DAY)’;

  查看当前日志保存天数:

#mysql 定时清理5天前的binlog

  show variables like ‘%expire_logs_days%’;

mysql -u root -p #进入mysql 控制台

  这个默认是0,也就是logs不过期,可通过设置全局的参数,使他临时生效:

reset master; #重置binlog

  set global expire_logs_days=7;

二、MySQL主从同步下安全清理binlog日志

  设置了只保留7天BINLOG,
下次重启mysql这个参数默认会失败,所以需在my.cnf中设置

1、mysql -u root -p #进入从服务器mysql控制台show slave status\G;
#检查从服务器正在读取哪个日志,有多个从服务器,选择时间最早的一个做为目标日志。2、进入主服务器mysql控制台

  expire_logs_days = 7

show master log; #获得主服务器上的一系列日志PURGE MASTER LOGS TO
‘binlog.000058’; #删除binlog.000005之前的,不包括binlog.000058PURGE
MASTER LOGS BEFORE ‘2016-06-22 13:00:00’; #清除2016-06-22
13:00:00前binlog日志PURGE MASTER LOGS BEFORE DATE_SUB, INTERVAL 3 DAY);
#清除3天前binlog日志

  2) 手动删除BINLOG (purge binary logs)

三、设置自动清理MySQL binlog日志

  用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件

vi /etc/my.cnf #编辑配置

  PURGE {MASTER | BINARY} LOGS TO ‘log_name’

expire_logs_days = 15 #自动删除15天前的日志。默认值为0,表示从不删除。log-bin=mysql-bin #注释掉之后,会关闭binlog日志binlog_format=mixed #注释掉之后,会关闭binlog日志

  PURGE {MASTER | BINARY} LOGS BEFORE ‘date’

mysql> help purge;

  例如:

Name: ‘PURGE BINARY LOGS’

  PURGE MASTER LOGS TO ‘mysql-bin.010’;

Description:

  PURGE MASTER LOGS BEFORE ‘2008-06-22 13:00:00’;

PURGE { BINARY | MASTER } LOGS

  PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);

{ TO ‘log_name’ | BEFORE datetime_expr }

分析过程…

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注