linux下安全删除MySQL二进制日志

作者:莫问前程 发布于:2013-9-18 11:31 Wednesday 分类:数据库

 

!!!删除日志文件前一定要先停止mysqld的服务(说多了都是泪啊)!!

 

如果只有一台MySQL服务器则登录MySQL后:

#删除某个日志之前的日志
PURGE BINARY LOGS TO 'mysql-bin.110';
#或删除某个时间点以前的日志
PURGE BINARY LOGS BEFORE '2011-05-05 00:30:00';

或者flush logs;reset master;

如果是主从数据库,则登录MySQL后:

#在所有从库上检查它正在读取哪个日志,执行SHOW SLAVE STATUS;#清理日志PURGE MASTER LOGS BEFORE '2011-05-05 00:30:00';#然后在主服务器上执行PURGE BINARY LOGS BEFORE '2011-05-05 00:30:00';

自动清理:

#配置my.cnf


2

#增加expire_logs_days = 天数

3

#例如保留5

4

expire_logs_days = 5

mysql bin-log日志清理 

1.查看档案

mysql> show binary logs;

+----------------+-----------+

| Log_name | File_size |

+----------------+-----------+

| ablelee.000001 | 150462942 |

| ablelee.000002 | 125 |

| ablelee.000003 | 106 |

+----------------+-----------+



2.删除bin-log(删除ablelee.000003之前的而没有包含ablelee.000003)

mysql> purge binary logs to 'ablelee.000003';

Query OK, 0 rows affected (0.16 sec)



3. 查询结果(现在只有一条记录了.)

mysql> show binlog events\G

*************************** 1. row ***************************

Log_name: ablelee.000003

Pos: 4

Event_type: Format_desc

Server_id: 1

End_log_pos: 106

Info: Server ver: 5.1.26-rc-log, Binlog ver: 4

1 row in set (0.01 sec)

(ablelee.000001ablelee.000002已被删除)

mysql> show binary logs;

+----------------+-----------+

| Log_name | File_size |

+----------------+-----------+

| ablelee.000003 | 106 |

+----------------+-----------+

1 row in set (0.00 sec)



(删除的其它格式运用!)

  PURGE {MASTER | BINARY} LOGS TO 'log_name'
  PURGE {MASTER | BINARY} LOGS BEFORE 'date'
  用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个。
  例如:
  PURGE MASTER LOGS TO 'mysql-bin.010';
  PURGE MASTER LOGS BEFORE '2008-06-22 13:00:00';
清除3天前的 binlog
PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);
  BEFORE变量的date自变量可以为'YYYY-MM-DD hh:mm:ss'格式。MASTERBINARY是同义词。
  如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之一,则本语句不会起作用,而是会失败,并伴随一个错误。不过,如果从属服务器是休止的,并且您碰巧清理了其想要读取的日志之一,则从属服务器启动后不能复制。当从属服务器正在复制时,本语句可以安全运行。您不需要停止它们。
  要清理日志,需按照以下步骤:
  1. 在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
  2. 使用SHOW MASTER LOGS获得主服务器上的一系列日志。
  3. 在所有的从属服务器中判定最早的日志。这个是目标日志。如果所有的从属服务器是更新的,这是清单上的最后一个日志。
  4. 制作您将要删除的所有日志的备份。(这个步骤是自选的,但是建议采用。)
  5. 清理所有的日志,但是不包括目标日志。

ports安装了mysql以后,过一段时间发现/var空间不足了,查一下,会发现是mysql-bin.000001mysql-bin.000002等文件占用了空间,那么这些文件是干吗的?这是数据库的操作日志,例如UPDATE一个表,或者DELETE一些数据,即使该语句没有匹配的数据,这个命令也会存储到日志文件中,还包括每个语句执行的时间,也会记录进去的。

这样做主要有以下两个目的:
1:数据恢复
如果你的数据库出问题了,而你之前有过备份,那么可以看日志文件,找出是哪个命令导致你的数据库出问题了,想办法挽回损失。
2:主从服务器之间同步数据
主服务器上所有的操作都在记录日志中,从服务器可以根据该日志来进行,以确保两个同步。

处理方法分两种情况:
1:只有一个mysql服务器,那么可以简单的注释掉这个选项就行了。
vi /etc/my.cnf把里面的log-bin这一行注释掉,重启mysql服务即可。
2:如果你的环境是主从服务器,那么就需要做以下操作了。
A:在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
B:使用SHOW MASTER LOGS获得主服务器上的一系列日志。
C:在所有的从属服务器中判定最早的日志,这个是目标日志,如果所有的从属服务器是更新的,就是清单上的最后一个日志。
D:清理所有的日志,但是不包括目标日志,因为从服务器还要跟它同步。
清理日志方法为:
PURGE MASTER LOGS TO 'mysql-bin.010';
PURGE MASTER LOGS BEFORE '2008-12-19 21:00:00';

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

 

  • v2 cigs
  • BLOG: v2 cigs
  • 2014-01-30 13:44
  • nike id
  • BLOG: nike id
  • 2014-01-21 23:20
  • fitflop
  • BLOG: fitflop
  • 2014-01-21 13:06
  • Oreo 5s
  • BLOG: Oreo 5s
  • 2013-11-23 19:56
  • Oreo 5s
  • BLOG: Oreo 5s
  • 2013-11-23 03:23
  • Oreo 5s
  • BLOG: Oreo 5s
  • 2013-11-22 06:49

发表评论:

38 + 62 =

Powered by 木匠 鲁ICP备88888888号