硬重启导致 MySQL 复制中断

硬重启导致 MySQL 复制中断

我的复制设置出现了问题。在正常情况下,它按预期运行,但如果遇到硬重启(我拔掉电源线),它就会崩溃。

设置

该设置由两台服务器组成,服务器-1服务器-2。复制设置是循环复制。两个服务器都是从属服务器,从另一台主机复制数据,就好像它是主服务器一样。

软件

  • 红帽 6.5
  • MySQL 5.1.73-3
  • MySQL 库 5.1.73-3
  • MySQL 服务器 5.1.73-3

冗余配置

复制配置如下服务器-1,并且镜像为服务器-2

GRANT REPLICATION SLAVE ON *.* TO 'replicant';
FLUSH TABLES WITH READ LOCK;"

#Use "SHOW MASTER STATUS \G;" to determine log position and log file

UNLOCK TABLES;

# set status on slave server using the values retieved earlier
CHANGE MASTER TO MASTER_HOST='server-2', MASTER_USER='replicant', MASTER_LOG_FILE='[log file]', MASTER_LOG_POS=[log pos];"

START SLAVE;

错误信息

此信息是在服务器-2遇到了硬重启并且复制被破坏。

server-1 从属状态

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: server-2
                  Master_User: replicant
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: bin.000004
          Read_Master_Log_Pos: 37550
               Relay_Log_File: relay.000427
                Relay_Log_Pos: 245
        Relay_Master_Log_File: bin.000004
             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: 37550
              Relay_Log_Space: 529
              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: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 

server-2 从属状态

*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: server-1
                  Master_User: replicant
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: bin.000002
          Read_Master_Log_Pos: 7208
               Relay_Log_File: relay.000010
                Relay_Log_Pos: 245
        Relay_Master_Log_File: bin.000002
             Slave_IO_Running: No
            Slave_SQL_Running: No
              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: 7208
              Relay_Log_Space: 529
              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: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 

来自server-2 mysql-log-error.log的相关信息

这些日志来自导致复制失败的启动

150821 12:52:35 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
150821 12:52:35  InnoDB: Initializing buffer pool, size = 8.0M
150821 12:52:35  InnoDB: Completed initialization of buffer pool
InnoDB: The log sequence number in ibdata files does not match
InnoDB: the log sequence number in the ib_logfiles!
150821 12:52:35  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
InnoDB: Last MySQL binlog file position 0 106, file name /var/lib/mysql/bin.000002
150821 12:52:35  InnoDB: Started; log sequence number 0 259987
150821 12:52:35 [Note] Recovering after a crash using /var/lib/mysql/bin
150821 12:52:35 [Note] Starting crash recovery...
150821 12:52:35 [Note] Crash recovery finished.
150821 12:52:35 [ERROR] log  listed in the index, but failed to stat
150821 12:52:35 [ERROR] Error counting relay log space
150821 12:52:35 [ERROR] Failed to initialize the master info structure
150821 12:52:35 [Note] Event Scheduler: Loaded 0 events
150821 12:52:35 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.1.73-log'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  Source distribution  

复制者访问

为了收集信息并解决问题,我尝试过的方法之一是尝试访问服务器-1服务器-2复制者用户。这次尝试没有成功,我得到了一个“拒绝访问“ 信息。

因此,我研究了服务器-2,并得到如下信息。

SHOW GRANTS FOR "replicant"@"server-1";
ERROR 1141 (42000) at line 1: There is no such grant defined for user 'replicant' on host 'server-1;'

我试图找到解决办法

我尝试解决这个问题,但至今没有结果。无论我怎么尝试,MySQL 总是给出相同的答案。

ERROR 1201 (HY000) at line 1: Could not initialize master info structure; more error messages can be found in the MySQL error log

我尝试过的任何配置、FLUSH、RESET 或日志操作都导致此错误消息,当我尝试“启动从站;“ 或者 ”更改主人为...",让复制再次开始。

复制服务器-1

制作服务器-2副本服务器-1很有希望。我明白服务器-2工作,但是服务器-1无法复制服务器-2。我使用以下步骤复制服务器。

  1. 停止 mysqld 服务服务器-2
  2. 清除/var/lib/mysql/服务器-2
  3. 同步/var/lib/mysql/服务器-1服务器-2
  4. 更改 master 主机服务器-2成为服务器-1
  5. 启动 mysqld 服务服务器-2

