MySQL對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)進(jìn)行復(fù)制的基本過(guò)程詳解
復(fù)制
復(fù)制是從一個(gè)MySQL服務(wù)器(master)將數(shù)據(jù)拷貝到另外一臺(tái)或多臺(tái)MySQL服務(wù)器(slaves)的過(guò)程.復(fù)制是異步進(jìn)行的--slaves服務(wù)器不需要持續(xù)地保持連接來(lái)接收master的數(shù)據(jù).依據(jù)配置的不同,可以復(fù)制所有數(shù)據(jù)庫(kù),或指定的數(shù)據(jù)庫(kù),甚至是某一數(shù)據(jù)庫(kù)指定的表.
使用復(fù)制功能的目的在于:
向外擴(kuò)展的解決方案 -- 通過(guò)在多臺(tái)服務(wù)器之間分散負(fù)載來(lái)提高性能.在這種環(huán)境下,所有寫和更新操作都在master服務(wù)器上進(jìn)行,而讀操作則發(fā)生在一臺(tái)或多臺(tái)slaves服務(wù)器上.
數(shù)據(jù)安全 -- 因?yàn)閿?shù)據(jù)是被復(fù)制到slave上的,并且slave可以暫停復(fù)制過(guò)程,因此可以在不破壞master數(shù)據(jù)的前提下在slave服務(wù)器上進(jìn)行備份
分析 -- 實(shí)時(shí)數(shù)據(jù)在master上創(chuàng)建,然而數(shù)據(jù)分析卻可以slave服務(wù)器上進(jìn)行,且不會(huì)影響master的性能
長(zhǎng)距離數(shù)據(jù)分布 -- 如果分公司需要主公司的數(shù)據(jù)復(fù)本進(jìn)行工作,就可以通過(guò)復(fù)制創(chuàng)建一個(gè)本地復(fù)本,從而不需要長(zhǎng)久地訪問(wèn)master服務(wù)器
MySQL的復(fù)制是單向異步的,這與MySQL Cluster的同步復(fù)制特性正好相反.MySQL5.5支持半同步(semisynchronous),即在master上的提交之后,并不是立即返回,而是等待至少有一個(gè)slave確認(rèn)說(shuō)已經(jīng)收到和記錄了當(dāng)前事務(wù)之后,再返回.
最好的復(fù)制方法與數(shù)據(jù)的展現(xiàn)方式及所選擇的存儲(chǔ)引擎有關(guān),核心的復(fù)制格式有兩種:SBR(Statement Based Replication) -- 復(fù)制所有的SQL語(yǔ)句,和RBR(Row Based Replication) -- 僅復(fù)制被改變的rows. 當(dāng)然也有最三種方案可供選擇:MBR(Mixed Based Replication),這也是MySQL5.5之后版本的默認(rèn)模式.
復(fù)制配置
MySQL服務(wù)器之間的復(fù)制使用的是二進(jìn)制日志機(jī)制.對(duì)master的更新與變動(dòng)都會(huì)作為事件(event)記錄在日志中,日志中的信息會(huì)隨變化的不同被記錄成不同的格式.slaves被配置成從master讀取日志,并且執(zhí)行二進(jìn)制日志中的事件到slave本地?cái)?shù)據(jù)庫(kù).一旦master啟動(dòng)二進(jìn)制日志功能,那么所有語(yǔ)句操作都會(huì)被記錄下來(lái),每一個(gè)slave會(huì)收到一份整個(gè)日志內(nèi)容的拷貝.slave的責(zé)任就是決定日志中的哪條語(yǔ)句需要被執(zhí)行,而我們不能通過(guò)配置master來(lái)僅僅記錄某些特定的事件.如果您沒(méi)有另行指定,在主服務(wù)器二進(jìn)制日志中的所有事件都在slave上執(zhí)行.如果需要,還可以配置slave僅應(yīng)用來(lái)自于特定數(shù)據(jù)庫(kù)或表的事件.
每個(gè)slave都會(huì)保持一份二進(jìn)制日志文件的記錄,且記錄其已經(jīng)讀取和處理過(guò)記錄的位置.這表明,多個(gè)slaves可以連接到master,并且執(zhí)行日志的不同部分,因?yàn)閟lave自己來(lái)控制這個(gè)過(guò)程,單個(gè)slave的斷開(kāi)與連接,不會(huì)影響master的操作.同時(shí)也正因?yàn)槊總€(gè)slave會(huì)記錄二進(jìn)制日志中的位置,所以slaves可以斷開(kāi),重連,然后從記錄的位置開(kāi)始起上.
Master和每一個(gè)slave都必須賦予一個(gè)唯一的ID(可能使用server_id),另外,還必須告知slave其master的主機(jī),日志文件名和位置(position).可以在會(huì)話中通過(guò)CHANGE MASTER TO來(lái)改變,詳細(xì)信息會(huì)記錄在master.info文件中.
1. 如何啟動(dòng)復(fù)制
1.1 創(chuàng)建一個(gè)用于復(fù)制的用戶
每個(gè)slave都必須使用標(biāo)準(zhǔn)MySQL用戶名和密碼連接到master,任何帳號(hào)都可以,只要被授予了REPLICATION SLAVE權(quán)限.雖然創(chuàng)建一個(gè)單獨(dú)用于復(fù)制的用戶并不是必須的,但是你需要清楚的是用于復(fù)制的帳號(hào)的用戶名與密碼都是用明文的方式存儲(chǔ)在master.info中的,因此出于安全的考慮還是創(chuàng)建一個(gè)的好.如:
mysql>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.158.1.100' IDENTIFIED BY 'testpass';
即創(chuàng)建了一個(gè)用戶名為"repl",密碼為"testpass"的帳號(hào),所有的slaves都可以使用同一個(gè)帳號(hào),當(dāng)然我們也可以為每一個(gè)slave都創(chuàng)建一個(gè)登錄帳號(hào).
1.2 配置Master
首先,必須得開(kāi)啟master的二進(jìn)制日志功能,其次為master設(shè)置一個(gè)唯一的server-id -- 1~p, li { white-space: pre-wrap; }232-1 之間的正整數(shù).如在my.cnf或my.ini中作如下設(shè)置:
[mysqld] log-bin=master-bin server-id=1
需要注意的是:為了在使用InnoDB事務(wù)時(shí)創(chuàng)建復(fù)制達(dá)到最大可能的穩(wěn)定及一致,你需要使用:innodb_flush_log_at_trx_commit=1和sync_binlog=1兩個(gè)選項(xiàng).并同時(shí)確保:skip-networking=0否則slave與master就無(wú)法通信了.
1.3配置Slave
在slave上我們唯一需要配置的就是為slave指定一個(gè)唯一的server-id. Slave上的二進(jìn)制日志功能的開(kāi)啟不必須的,但開(kāi)啟可以用來(lái)作slave上的數(shù)據(jù)備份或?yàn)?zāi)難數(shù)據(jù)恢復(fù),同時(shí)也可以使用slave作為更復(fù)雜復(fù)制拓?fù)浼軜?gòu)的一部分(如:某個(gè)slave作為其它slaver的master時(shí)).
1.4 獲取Master信息
為了配置slave復(fù)制,你需要知道m(xù)aster在其二進(jìn)制日志中的當(dāng)前位置,這樣當(dāng)slave開(kāi)始復(fù)制過(guò)程時(shí),就知道從當(dāng)前這個(gè)點(diǎn)開(kāi)始處理事件了.如果在master上已經(jīng)存在數(shù)據(jù),且這些數(shù)據(jù)需要在開(kāi)始復(fù)制之前同步到其它slaves上,那么你就得讓master停止處理語(yǔ)句,獲得當(dāng)前位置,然后導(dǎo)出數(shù)據(jù).為了得到master的狀態(tài)信息,需要通過(guò)下面的步驟:
執(zhí)行:
mysql>FLUSH TABLES WITH READ LOCK
來(lái)阻止所有的寫操作,包括InnoDB的commit操作. 需要注意的此時(shí)只有退出了連接客戶端這個(gè)"鎖"才能被釋放掉.
通過(guò):
mysql>SHOW MASTER STATUS
來(lái)確定當(dāng)前的二進(jìn)制日志文件及位移量(offset)
p, li { white-space: pr
1.5 在Slave上配置Master信息
mysql> CHANGE MASTER TO -> MASTER_HOST='master_host_name', -> MASTER_USER='replication_user_name', -> MASTER_PASSWORD='replication_password', -> MASTER_LOG_FILE='master_bin_log_file_name', -> MASTER_LOG_POS='recorded_log_position';
2. 復(fù)制格式的選擇
每種二進(jìn)制日志格式都有自己的優(yōu)缺點(diǎn),對(duì)大多數(shù)用戶來(lái)說(shuō),MBR提供了最好的效果.但當(dāng)需要為某些特定任務(wù)選取SBR或RBR時(shí),可以通過(guò)下面的比較來(lái)決定哪一個(gè)更適合:
SBR的優(yōu)勢(shì):
從MySQL3.23開(kāi)始,就被證明了的技術(shù)
更少的數(shù)據(jù)寫入日志. 當(dāng)更新或刪除影響到很多行時(shí),SBR會(huì)使用更少的存儲(chǔ)空間,這也意味著在導(dǎo)入或恢復(fù)時(shí)需要更少的時(shí)間
日志文件包含所有的語(yǔ)句操作所作的變動(dòng),因此可以用來(lái)審計(jì)數(shù)據(jù)庫(kù)
SBR的劣勢(shì):
語(yǔ)句表述(Statements)對(duì)SBR來(lái)說(shuō)是不安全的,不是所有修改數(shù)據(jù)的語(yǔ)句都可以使用SBR復(fù)制.任何為確定的行為都很難被復(fù)制,如具有LIMIT或ORDER BY的DELETE或UPDATE
INSERT ... SELECT 比RBR需要更多數(shù)量的行鎖定
需要掃描整個(gè)表的UPDATE(因?yàn)闆](méi)有在WHERE中使用索引)比RBR要鎖定更多的行
對(duì)InnoDB,使用了AUTO_INCREMENT的INSERT會(huì)阻塞其它非沖突的INSERT
對(duì)于復(fù)雜的語(yǔ)句,slave在更新或插入之前必須先進(jìn)行評(píng)估和執(zhí)行,而RBR只需要運(yùn)行語(yǔ)句應(yīng)用不同就可以了
存儲(chǔ)過(guò)程執(zhí)行同樣的NOW()
確定的UDFs必須被應(yīng)用到所有的slaves上
master與slave上的表必須(幾乎)相同
RBR的優(yōu)勢(shì):
所有的改變都能被復(fù)制,這是最安全的復(fù)制模式. 但mysql數(shù)據(jù)庫(kù)不會(huì)被復(fù)制,mysql會(huì)被認(rèn)為是一個(gè)特殊節(jié)點(diǎn)數(shù)據(jù)庫(kù)
這種技術(shù)與很多其它數(shù)據(jù)庫(kù)管理系統(tǒng)一樣,因此可以許多在其它系統(tǒng)上的認(rèn)知,都可以轉(zhuǎn)移到MySQL上來(lái)
Master需要更少的鎖定來(lái)執(zhí)行:INSERT ... SELECT,INSERT中有AUTO_INCREMENT,以及WHERE中沒(méi)有使用鍵值的 UPDATE/DELETE
Slaves在執(zhí)行INSERT,UPDATE/DELETE時(shí),需要更少的鎖定
RBR的劣勢(shì):
RBR勢(shì)必會(huì)產(chǎn)生更多的日志數(shù)據(jù)
你不能通過(guò)log知道什么語(yǔ)句被執(zhí)行了,然后你卻可以通過(guò)mysqlbinlog查看什么數(shù)據(jù)被改變了
相關(guān)命令
- mysql>show slave hosts -- 查看所有連接到Master的Slave信息
- mysql>show master status -- 查看Master狀態(tài)信息
- mysql>show slave status -- 查看Slave狀態(tài)信息
- mysql>show binary logs -- 查看所有二進(jìn)制日志
- mysql>show binlog events [IN log_file] -- 查看二進(jìn)制日志中的事件
相關(guān)文章
CentOS系統(tǒng)下編譯安裝MySQL以及設(shè)置相關(guān)yum源的教程
這篇文章主要介紹了CentOS系統(tǒng)下編譯安裝MySQL以及設(shè)置相關(guān)yum源的教程,使用RedHat系的Linux系統(tǒng)為環(huán)境的都可以借鑒,需要的朋友可以參考下2015-12-12Mysql主從同步Last_IO_Errno:1236錯(cuò)誤解決方法
最近遇到Mysql主從同步的Last_IO_Errno:1236錯(cuò)誤問(wèn)題,然后在網(wǎng)上查找相關(guān)解決方案,這里分享給大家,供參考。2017-10-10解決MySQL讀寫分離導(dǎo)致insert后select不到數(shù)據(jù)的問(wèn)題
這篇文章主要介紹了解決MySQL讀寫分離導(dǎo)致insert后select不到數(shù)據(jù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12mysql數(shù)據(jù)庫(kù)鏈接失敗常見(jiàn)問(wèn)題及解決
這篇文章主要介紹了mysql數(shù)據(jù)庫(kù)鏈接失敗常見(jiàn)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11