Mysql主從複製slave啓動報Slave failed to initialize relay log info structure from the repository

現象:進行Mysql主從複製執行start slave時報ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository,如下圖

在這裏插入圖片描述

原因:由於之前配置過主從備份已經執行過一次change master to命令,這次再次執行change master to,2次的pos值不一樣。下面是MySQL Relay log的基礎知識

  • MySQL Relay log介紹
    在MySQL複製結構下,Slave服務器會產生三種日誌文件,用來保存主庫的二進制日誌事件以及relay log已執行到的位置和狀態。

  • 1、relay log 文件:由IO thread線程從主庫讀取的二進制日誌事件組成,該日誌被Slave上的SQL thread線程執行,從而實現數據的複製。

  • 2、master info log:該文件保存slave連接master的狀態以及配置信息,如用戶名,密碼,日誌執行的位置等。在5.6版本之前,都是使用master.info文件,從5.6開始,通過在my.cnf 中配置 --master-info-repository=TABLE。這些信息會被寫入mysql.slave_master_info 表中,代替原來的master.info文件了。

  • 3、relay log info log:該文件保存slave上relay log的執行位置。在5.6版本之前,都是使用relay-log.info文件,從5.6開始,通過在my.cnf中配置 --relay-log-info-repository=TABLE,使用mysql.slave_relay_log_info表代替原來的文件。每次當slave上執行start slave時,就會讀取該表中的位置信息。

  • 新版本使用表來代替原來的文件,主要爲了crash-safe replication,從而大大提高從庫的可靠性。爲了保證意外情況下從庫的可靠性,mysql.slave_master_info和mysql.slave_relay_log_info表必須爲事務性的表,從5.6.6起,這些表默認使用InnoDB存儲引擎。在5.6.5及之前的版本默認使用MyISAM引擎,可用下面語句進行轉換:
    ALTER TABLE mysql.slave_master_info ENGINE=InnoDB;
    ALTER TABLE mysql.slave_relay_log_info ENGINE=InnoDB;
    【注意】不要試圖手工的更新、插入、刪除以上兩個表的內容,以免出現意料不到的問題

解決方法:通過上面的報錯以及relay log介紹,很容易知道由於mysql.slave_relay_log_info表中保留了以前的複製信息。可以使用Mysql命令reset slave重置slave,reset slave乾的那些事:

  • 1、刪除slave_master_info ,slave_relay_log_info兩個表中數據;
  • 2、刪除所有relay log文件,並重新創建新的relay log文件;
  • 3、不會改變gtid_executed 或者 gtid_purged的值

解決步驟

# 登錄mysql
mysql -uroot -p
# 重置slave
reset slave;
# 執行同步
CHANGE MASTER TO MASTER_HOST='IP地址', MASTER_USER='用戶名', MASTER_PASSWORD='密碼', MASTER_LOG_FILE='binlog',MASTER_LOG_POS=位置;
# 啓動slave
start slave;
# 查看slave狀態
show slave status\G;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章