mysql主從同步常見異常及恢復(fù)方法

10年積累的網(wǎng)站制作、網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)制作后付款的網(wǎng)站建設(shè)流程,更有札達(dá)免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
1. 一般的異常只需要跳過一步即可恢復(fù)
slave stop;
SET GLOBAL sql_slave_skip_counter = 1;
slave start;
2.斷電導(dǎo)致主從不能同步時(shí),通主庫的最后一個(gè)bin-log日志進(jìn)行恢復(fù)
在主庫服務(wù)器上,mysqlbinlog mysql-bin.xxxx binxxxx.txt
tail -n 100000 binxxxx.txt tail-binxxxx.txt
vim tail-binxxxx.txt 打開tail-binxxxx.txt文件找到最后一個(gè)postion值
然后在從庫上,change host to 相應(yīng)正確的值
slave stop;
change master to master_host='ip', master_user='username', master_password='password', master_log_file='mysql-bin.xxxx', master_log_pos=xxxx;
slave start;
show slave status\G;
3.主鍵沖突、表已存在等錯(cuò)誤代碼如1062,1032,1060等,可以在mysql主配置文件指定
略過此類異常并繼續(xù)下條sql同步,這樣也可以避免很多主從同步的異常中斷
[mysqld]
slave-skip-errors = 1062,1032,1060
MySQL 主從一直是面試常客,里面的知識(shí)點(diǎn)雖然基礎(chǔ),但是能回答全的同學(xué)不多。
比如樓哥之前面試小米,就被問到過主從復(fù)制的原理,以及主從延遲的解決方案,因?yàn)榛卮鸬姆浅2诲e(cuò),給面試官留下非常好的印象。你之前面試,有遇到過哪些 MySQL 主從的問題呢?
所謂 MySQL 主從,就是建立兩個(gè)完全一樣的數(shù)據(jù)庫,一個(gè)是主庫,一個(gè)是從庫, 主庫對(duì)外提供讀寫的操作,從庫對(duì)外提供讀的操作 ,下面是一主一從模式:
對(duì)于數(shù)據(jù)庫單機(jī)部署,在 4 核 8G 的機(jī)器上運(yùn)行 MySQL 5.7 時(shí),大概可以支撐 500 的 TPS 和 10000 的 QPS, 當(dāng)遇到一些活動(dòng)時(shí),查詢流量驟然,就需要進(jìn)行主從分離。
大部分系統(tǒng)的訪問模型是讀多寫少,讀寫請(qǐng)求量的差距可能達(dá)到幾個(gè)數(shù)量級(jí),所以我們可以通過一主多從的方式, 主庫只負(fù)責(zé)寫入和部分核心邏輯的查詢,多個(gè)從庫只負(fù)責(zé)查詢,提升查詢性能,降低主庫壓力。
MySQL 主從還能做到服務(wù)高可用,當(dāng)主庫宕機(jī)時(shí),從庫可以切成主庫,保證服務(wù)的高可用,然后主庫也可以做數(shù)據(jù)的容災(zāi)備份。
整體場景總結(jié)如下:
MySQL 的主從復(fù)制是依賴于 binlog 的,也就是記錄 MySQL 上的所有變化并以二進(jìn)制形式保存在磁盤上二進(jìn)制日志文件。
主從復(fù)制就是將 binlog 中的數(shù)據(jù)從主庫傳輸?shù)綇膸焐希话氵@個(gè)過程是異步的,即主庫上的操作不會(huì)等待 binlog 同步的完成。
詳細(xì)流程如下:
當(dāng)主庫和從庫數(shù)據(jù)同步時(shí),突然中斷怎么辦?因?yàn)橹鲙炫c從庫之間維持了一個(gè)長鏈接,主庫內(nèi)部有一個(gè)線程,專門服務(wù)于從庫的這個(gè)長鏈接的。
對(duì)于下面的情況,假如主庫執(zhí)行如下 SQL,其中 a 和 create_time 都是索引:
我們知道,數(shù)據(jù)選擇了 a 索引和選擇 create_time 索引,最后 limit 1 出來的數(shù)據(jù)一般是不一樣的。
所以就會(huì)存在這種情況:在 binlog = statement 格式時(shí),主庫在執(zhí)行這條 SQL 時(shí),使用的是索引 a,而從庫在執(zhí)行這條 SQL 時(shí),使用了索引 create_time,最后主從數(shù)據(jù)不一致了。
那么我們改如何解決呢?
可以把 binlog 格式修改為 row,row 格式的 binlog 日志記錄的不是 SQL 原文,而是兩個(gè) event:Table_map 和 Delete_rows。
Table_map event 說明要操作的表,Delete_rows event用于定義要?jiǎng)h除的行為,記錄刪除的具體行數(shù)。 row 格式的 binlog 記錄的就是要?jiǎng)h除的主鍵 ID 信息,因此不會(huì)出現(xiàn)主從不一致的問題。
但是如果 SQL 刪除 10 萬行數(shù)據(jù),使用 row 格式就會(huì)很占空間的,10 萬條數(shù)據(jù)都在 binlog 里面,寫 binlog 的時(shí)候也很耗 IO。但是 statement 格式的 binlog 可能會(huì)導(dǎo)致數(shù)據(jù)不一致。
設(shè)計(jì) MySQL 的大叔想了一個(gè)折中的方案,mixed 格式的 binlog,其實(shí)就是 row 和 statement 格式混合使用, 當(dāng) MySQL 判斷可能數(shù)據(jù)不一致時(shí),就用 row 格式,否則使用就用 statement 格式。
有時(shí)候我們遇到從數(shù)據(jù)庫中獲取不到信息的詭異問題時(shí),會(huì)糾結(jié)于代碼中是否有一些邏輯會(huì)把之前寫入的內(nèi)容刪除,但是你又會(huì)發(fā)現(xiàn),過了一段時(shí)間再去查詢時(shí)又可以讀到數(shù)據(jù)了,這基本上就是主從延遲在作怪。
主從延遲,其實(shí)就是“從庫回放” 完成的時(shí)間,與 “主庫寫 binlog” 完成時(shí)間的差值, 會(huì)導(dǎo)致從庫查詢的數(shù)據(jù),和主庫的不一致 。
談到 MySQL 數(shù)據(jù)庫主從同步延遲原理,得從 MySQL 的主從復(fù)制原理說起:
總結(jié)一下主從延遲的主要原因 :主從延遲主要是出現(xiàn)在 “relay log 回放” 這一步,當(dāng)主庫的 TPS 并發(fā)較高,產(chǎn)生的 DDL 數(shù)量超過從庫一個(gè) SQL 線程所能承受的范圍,那么延時(shí)就產(chǎn)生了,當(dāng)然還有就是可能與從庫的大型 query 語句產(chǎn)生了鎖等待。
我們一般會(huì)把從庫落后的時(shí)間作為一個(gè)重點(diǎn)的數(shù)據(jù)庫指標(biāo)做監(jiān)控和報(bào)警,正常的時(shí)間是在毫秒級(jí)別,一旦落后的時(shí)間達(dá)到了秒級(jí)別就需要告警了。
解決該問題的方法,除了縮短主從延遲的時(shí)間,還有一些其它的方法,基本原理都是盡量不查詢從庫。
具體解決方案如下:
在實(shí)際應(yīng)用場景中,對(duì)于一些非常核心的場景,比如庫存,支付訂單等,需要直接查詢從庫,其它非核心場景,就不要去查主庫了。
兩臺(tái)機(jī)器 A 和 B,A 為主庫,負(fù)責(zé)讀寫,B 為從庫,負(fù)責(zé)讀數(shù)據(jù)。
如果 A 庫發(fā)生故障,B 庫成為主庫負(fù)責(zé)讀寫,修復(fù)故障后,A 成為從庫,主庫 B 同步數(shù)據(jù)到從庫 A。
一臺(tái)主庫多臺(tái)從庫,A 為主庫,負(fù)責(zé)讀寫,B、C、D為從庫,負(fù)責(zé)讀數(shù)據(jù)。
如果 A 庫發(fā)生故障,B 庫成為主庫負(fù)責(zé)讀寫,C、D負(fù)責(zé)讀,修復(fù)故障后,A 也成為從庫,主庫 B 同步數(shù)據(jù)到從庫 A。
創(chuàng)建數(shù)據(jù)庫
選擇開始菜單中→程序→【Management sql Server 2008】→【sql Server Management Studio】命令,打開【sql Server Management Studio】窗口,并使用Windows或 sql Server身份驗(yàn)證建立連接。
在【對(duì)象資源管理器】窗口中展開服務(wù)器,然后選擇【數(shù)據(jù)庫】節(jié)點(diǎn)
右鍵單擊【數(shù)據(jù)庫】節(jié)點(diǎn),從彈出來的快捷菜單中選擇【新建數(shù)據(jù)庫】命令。
執(zhí)行上述操作后,會(huì)彈出【新建數(shù)據(jù)庫】對(duì)話框。在對(duì)話框、左側(cè)有3個(gè)選項(xiàng),分別是【常規(guī)】、【選項(xiàng)】和【文件組】。完成這三個(gè)選項(xiàng)中的設(shè)置會(huì)后,就完成了數(shù)據(jù)庫的創(chuàng)建工作,
在【數(shù)據(jù)庫名稱】文本框中輸入要新建數(shù)據(jù)庫的名稱。例如,這里以“新建的數(shù)據(jù)庫”。
在【所有者】文本框中輸入新建數(shù)據(jù)庫的所有者,如sa。根據(jù)數(shù)據(jù)庫的使用情況,選擇啟用或者禁用【使用全文索引】復(fù)選框。
1、需要對(duì)MYSQL定時(shí)備份
2、應(yīng)用中交換數(shù)據(jù)時(shí),要判斷是否聯(lián)網(wǎng),如果不聯(lián)網(wǎng)就把信息先保存在本地,等聯(lián)網(wǎng)后再
與MYSQL數(shù)據(jù)同步。
3、應(yīng)用中注意使用事務(wù)
可以手動(dòng)將應(yīng)用的數(shù)據(jù)庫配置修改為從機(jī)的配置(ip、port、數(shù)據(jù)庫名),然后重啟服務(wù)。
可以使用半同步復(fù)制,可以降低損失,另外可以采用最新的MySQL5.7里面可以實(shí)現(xiàn)無損復(fù)制
網(wǎng)頁標(biāo)題:mysql主從宕機(jī)怎么辦,mysql主從失敗
URL網(wǎng)址:http://chinadenli.net/article49/dseodhh.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、網(wǎng)站維護(hù)、關(guān)鍵詞優(yōu)化、App設(shè)計(jì)、域名注冊(cè)、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)