標籤:mysql 主從 主從切換
主庫宕機解決方案
假設發生了突發事件,master宕機,現在的需求是要將192.168.1.102提升為主庫,另外一個為從庫
步驟:
1.確保所有的relay log全部更新完畢,在每個從庫上執行stop slave io_thread; show processlist;直到看到Has read all relay log,則表示從庫更新都執行完畢了
2.登陸所有從庫,查看master.info檔案,對比選擇pos最大的作為新的主庫,這裡我們選擇192.168.1.102為新的主庫
3.登陸192.168.1.102,執行stop slave; 並進入資料庫目錄,刪除master.info和relay-log.info檔案(和reset slave all一樣,以非從庫模式啟動);配置my.cnf檔案,開啟log-bin;如果有log-slaves-updates和read-only則要注釋掉,執行reset master;建立用於同步的使用者並授權slave(最好保持與之前主庫的使用者&密碼一致)
5.登入另外一台從庫,執行stop slave停止同步;串連到新的主庫;start slave;;檢查&測試slave是否同步更新
正常切換主從
1.檢查slave同步狀態
在開始切換之前先對主庫進行鎖表:
flush tables with read lock
(在執行完成後生產環境必須等待所有語句執行完成)
在flush tables with read lock成功獲得鎖之前,必須等待所有語句執行完成(包括SELECT)。所以如果有個慢查詢在執行,或者一個開啟的事務,或者其他進程拿著表鎖,flush tables with read lock就會被阻塞,直到所有的鎖被釋放。請看下面的例子:
mysql> show processlist;+----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+| Id | User | Host | db | Command | Time | State | Info |+----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+| 4 | root | localhost | test | Query | 80 | Sending data | select count(*) from t t1 join t t2 join t t3 join t t4 where t1.b=0 || 5 | root | localhost | test | Query | 62 | Flushing tables | flush tables with read lock || 6 | root | localhost | test | Field List | 35 | Waiting for table | || 7 | root | localhost | test | Query | 0 | NULL | show processlist |+----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+4 rows in set (0.00 sec)
等切換完成後可以釋放鎖
unlock tables
1)在master執行:show processlist;
顯示Master has sent all binlog to slave; waiting for binlog to be updated
2)在slave執行:show processlist;
顯示Slave has read all relay log; waiting for the slave I/O thread to update it
mysql> show slave status \G;
檢查IO及SQL線程是否正常,如果為NO表明同步不一致,需要重新將slave同步保持主從資料一致。
正常切換主從/突發情況切換主從,主要步驟
3)停止slave io線程
在slave執行:
mysql> STOP SLAVE IO_THREAD
mysql> SHOW PROCESSLIST;
確保狀態為:has read all relay log
stop slave io_thread執行,停止主從同步的io進程,不再從主庫同步binlog記錄檔;show processlist;確認所有的sql語句是否都執行完畢,確保同步的資料都更新到庫。
以上都執行完成後可以把slave提升為master:
4)提升slave為master
Stop slave;
Reset master;
Reset slave all; 在5.6.3版本之後
Reset slave; 在5.6.3版本之前
備忘:reset slave all 命令會刪除從庫的 replication 參數,之後 show slave status\G 的資訊返回為空白。(與刪除伺服器上master.info和relay-log.info檔案一樣,使下次重啟庫時以非從庫啟動)
查看slave是否唯讀模式:show variables like ‘read_only‘;
唯讀模式需要修改my.cnf檔案,注釋read-only=1並重啟mysql服務。
或者不重啟使用命令關閉唯讀,但下次重啟後失效:set global read_only=off;
##在從庫建立使用者和授權
grant replication slave on *.* to ‘repl‘@‘‘192.168.0.104‘ identified by ‘xxxx‘
##授權的同步處理的使用者和密碼保持與之前的一致
show master status;
##記錄主庫的binlog日誌和pos位置,給其他從庫建立主從使用。
5)將原來master變為slave
在新的slave上重設binlog:
Reset master;
change master to master_host=‘192.168.0.104‘, ##Master 伺服器Ip
master_port=3306,
master_user=‘repl‘,
master_password=‘xxx‘,
master_log_file=‘master-bin.000001‘, ##Master伺服器產生的日誌
master_log_pos=000001; ##之前記錄的主庫pos位置
start slave; ##啟動slave
show slave status\G; ##查看slave狀態
異常切換(主機故障或者宕機)
1) 在salve執行:
stop slave;
reset master;
查看是否唯讀模式:show variables like ‘read_only‘;
唯讀模式需要修改my.cnf檔案,注釋read-only=1並重啟mysql服務。
或者不重啟使用命令關閉唯讀,但下次重啟後失效:set global read_only=off;
查看show slave status \G;
查看show master status \G;
業務應用上修改為主庫IP地址,測試應用串連是否正常。
##reset master直接去掉主從的配置,以單庫模式運行。
mysql主從切換