我白痴重新引导用作MySQL从一台机器,而无需运行STOP SLAVE,FLUSH 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但不知道要跳过多少,我需要一个一个地进行,这可能需要一整天。
您需要做的主要事情留在评论中:
按照在 MySQL slave中重复条目中的建议进行操作:
Run Code Online (Sandbox Code Playgroud)STOP SLAVE; SET GLOBAL sql_slave_skip_counter=1; START SLAVE;
但是,这里是如何使用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_File和Exec_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_File和Exec_Master_Log_Pos从SHOW 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)