一 主從故障怎么解決
1.登錄從庫(kù)
1、執(zhí)行stop slave;停止主從同步
2、然后set global sql_slave_skip_counter = 1;跳過(guò)一步錯(cuò)誤
3、最后執(zhí)行 start slave;并查看主從同步狀態(tài)
2.需要重新進(jìn)行主從同步操作步驟如下
進(jìn)入主庫(kù)
1、進(jìn)行全備數(shù)據(jù)庫(kù)并刷新binlog,查看主庫(kù)此的狀態(tài)
2、恢復(fù)全備文件到從庫(kù),然后執(zhí)行change master
3、開(kāi)啟主從同步start slave;并查看主從同步狀態(tài)
二.怎么監(jiān)控主從是否故障
mysql -uroot -ppassowrd -e "show slave status\G" |grep -E "Slave_IO_Running|Slave_SQL_Running"|awk '{print $2}'|grep -c Yes
通過(guò)判斷Yes的個(gè)數(shù)來(lái)監(jiān)控主從復(fù)制狀態(tài),正常情況等于2
三.全備、增備、冷備、熱備概念
全備:數(shù)據(jù)庫(kù)所有數(shù)據(jù)的一次完整備份,也就是備份當(dāng)前數(shù)據(jù)庫(kù)的所有數(shù)據(jù)
增備:就在上次備份的基礎(chǔ)上備份到現(xiàn)在所有新增的數(shù)據(jù)
冷備:停止服務(wù)的基礎(chǔ)上進(jìn)行備份操作
熱備:實(shí)行在線進(jìn)行備份操作,不影響數(shù)據(jù)庫(kù)的正常運(yùn)行
全備在企業(yè)中基本上是每周或天一次,其它時(shí)間是進(jìn)行增量備份
熱備使用的情況是有兩臺(tái)數(shù)據(jù)庫(kù)在同時(shí)提供服務(wù)的情況,針對(duì)歸檔模式的數(shù)據(jù)庫(kù)
冷備使用情況有企業(yè)初期,數(shù)據(jù)量不大且服務(wù)器數(shù)量不多,可能會(huì)執(zhí)行某些庫(kù)、表結(jié)構(gòu)等重大操作時(shí)
四.mysql主從復(fù)制原理流程
(1)、復(fù)制基本原理流程
1. 主:binlog線程——記錄下所有改變了數(shù)據(jù)庫(kù)數(shù)據(jù)的語(yǔ)句,放進(jìn)master上的binlog中;
2. 從:io線程——在使用start slave 之后,負(fù)責(zé)從master上拉取 binlog 內(nèi)容,放進(jìn) 自己的relay log中;
3. 從:sql執(zhí)行線程——執(zhí)行relay log中的語(yǔ)句;
(2)、MySQL復(fù)制的線程有幾個(gè)及之間的關(guān)聯(lián)
MySQL 的復(fù)制是基于如下 3 個(gè)線程的交互( 多線程復(fù)制里面應(yīng)該是 4 類(lèi)線程):
- Master 上面的 binlog dump 線程,該線程負(fù)責(zé)將 master 的 binlog event 傳到slave;
- Slave 上面的 IO 線程,該線程負(fù)責(zé)接收 Master 傳過(guò)來(lái)的 binlog,并寫(xiě)入 relay log;
- Slave 上面的 SQL 線程,該線程負(fù)責(zé)讀取 relay log 并執(zhí)行;
- 如果是多線程復(fù)制,無(wú)論是 5.6 庫(kù)級(jí)別的假多線程還是 MariaDB 或者 5.7 的真正的多線程復(fù)制, SQL 線程只做 coordinator,只負(fù)責(zé)把 relay log 中的 binlog讀出來(lái)然后交給 worker 線程, woker 線程負(fù)責(zé)具體 binlog event 的執(zhí)行;
(3)、MySQL如何保證復(fù)制過(guò)程中數(shù)據(jù)一致性及減少數(shù)據(jù)同步延時(shí)
一致性主要有以下幾個(gè)方面:
1.在 MySQL5.5 以及之前, slave 的 SQL 線程執(zhí)行的 relay log 的位置只能保存在文件( relay-log.info)里面,并且該文件默認(rèn)每執(zhí)行 10000 次事務(wù)做一次同步到磁盤(pán), 這意味著 slave 意外 crash 重啟時(shí), SQL 線程執(zhí)行到的位置和數(shù)據(jù)庫(kù)的數(shù)據(jù)是不一致的,將導(dǎo)致復(fù)制報(bào)錯(cuò),如果不重搭復(fù)制,則有可能會(huì)
導(dǎo)致數(shù)據(jù)不一致。 MySQL 5.6 引入?yún)?shù) relay_log_info_repository,將該參數(shù)設(shè)置為 TABLE 時(shí), MySQL 將 SQL 線程執(zhí)行到的位置存到mysql.slave_relay_log_info 表,這樣更新該表的位置和 SQL 線程執(zhí)行的用戶事務(wù)綁定成一個(gè)事務(wù),這樣 slave 意外宕機(jī)后, slave 通過(guò) innodb 的崩潰
恢復(fù)可以把 SQL 線程執(zhí)行到的位置和用戶事務(wù)恢復(fù)到一致性的狀態(tài)。
- MySQL 5.6 引入 GTID 復(fù)制,每個(gè) GTID 對(duì)應(yīng)的事務(wù)在每個(gè)實(shí)例上面最多執(zhí)行一次, 這極大地提高了復(fù)制的數(shù)據(jù)一致性;
- MySQL 5.5 引入半同步復(fù)制, 用戶安裝半同步復(fù)制插件并且開(kāi)啟參數(shù)后,設(shè)置超時(shí)時(shí)間,可保證在超時(shí)時(shí)間內(nèi)如果 binlog 不傳到 slave 上面,那么用戶提交事務(wù)時(shí)不會(huì)返回,直到超時(shí)后切成異步復(fù)制,但是如果切成異步之前用戶線程提交時(shí)在 master 上面等待的時(shí)候,事務(wù)已經(jīng)提交,該事務(wù)對(duì) master
上面的其他 session 是可見(jiàn)的,如果這時(shí) master 宕機(jī),那么到 slave 上面該事務(wù)又不可見(jiàn)了,該問(wèn)題直到 5.7 才解決; - MySQL 5.7 引入無(wú)損半同步復(fù)制,引入?yún)?rpl_semi_sync_master_wait_point,該參數(shù)默認(rèn)為 after_sync,指的是在切成半同步之前,事務(wù)不提交,而是接收到 slave 的 ACK 確認(rèn)之后才提交該事務(wù),從此,復(fù)制真正可以做到無(wú)損的了。
5.可以再說(shuō)一下 5.7 的無(wú)損復(fù)制情況下, master 意外宕機(jī),重啟后發(fā)現(xiàn)有 binlog沒(méi)傳到 slave 上面,這部分 binlog 怎么辦???分 2 種情況討論, 1 宕機(jī)時(shí)已經(jīng)切成異步了, 2 是宕機(jī)時(shí)還沒(méi)切成異步??? 這個(gè)怎么判斷宕機(jī)時(shí)有沒(méi)有切成異步呢??? 分別怎么處理???
延時(shí)性:
5.5 是單線程復(fù)制, 5.6 是多庫(kù)復(fù)制(對(duì)于單庫(kù)或者單表的并發(fā)操作是沒(méi)用的), 5.7 是真正意義的多線程復(fù)制,它的原理是基于 group commit, 只要
master 上面的事務(wù)是 group commit 的,那 slave 上面也可以通過(guò)多個(gè) worker線程去并發(fā)執(zhí)行。 和 MairaDB10.0.0.5 引入多線程復(fù)制的原理基本一樣。