Aug 30

安全删除MySQL二进制日志的3种方法

admin , 17:03 , 数据库 » 数据库(MySql) , 评论(0) , 引用(0) , 阅读(3495) , Via 本站原创 | |
搜索
我已经获得阿里云幸运券,准备分享给您。请点击获取  

1:二进制日志
二进制日志记录了所有的DDL(数据定义语言)语句和DML(数据操作语言)语句,但是不记录包括数据查询的语句。语句以“事件”的形式保存,它描述了数据的更改过程,此日志对于

灾难时的数据恢复起着极其重要的作用
2:日志的位置和格式
当用—log-bin[=file_name]选项启动时,mysqld将包含所有更新数据的SQL命令写入日志文件。如果没有给出file_name值,默认名为主机名后面跟_bin,如果给出了文件名,但没有包

含路劲,则文件默认被写入参数DATADIR(数据目录)指定的目录
3:日志的读取
由于日志以二进制的方式存储,不能直接读取,需要用mysqlbinlog工具来查看,语法如下:
#mysqlbinlog log_file
4:日志的删除
对于比较繁忙的OLTP系统,由于每天生产日志量大,这些日志如果长时间不清理,将会对磁盘空间带来很大的浪费,因此,定期删除日志是DBA维护Mysql数据库的一个重要工作内容,下

面将介绍几种删除日志的常见方法

 

在linux 下,先进入 mysql 如 /usr/local/mysql/bin/mysql -uroot -ppwd
mysql> SHOW MASTER LOGS; //查看所有的二进制日志列表
1.RESET MASTER
可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个新的二进制日志文件
执行“reset master;”命令,该命令将删除所有二进制日志,新日志的编号从“000001” 开始,命令如下
Mysql>reset master;
2.PURGE MASTER LOGS
语法
PURGE {MASTER | BINARY} LOGS TO 'log_name'
PURGE {MASTER | BINARY} LOGS BEFORE 'date'
用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个。
例如:
PURGE MASTER LOGS TO 'mysql-bin.010';
PURGE MASTER LOGS BEFORE '2003-04-02 22:46:26';
BEFORE变量的date自变量可以为'YYYY-MM-DD hh:mm:ss'格式。MASTER和BINARY是同义词。
如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之一,则本语句不会起作用,而是会失败,并伴随一个错误。不过,如果从属服务器是休止的,并且您碰

巧清理了其想要读取的日志之一,则从属服务器启动后不能复制。当从属服务器正在复制时,本语句可以安全运行。您不需要停止它们。
要清理日志,需按照以下步骤:
1.在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
2.使用SHOW MASTER LOGS获得主服务器上的一系列日志。
3.在所有的从属服务器中判定最早的日志。这个是目标日志。如果所有的从属服务器是更新的,这是清单上的最后一个日志。
4.制作您将要删除的所有日志的备份。(这个步骤是自选的,但是建议采用。)
5.清理所有的日志,但是不包括目标日志。


3. expire_logs_days参数
二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。启动时和二进制日志循环时可能删除
expire_logs_days numeric GLOBAL

在my.cnf配置文件【mysqld】段中加入,重启MySQL服务,例:
expire_logs_days=3
删除3天以前的日志

注:当然需要考虑有slave情况下的影响

(2):执行“Purge master logs to ‘mysql-bin.*****’” 命令,该命令将删除“*****” 编号之前的所有日志,下列中删除了“mysql-bin.000001”之前编号的所有日志

Mysql>purge master logs to ‘mysql-bin.000015;

从结果中发现,编号000015之前的所有日志都已经删除
(3):
执行“purge master logs before ‘yyyy-mm-dd hh24:min:ss’”命令,该命令将删除日期为“yyyy-mm-dd hh24:mi:ss”之前产生的所有日志,下列中删除了日期在“2010-05-22

01:00:00”之前的所有日志
Mysql>purge master logs before ‘2010-05-22 01:00:00’’;
(4):设置参数—expire_logs_days=#(days),此参数的含义是设置日志的过期天数,过来指定的天数后日志将会被自动删除,这样将有利于减少DBA管理日志的工作量。

#vi /etc/my.cnf
[mysqld]
--expire_logs_days=3

这样,3天前的日志都会被删除,系统自动删除