删除复制环境中的bin日志

ann*_*nna 13 mysql replication mysql-5 mysql-5.5

我有一个关于在复制环境中删除二进制日志的问题:

我们有一个有 1 个主站和 2 个从站的环境(运行 mysql 5.5)。有时,我们会在繁重的处理时间内遇到空间问题,从而导致 bin 日志目录已满。日志每 3 天过期一次。我想知道,是否有理由将日志在所有盒子上保存 3 天 - 主机和两个从机?例如,将日志在主服务器上保存 3 天,而在从服务器上保存 1 天是否有意义?最好的方法是什么?

谢谢!

Rol*_*DBA 12

奴隶

如果您的 Slaves 不是 Master,那么 Slaves 根本不需要二进制日志记录。您可以限制从站累积的中继日志空间量。为了限制 4G 的中继日志,relay_log_space_limit在每个 Slave 上添加到 /etc/my/.cnf

[mysqld]
relay_log_space_limit=4G
Run Code Online (Sandbox Code Playgroud)

并重新启动mysql

如果你不能设置它,至少你应该有某种警报来SHOW SLAVE STATUS\G检查Relay_Log_Space(中继日志消耗的总字节数)的值。

掌握

至于Master,你可以设置expire_logs_days为1,但我对你有一个严重的警告......

如果复制中断,您有 1 天的时间来修复它。否则,Master 上的二进制日志可能会轮换,并且您无法运行任何 CHANGE MASTER TO 命令来重新对齐复制。我会expire_logs_days在 3 点离开Master。

建议#1

如果您有任何夜间批量处理要做,也许应该SET SQL_LOG_BIN=0;在会话开始时在主服务器上运行批量处理。当然,这不会复制到 Slave。您可以对两个从站并行执行相同的批量加载。

建议#2

您可以做的另一件事是管理 Master 二进制日志累积。

SHOW SLAVE STATUS\G在两个奴隶上运行。看看Relay_Master_Log_File。这代表了 Master 上的二进制日志,其最后一个命令是在 Slave 上执行的。

*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 10.4.92.250
                Master_User: replicant
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.009677
        Read_Master_Log_Pos: 855227755
             Relay_Log_File: relay-bin.000674
              Relay_Log_Pos: 757296783
      Relay_Master_Log_File: mysql-bin.009590
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB:
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 757296646
            Relay_Log_Space: 94274010765
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: 80561
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

在本例中,Relay_Master_Log_File 是 mysql-bin.009590。在此之前的所有二进制日志都可以从 Master 中删除。你可以在 Master 上运行这个:

PURGE BINARY LOGS TO 'mysql-bin.009590';
Run Code Online (Sandbox Code Playgroud)

这将删除旧日志并仍然保持复制状态。

警告

二进制日志是将所有已完成的 SQL 事务串行编译(如 FIFO 队列)作为 SQL 语句或行更改的文件。中继日志是一个从远程服务器(又名 Master)收集二进制日志条目的文件。

在 MySQL 复制中

  1. Master 必须启用其二进制日志
  2. Slave 编译中继日志
  3. 当一个relay log中的所有SQL都被处理完时,它被删除
  4. 在 Slave 上,当 DB Server 上有多个中继日志时,可能表明复制落后,因为 IO 线程从 Master 收集 SQL 的速度比 SQL 线程可以处理中继日志的速度更快。
  5. 使用relay_log_space_limit可以防止复制堆积并可能填满磁盘。中继日志根据规则 #3 轮换
  6. DB Server 可以既是 Master 又是 Slave。这是 Slave 必须启用二进制日志的唯一情况。在这种情况下,数据库服务器将同时具有二进制日志和中继日志。

如果你故障转移到一个从站,并且你想让它成为一个主站

  • 服务 mysql 停止
  • log-bin=mysql-bin在 Slave 上添加到 /etc/my.cnf
  • 服务 mysql 启动

您必须设置将其他 Slave 复制到新升级的 Master,并确保 Slave 上的数据与新升级的 Master 匹配

更新 2012-08-13 17:47 EDT

根据选项上的MySQL 文档relay-log,您应该定义它。原因如下:

由于 MySQL 解析服务器选项的方式,如果指定此选项,则必须提供一个值;仅当未实际指定选项时才使用默认基本名称。如果使用 --relay-log 选项而不指定值,可能会导致意外行为;此行为取决于使用的其他选项、​​指定它们的顺序以及它们是在命令行还是在选项文件中指定。有关 MySQL 如何处理服务器选项的更多信息,请参阅第 4.2.3 节,“指定程序选项”。