封尘网

让学习成为一种习惯!

关于mysql服务中的binlog日志问题

根据mysql的同步原理,我们知道主从同步关键因素就是binlog日志;那么这个问题又来了,主服务器每时每刻都会产生写操作,这样一样就会产binlog日志,然后再同步到从服务器上,长久一来服务器上的binlog日志文件由于文件数量过多可能会导致系统无法正常运行,比如:我就经历过由于文件过多把系统中的Inode占用完,导致无法写入;那么如何解决这问题呢?

1.sql命令:RESET MASTER
可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个新的二进制日志文件;

2.sql命令: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是同义词。
如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之一,则本语句不会起作用,而是会失败,并伴随一个错误。不过,如果从属服务器是休止的,并且您碰巧清理了其想要读取的日志之一,则从属服务器启动后不能复制。当从属服务器正在复制时,本语句可以安全运行。您不需要停止它们。

要清理日志,需按照以下步骤:

- 在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
- 使用SHOW MASTER LOGS获得主服务器上的一系列日志。
- 在所有的从属服务器中判定最早的日志。这个是目标日志。如果所有的从属服务器是更新的,这是清单上的最后一个日志。
- 制作您将要删除的所有日志的备份。(这个步骤是自选的,但是建议采用。)
- 清理所有的日志,但是不包括目标日志。
  1. expire_logs_days参数二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。

启动时和二进制日志循环时可能删除expire_logs_daysnumeric GLOBAL

在my.cnf配置文件【mysqld】段中加入,重启MySQL服务,例:
expire_logs_days=3

删除3天以前的日志

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

  • –binlog 以一种更有效的格式,并且是事务安全的方式包含更新日志中可用的所有信息。
  • –binlog 包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句。语句以“事件”的形式保存,它描述数据更改。
  • –binlog 还包含关于每个更新数据库的语句的执行时间信息。它不包含没有修改任何数据的语句。如果你想要记录所有语句(例如,为了识别有问题的查询),你应使用一般查询日志。
  • –binlog 的主要目的是在恢复使能够最大可能地更新数据库,因为 binlog 包含备份后进行的所有更新。
  • –binlog 还用于在主复制服务器上记录所有将发送给从服务器的语句。
    – 运行服务器时若启用 binlog 则性能大约慢1%。但是, binlog 的好处,即用于恢复并允许设置复制超过了这个小小的性能损失。
  • 当–log-bin[=file_name]选项启动时,mysqld写入包含所有更新数据的SQL命令的日志文件。如果未给出file_name值, 默认名为-bin后面所跟的主机名。如果给出了文件名,但没有包含路径,则文件被写入数据目录。建议指定一个文件名。如果你在日志名中提供了扩展名(例如,–log-bin=file_name.extension),则扩展名被悄悄除掉并忽略。

mysqld在每个 binlog 名后面添加一个数字扩展名。每次你启动服务器或刷新日志时该数字则增加。如果当前的日志大小达到max_binlog_size,还会自动创建新的 binlog 。如果你正使用大的事务, binlog 还会超过max_binlog_size:事务全写入一个 binlog 中,绝对不要写入不同的 binlog 中。

为了能够知道还使用了哪个不同的 binlog 文件,mysqld还创建一个 binlog 索引文件,包含所有使用的 binlog 文件的文件名。默认情况下与 binlog 文件的文件名相同,扩展名为’.index’。你可以用–log-bin-index[=file_name]选项更改 binlog 索引文件的文件名。当mysqld在运行时,不应手动编辑该文件;如果这样做将会使mysqld变得混乱。

binlog 格式有一些已知限制,会影响从备份恢复。

默认情况下,并不是每次写入时都将 binlog 与硬盘同步。因此如果操作系统或机器(不仅仅是MySQL服务器)崩溃,有可能 binlog 中最后的语句丢失了。要想防止这种情况,你可以使用sync_binlog全局变量(1是最安全的值,但也是最慢的),使 binlog 在每N次 binlog 写入后与硬盘同步。

那么如何管理 MySQL 的 binlog


1、在 my.ini 中增加下述参数,指定保存更新到 binlog 的数据库:db_name,未在此指定的数据库将不记录 binlog

–binlog-do-db=db_name

2、在 my.ini 中增加下述参数,指定不保存更新到 binlog 的数据库:db_name

–binlog-ignore-db=db_name

3、如果 binlog 已经产生,可以通过 SQL 命令行清除:

要清理日志,需按照以下步骤:

  • 在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
  • 使用SHOW MASTER LOGS获得主服务器上的一系列日志。
  • 在所有的从属服务器中判定最早的日志。这个是目标日志。如果所有的从属服务器是更新的,这是清单上的最后一个日志。
  • 备份您将要删除的所有日志。(但是建议采用。)以备误操作
  • 清理所有的日志,但是不包括目标日志。

提醒:本文最后更新于 2912 天前,文中所描述的信息可能已发生改变,请谨慎使用。