看起来这个方法有效服务器-2, 但服务器-1无法复制服务器-2。我在从属状态中看到以下内容服务器-1

  Slave_IO_state: Waiting to reconnect after a failed master even read
Slave_IO_Running: No

我在错误日志中发现此服务器-1

[Note] Slave I/O thread: Failed reading log event, reconnecting to retry, log 'FIRST' at position 4
[ERROR] Error reading packet from server: Access denied; you need the REPLICATION SLAVE privilege for this operation ( server_errno=1227)

我已经检查了复制者两台服务器上的用户均没有发生改变。

mysql> SHOW GRANTS FOR 'replicant';
+---------------------------------------------------+
| Grants for replicant@%                            |
+---------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'replicant'@'%' |
+---------------------------------------------------+
1 row in set (0.00 sec)

这好像是服务器-1无法访问日志服务器-2。我尝试了以下方法来修复这个问题。

  • 重置主控;+重置从站;在两台服务器上,然后使用更改主人为...;
  • 改变主日志文件主日志位置服务器-1之前同步以匹配主状态服务器-1
  • 尝试各种排列组合主日志文件主日志位置我能想到的操纵。

答案1

我继续研究这个问题,并提出了一个对我有用的解决方案。

解决方案

该解决方案假设服务器-2是复制中断的服务器。如果出现以下情况,则需要镜像此解决方案服务器-1是服务器坏了。

  1. 禁用两台服务器上的传入连接
    • 显示完整流程清单;应该只显示本地主机与“显示完整进程列表”状态的连接,也许还有一些系统用户条目
    • 实现此目的的一种方法是向 mysql 服务分配一个非默认 3306 的新端口,或者如果您指定了端口,请将其更改为其他端口。
      • 例如添加“端口=33060“到[mysqld]/etc/my.cnf
  2. 在两台服务器上,防止复制从属进程在服务器启动时启动
    1. 添加 ”跳过从属启动“到[mysqld]/etc/my.cnf
    2. 重启mysql服务器
      • 服务 mysqld 重启
  3. 重置从属和主配置服务器-1
    • 重置从站;
    • 重置主控;
  4. 创建数据库副本服务器-1并将其复制到服务器-2
    1. 使用读锁刷新表;
    2. mysqldump --databases [复制数据库] ... > ./dump.sql
    3. 解锁桌子;
    4. scp ./dump.sql [用户]@server-2:/home/[用户]/
  5. 将数据导入数据库服务器-2
    • 以 root 身份,mysql < /home/[用户]/dump.sql
  6. 重置从属和主配置服务器-2
    • 重置从站;
    • 重置主控;
  7. 在两台服务器上配置复制从属
    • 服务器-1将 MASTER 更改为 MASTER_HOST='server-2'、MASTER_USER='replicant'、MASTER_LOG_FILE="bin.000001"、MASTER_LOG_POS=1;
    • 服务器-2将 MASTER 更改为 MASTER_HOST='server-1'、MASTER_USER='replicant'、MASTER_LOG_FILE="bin.000001"、MASTER_LOG_POS=1;
  8. 如果您收到以下错误服务器-2错误 1201 (HY000):无法初始化主信息结构;更多错误消息可在 MySQL 错误日志中找到
    • 删除中继mysql中继文件,并尝试步骤67再次。
    • rm-rf /var/lib/relay*
  9. 在两台服务器上启用传入连接
    • 恢复步骤1
    • 重启mysql服务器
      • 服务 mysqld 重启
  10. 在两台服务器上启动复制从属
    • 启动从站;
  11. 复制现在应该可以正常工作。在两台服务器上验证其运行状况
    • 显示从属状态\G;
      • 从属 IO 状态不应该指示错误
      • 从属 IO 运行从属 SQL 运行都应该在是的状态
  12. 清理
    • 消除跳过从属启动进入自/etc/my.cnf在两台服务器上
      • 不需要重新启动mysql服务器
    • 删除转储文件两个服务器上的文件

相关内容