備注:測試數(shù)據(jù)庫版本為MySQL 8.0
這個(gè)blog我們來聊聊MySQL 主從切換
概述
有時(shí)需要把從庫指向一個(gè)新的主庫。例如滾動(dòng)升級服務(wù)器玖媚,或者主庫出現(xiàn)問題時(shí)需要把一臺從庫轉(zhuǎn)換成主庫∠保可以使用CHANGE MASTER TO語句告訴從庫連接新的主庫履澳。從庫不檢查主庫上的數(shù)據(jù)庫是否與從庫上現(xiàn)有的數(shù)據(jù)庫兼容嚣伐,它只是從新主庫二進(jìn)制日志中的指定坐標(biāo)開始讀取和執(zhí)行事件赂毯。這種主從角色轉(zhuǎn)換可以粗略地分為計(jì)劃內(nèi)和計(jì)劃外兩種战虏。
一.計(jì)劃內(nèi)的切換
1.停止當(dāng)前主庫的寫操作
也可以考慮 flush tables with read lock 阻止主庫的寫入
也可以考慮如下shell腳本拣宰,干掉主庫所有的連接,生產(chǎn)環(huán)境要慎重活烙,如果有運(yùn)行中的大事務(wù)徐裸,可能還要等事務(wù)進(jìn)行回滾
較新版本的MySQL,需要在配置文件中設(shè)置secure_file_priv參數(shù)啸盏,并重啟mysql后才能執(zhí)行數(shù)據(jù)導(dǎo)出操作。
#!/bin/bash
source ~/.bashrc
rm -rf /tmp/kill.sql
mysql -u root -p123456 -P3306 -h127.0.0.1 -e "select * into outfile '/tmp/kill.sql' from (select 'set global read_only=on;' union all select concat('kill ',id,';') from information_schema.processlist where command='sleep' ) t; "
mysql -u root -p123456 -P3306 -h127.0.0.1 < /tmp/kill.sql
- 選擇一個(gè)備庫作為新的主庫骑祟,并確保它已經(jīng)完全跟上主庫(執(zhí)行完所有中繼日志)回懦。
- 確保新主庫和舊主庫數(shù)據(jù)一致〈纹螅可選怯晕。例如在兩個(gè)庫上執(zhí)行“mysqldump -uroot --skip-dump-date | md5sum”,檢查校驗(yàn)和是否相同缸棵。
- 在新主庫上執(zhí)行stop slave舟茶。
- 在新主庫上執(zhí)行reset slave all,使其斷開與老主庫的連接堵第。
- 執(zhí)行show master status記錄新主庫的二進(jìn)制日志坐標(biāo)吧凉。
- 確保其它從庫已經(jīng)追上就主庫。
- 關(guān)閉舊主庫踏志。
- 如果需要阀捅,在新主庫上執(zhí)行set global read_only=on使其可寫。
10.在每臺從庫上執(zhí)行change master to語句针余,使用前面第(7)步獲得的二進(jìn)制坐標(biāo)饲鄙,來指向新主庫。
11.將客戶端連接到新主庫圆雁。
二.計(jì)劃外切換
當(dāng)主庫崩潰時(shí)忍级,需要提升一個(gè)從庫來替代它。如果只有一個(gè)從庫伪朽,那別無選擇轴咱,只能使用這臺備庫。但如果有超過一個(gè)的從庫驱负,就需要做一些額外工作嗦玖。對主從拓?fù)浣Y(jié)構(gòu)中的從庫進(jìn)行提升的過程可以簡單描述如下:
1.讓所有從庫執(zhí)行完其從崩潰前的舊主庫獲得的中繼日志。
2.選擇并設(shè)置新主庫跃脊。
3.查找其它所有從庫最后執(zhí)行的事件宇挫,在新主庫上對應(yīng)的二進(jìn)制坐標(biāo)。
4.其它所有從庫重置復(fù)制酪术,按上一步獲得的二進(jìn)制坐標(biāo)連接到新主庫器瘪,啟動(dòng)新復(fù)制翠储。