MySQL Slave 复制:需要确定复制在哪里停止以在正确的位置启动从属

Agl*_*tas 6 mysql replication

我白痴重新引导用作MySQL从一台机器,而无需运行STOP SLAVEFLUSH TABLES第一。

我原以为 MySQL 会在机器重启期间自动处理所有这些,但显然它没有,至少在我使用的配置中没有,因为 SLAVE 没有启动备份。

mysqld确实启动了,但日志中有一条错误消息,表明从属部分由于重复的主键问题而停止。这意味着它正在尝试插入已经添加的数据。

以下是mysql日志中产生的错误:

120104 11:07:54 [Warning] Slave: Duplicate entry '94459' for key 'PRIMARY' Error_code: 1062
120104 11:07:54 [ERROR] Error running query, slave SQL thread aborted.
    Fix the problem, and restart the slave SQL thread with "SLAVE START".
    We stopped at log 'mysql1-bin.000362' position 3384732
Run Code Online (Sandbox Code Playgroud)

如何确定进程需要从主二进制日志中的哪个位置开始运行CHANGE MASTER语句?我知道我可能会使用 跳过日志条目,sql_slave_skip_counter但不知道要跳过多少,我需要一个一个地进行,这可能需要一整天。

Rol*_*DBA 6

您需要做的主要事情留在评论中:

按照在 MySQL slave重复条目中的建议进行操作:

STOP SLAVE;
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;
Run Code Online (Sandbox Code Playgroud)

但是,这里是如何使用CHANGE MASTER TO命令从更好的位置开始。

让我们看一个示例 SHOW SLAVE STATUS\G

               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.4.16.245
                  Master_User: replicant
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.001527
          Read_Master_Log_Pos: 554619670
               Relay_Log_File: relay-bin.004561
                Relay_Log_Pos: 554619815
        Relay_Master_Log_File: mysql-bin.001527
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB: phpmyadmin
           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: 554619670
              Relay_Log_Space: 554620007
              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:
Run Code Online (Sandbox Code Playgroud)

请注意Relay_Master_Log_FileExec_Master_Log_Pos。这些代表日志文件和在 Master 上完成的最后一条 SQL 语句的位置,该语句是在 Slave 上执行的下一行。

所以,CHANGE MASTER TO在这种情况下将是:

CHANGE MASTER TO master_log_file='mysql-bin.001527',master_log_pos=554619670;
Run Code Online (Sandbox Code Playgroud)

对于您的特定情况,您需要在从服务器上执行以下操作:

步骤 01) 在启动时禁用复制的情况下启动 mysql

$ service mysql restart --skip-slave-start
Run Code Online (Sandbox Code Playgroud)

步骤 02) 登录 mysql 并显示从属状态:

mysql> SHOW SLAVE STATUS\G
Run Code Online (Sandbox Code Playgroud)

步骤 03) 获取Relay_Master_Log_FileExec_Master_Log_PosSHOW SLAVE STATUS\G

步骤 04)CHANGE MASTER TO使用Relay_Master_Log_File和运行命令Exec_Master_Log_Pos

这将清除收集的所有中继日志,并使用新的空中继日志开始收集。

步骤 05) mysql> START SLAVE;

步骤 06)mysql> SHOW SLAVE STATUS\G反复观看Seconds_Behind_Master转到 0

步骤 07) 如果复制因错误 1062(重复键)而中断,现在您可以实施@DTest 的建议。然后,转到步骤 06。重复此操作直到Seconds_Behind_Master转到 0。

我们停在日志 'mysql1-bin.000362' 位置 3384732。

这就是你使用的:

CHANGE MASTER TO master_log_file='mysql1-bin.000362'. master_log_pos=3384732;
Run Code Online (Sandbox Code Playgroud)

如果你跑RESET SLAVE在奴隶身上,不要绝望。只需运行CHANGE MASTER TO命令的完整语法版本:

CHANGE MASTER TO
MASTER_HOST='IP Address of Master',
MASTER_PORT=3306,
MASTER_USER='Replication Username',
MASTER_PASSWORD='Replication Password',
MASTER_LOG_FILE='mysql1-bin.000362',
MASTER_LOG_POS=3384732;
Run Code Online (Sandbox Code Playgroud)