《MYSQL數(shù)據(jù)庫MySQL主從復(fù)制的原理及配置方法(比較詳細(xì))》要點(diǎn):
本文介紹了MYSQL數(shù)據(jù)庫MySQL主從復(fù)制的原理及配置方法(比較詳細(xì)),希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
MYSQL入門一、復(fù)制的原理
MYSQL入門MySQL 復(fù)制基于主服務(wù)器在二進(jìn)制日志中跟蹤所有對(duì)數(shù)據(jù)庫的更改(更新、刪除等等).每個(gè)從服務(wù)器從主服務(wù)器接收主服務(wù)器已經(jīng)記錄到其二進(jìn)制日志的保存的更新,以便從服務(wù)器可以對(duì)其數(shù)據(jù)拷貝執(zhí)行相同的更新.
MYSQL入門將主服務(wù)器的數(shù)據(jù)拷貝到從服務(wù)器的一個(gè)途徑是使用LOAD DATA FROM MASTER語句.請(qǐng)注意LOAD DATA FROM MASTER目前只在所有表使用MyISAM存儲(chǔ)引擎的主服務(wù)器上工作.并且,該語句將獲得全局讀鎖定.
MYSQL入門MySQL 使用3個(gè)線程來執(zhí)行復(fù)制功能,其中1個(gè)在主服務(wù)器上,另兩個(gè)在從服務(wù)器上.當(dāng)發(fā)出START SLAVE時(shí),從服務(wù)器創(chuàng)建一個(gè)I/O線程,以連接主服務(wù)器并讓它發(fā)送記錄在其二進(jìn)制日志中的語句.
主服務(wù)器創(chuàng)建一個(gè)線程將二進(jìn)制日志中的內(nèi)容發(fā)送到從服務(wù)器.該線程可以識(shí)別為主服務(wù)器上SHOW PROCESSLIST的輸出中的Binlog Dump線程.
從服務(wù)器I/O線程讀取主服務(wù)器Binlog Dump線程發(fā)送的內(nèi)容并將該數(shù)據(jù)拷貝到從服務(wù)器數(shù)據(jù)目錄中的本地文件中,即中繼日志.???
第3個(gè)線程是SQL線程,是從服務(wù)器創(chuàng)建用于讀取中繼日志并執(zhí)行日志中包含的更新.
有多個(gè)從服務(wù)器的主服務(wù)器創(chuàng)建為每個(gè)當(dāng)前連接的從服務(wù)器創(chuàng)建一個(gè)線程;每個(gè)從服務(wù)器有自己的I/O和SQL線程.
MYSQL入門二、復(fù)制線程的狀態(tài)
MYSQL入門1.復(fù)制主線程的狀態(tài)
MYSQL入門2.復(fù)制從I/O線程狀態(tài)
MYSQL入門Checking master version
建立同主服務(wù)器之間的連接后立即臨時(shí)出現(xiàn)的狀態(tài).
MYSQL入門Registering slave on master
建立同主服務(wù)器之間的連接后立即臨時(shí)出現(xiàn)的狀態(tài).
MYSQL入門Requesting binlog dump
建立同主服務(wù)器之間的連接后立即臨時(shí)出現(xiàn)的狀態(tài).線程向主服務(wù)器發(fā)送一條請(qǐng)求,索取從請(qǐng)求的二進(jìn)制日志文件名和位置開始的二進(jìn)制日志的內(nèi)容.
MYSQL入門Waiting to reconnect after a failed binlog dump request
如果二進(jìn)制日志轉(zhuǎn)儲(chǔ)請(qǐng)求失敗(由于沒有連接),線程進(jìn)入睡眠狀態(tài),然后定期嘗試重新連接.可以使用Cmaster-connect-retry選項(xiàng)指定重試之間的間隔.
MYSQL入門Reconnecting after a failed binlog dump request
線程正嘗試重新連接主服務(wù)器.
MYSQL入門Waiting for master to send event
線程已經(jīng)連接上主服務(wù)器,正等待二進(jìn)制日志事件到達(dá).如果主服務(wù)器正空閑,會(huì)持續(xù)較長(zhǎng)的時(shí)間.如果等待持續(xù)slave_read_timeout秒,則發(fā)生超時(shí).此時(shí),線程認(rèn)為連接被中斷并企圖重新連接.
MYSQL入門Queueing master event to the relay log
線程已經(jīng)讀取一個(gè)事件,正將它復(fù)制到中繼日志供SQL線程來處理.
MYSQL入門Waiting to reconnect after a failed master event read
讀取時(shí)(由于沒有連接)出現(xiàn)錯(cuò)誤.線程企圖重新連接前將睡眠master-connect-retry秒.
MYSQL入門Reconnecting after a failed master event read
線程正嘗試重新連接主服務(wù)器.當(dāng)連接重新建立后,狀態(tài)變?yōu)閃aiting for master to send event.
MYSQL入門Waiting for the slave SQL thread to free enough relay log space
正使用一個(gè)非零relay_log_space_limit值,中繼日志已經(jīng)增長(zhǎng)到其組合大小超過該值.I/O線程正等待直到SQL線程處理中繼日志內(nèi)容并刪除部分中繼日志文件來釋放足夠的空間.
MYSQL入門Waiting for slave mutex on exit
線程停止時(shí)發(fā)生的一個(gè)很簡(jiǎn)單的狀態(tài).
MYSQL入門3.復(fù)制從SQL線程狀態(tài)
MYSQL入門Has read all relay log; waiting for the slave I/O thread to update it
線程已經(jīng)處理了中繼日志文件中的所有事件,現(xiàn)在正等待I/O線程將新事件寫入中繼日志.
MYSQL入門Waiting for slave mutex on exit
線程停止時(shí)發(fā)生的一個(gè)很簡(jiǎn)單的狀態(tài).
MYSQL入門三、復(fù)制傳遞和狀態(tài)文件
MYSQL入門從服務(wù)器靠中繼日志來接收從主服務(wù)器上傳回來的日志.并依靠狀態(tài)文件來記錄已經(jīng)從主服務(wù)器接收了哪些日志,已經(jīng)恢復(fù)了哪些日志.
MYSQL入門中繼日志與二進(jìn)制日志的格式相同,并且可以用mysqlbinlog讀取.SQL線程執(zhí)行完中繼日志中的所有事件并且不再需要之后,立即自動(dòng)刪除它.可以采用Crelay-log和Crelay-log-index服務(wù)器選項(xiàng)覆蓋默認(rèn)中繼日志和索引文件名.其中索引文件名的作用是記錄目前正在使用中繼日志.
MYSQL入門在下面的條件下將創(chuàng)建新的中繼日志:
1.每次I/O線程啟動(dòng)時(shí)創(chuàng)建一個(gè)新的中繼日志.
2.當(dāng)日志被刷新時(shí);例如,用FLUSH LOGS或mysqladmin flush-logs.
3.當(dāng)當(dāng)前的中繼日志文件變得太大時(shí).“太大”含義的確定方法:
max_relay_log_size,如果max_relay_log_size > 0
max_binlog_size,如果max_relay_log_size = 0
狀態(tài)文件名默認(rèn)為master.info和relay-log.info.其中IO線程更新master.info文件,SQL線程更新relay-log.info文件.
文件中的行和SHOW SLAVE STATUS顯示的列的對(duì)應(yīng)關(guān)系為:
master.info文件:
MYSQL入門relay-log.info文件:
MYSQL入門當(dāng)備份從服務(wù)器的數(shù)據(jù)時(shí),你還應(yīng)備份這兩個(gè)小文件以及中繼日志文件.它們用來在恢復(fù)從服務(wù)器的數(shù)據(jù)后繼續(xù)進(jìn)行復(fù)制.如果丟失了中繼日志但仍然有 relay-log.info文件,你可以通過檢查該文件來確定SQL線程已經(jīng)執(zhí)行的主服務(wù)器中二進(jìn)制日志的程度.然后可以用 Master_Log_File和Master_LOG_POS選項(xiàng)執(zhí)行CHANGE MASTER TO來告訴從服務(wù)器重新從該點(diǎn)讀取二進(jìn)制日志.當(dāng)然,要求二進(jìn)制日志仍然在主服務(wù)器上.所以最好建議將自動(dòng)刪除中繼日志的特性關(guān)閉,手工寫shell角本來防止空間滿的問題.
MYSQL入門四、復(fù)制的配置步驟
MYSQL入門1.創(chuàng)建專門用于復(fù)制的用戶(建議這樣做),從服務(wù)器采用該帳戶登陸主服務(wù)器:
MYSQL入門2.將數(shù)據(jù)庫文件移到從服務(wù)器上
情況一:若只用到MyISAM表
MYSQL入門可能不需要同步 mysql 數(shù)據(jù)庫,因?yàn)樵趕lave上的權(quán)限表和master不一樣.這時(shí),解開壓縮包的時(shí)候要排除它.
同時(shí)在壓縮包中也不要包含任何日志文件,和狀態(tài)文件master.info、relay-log.info.
MYSQL入門mysql> UNLOCK TABLES;
MYSQL入門情況二:若用到InnoDB表
方法一:使用InnoDB Hot Backup工具.它無需在master上請(qǐng)求任何鎖就能做到快照的一致性,并且在后面中在slave上要用到的快照中已經(jīng)記錄了日志文件名以及偏移位置.
方法二:記錄當(dāng)前日志文件及偏移位置,在master關(guān)閉前執(zhí)行:
MYSQL入門3.修改my.cnf文件
在master上my.cnf文件:(重啟生效)
MYSQL入門配置slave的擴(kuò)展選項(xiàng)
MYSQL入門服務(wù)器認(rèn)為master.info的優(yōu)先級(jí)比配置文件my.cnf高,
第一次啟動(dòng)slave時(shí),master.info不存在,它從my.cnf中讀取選項(xiàng)值,然后把它們保存在master.info中.
下次重啟slave時(shí),它只讀取master.info的內(nèi)容,而不會(huì)讀取my.cnf中的選項(xiàng)值.
想要使用不同的選項(xiàng)值,可以刪除master.info后重啟slave,或者使用CHANGE MASTER TO語句(推薦)重置選項(xiàng)值.
4.啟動(dòng)從服務(wù)器線程
MYSQL入門mysql> START SLAVE;
MYSQL入門注釋:為了保證事務(wù)InnoDB復(fù)制設(shè)置的最大可能的耐受性和一致性,
應(yīng)在主服務(wù)器的my.cnf文件中使用innodb_flush_log_at_trx_commit=1和sync-binlog=1.
MYSQL入門在啟動(dòng)mysql的同時(shí)啟動(dòng)slave:
MYSQL入門mysql> SHOW SLAVE STATUSG;
MYSQL入門5.切換slave為master,在slave上:
MYSQL入門Cread_only
該選項(xiàng)讓從服務(wù)器只允許來自從服務(wù)器線程或具有SUPER權(quán)限的用戶的更新.可以確保從服務(wù)器不接受來自客戶的更新.
MYSQL入門Creplicate_do_db=db_name
告訴從服務(wù)器只做默認(rèn)數(shù)據(jù)庫(由USE所選擇)為db_name的語句的復(fù)制.要指定多個(gè)數(shù)據(jù)庫,應(yīng)多次使用該選項(xiàng),每個(gè)數(shù)據(jù)庫使用一次.請(qǐng)注意不復(fù)制跨數(shù)據(jù)庫的語句
MYSQL入門Creplicate_do_table=db_name.tbl_name
告訴從服務(wù)器線程只做對(duì)指定表的復(fù)制.要指定多個(gè)表,應(yīng)多次使用該選項(xiàng),每個(gè)表使用一次.同Creplicate-do-db對(duì)比,允許跨數(shù)據(jù)庫更新.
MYSQL入門Creplicate_ignore_db=db_name
告訴從服務(wù)器不要復(fù)制默認(rèn)數(shù)據(jù)庫(由USE所選擇)為db_name的語句.要想忽略多個(gè)數(shù)據(jù)庫,應(yīng)多次使用該選項(xiàng),每個(gè)數(shù)據(jù)庫使用一次.
MYSQL入門Creplicate-ignore-table=db_name.tbl_name
告訴從服務(wù)器線程不要復(fù)制更新指定表的任何語句(即使該語句可能更新其它的表).要想忽略多個(gè)表,應(yīng)多次使用該選項(xiàng),每個(gè)表使用一次.
MYSQL入門Creplicate_wild_do_table=db_name.tbl_name
告訴從服務(wù)器線程限制復(fù)制更新的表匹配指定的數(shù)據(jù)庫和表名模式的語句.模式可以包含‘%'和‘_'通配符,與LIKE模式匹配操作符具有相同的含義.要指定多個(gè)表,應(yīng)多次使用該選項(xiàng),每個(gè)表使用一次.該選項(xiàng)可以跨數(shù)據(jù)庫進(jìn)行更新.
MYSQL入門Creplicate_wild_ignore_table=db_name.tbl_name
告訴從服務(wù)器線程不要復(fù)制表匹配給出的通配符模式的語句.要想忽略多個(gè)表,應(yīng)多次使用該選項(xiàng),每個(gè)表使用一次.該選項(xiàng)可以跨數(shù)據(jù)庫進(jìn)行更新.
MYSQL入門Creplicate_rewrite_db=from_name->to_name
告訴從服務(wù)器如果默認(rèn)數(shù)據(jù)庫(由USE所選擇)為主服務(wù)器上的from_name,則翻譯為to_name.只影響含有表的語句
MYSQL入門Creport_host=slave_name
從服務(wù)器注冊(cè)過程中報(bào)告給主服務(wù)器的主機(jī)名或IP地址.該值出現(xiàn)在主服務(wù)器上SHOW SLAVE HOSTS的輸出中.如果不想讓從服務(wù)器自己在主服務(wù)器上注冊(cè),則不設(shè)置該值.
MYSQL入門Creport_port=slave_port
連接從服務(wù)器的TCP/IP端口號(hào),從服務(wù)器注冊(cè)過程中報(bào)告給主服務(wù)器.
MYSQL入門Cskip_slave_start
告訴從服務(wù)器當(dāng)服務(wù)器啟動(dòng)時(shí)不啟動(dòng)從服務(wù)器線程.使用START SLAVE語句在以后啟動(dòng)線程.
MYSQL入門Cslave_skip_errors=[err_code1,err_code2,… | all]
通常情況,當(dāng)出現(xiàn)錯(cuò)誤時(shí)復(fù)制停止,這樣給你一個(gè)機(jī)會(huì)手動(dòng)解決數(shù)據(jù)中的不一致性問題.該選項(xiàng)告訴從服務(wù)器SQL線程當(dāng)語句返回任何選項(xiàng)值中所列的錯(cuò)誤時(shí)繼續(xù)復(fù)制.
例如:
Cslave-skip-errors=1062,1053
Cslave-skip-errors=all
MYSQL入門六、不停機(jī)配置復(fù)制的方法
MYSQL入門方法一:
如果你在某時(shí)間點(diǎn)做過主服務(wù)器備份并且記錄了相應(yīng)快照的二進(jìn)制日志名和偏移量(通過SHOW MASTER STATUS命令的輸出),采用下面的步驟:
MYSQL入門1. 確保從服務(wù)器分配了一個(gè)唯一的服務(wù)器ID號(hào).
2. 將備份文件拷到從服務(wù)器上.
3. 在從服務(wù)器上執(zhí)行下面的語句,為每個(gè)選項(xiàng)填入適當(dāng)?shù)闹担?br>
MYSQL入門4.在從服務(wù)器上執(zhí)行START SLAVE語句.
MYSQL入門如果你沒有備份主服務(wù)器,這里是一個(gè)創(chuàng)建備份的快速程序.所有步驟都應(yīng)該在主服務(wù)器主機(jī)上執(zhí)行.
MYSQL入門1. 發(fā)出該語句:
MYSQL入門方法二:
MYSQL入門一個(gè)可選擇的方法是,轉(zhuǎn)儲(chǔ)主服務(wù)器的SQL來代替前面步驟中的二進(jìn)制復(fù)制.要這樣做,你可以在主服務(wù)器上使用mysqldump Cmaster-data,以后裝載SQL轉(zhuǎn)儲(chǔ)到到你的從服務(wù)器.然而,這比進(jìn)行二進(jìn)制復(fù)制速度慢.
MYSQL入門七、其他
MYSQL入門1.不能從使用新二進(jìn)制日志格式的主服務(wù)器向使用舊二進(jìn)制日志格式的從服務(wù)器復(fù)制.
2.升級(jí)從服務(wù)器時(shí),應(yīng)先關(guān)閉從服務(wù)器,升級(jí)到相應(yīng)5.1.x版本,然后重啟從服務(wù)器并重新開始復(fù)制.5.1版本的從服務(wù)器能夠讀取升級(jí)前寫入的舊的中繼日志并執(zhí)行日志中包含的語句.升級(jí)后從服務(wù)器創(chuàng)建的中繼日志為5.1格式.
MYSQL入門3.必須在主服務(wù)器和從服務(wù)器上總是使用相同的全局字符集和校對(duì)規(guī)則(Cdefault-character-set、Cdefault- collation).否則,會(huì)在從服務(wù)器上遇到復(fù)制鍵值錯(cuò)誤,因?yàn)樵谥鞣?wù)器的字符集中被認(rèn)為是唯一的鍵值在從服務(wù)器的字符集中可能不是唯一的.
4.Q:從服務(wù)器需要始終連接到主服務(wù)器嗎?
A:不,不需要.從服務(wù)器可以宕機(jī)或斷開連接幾個(gè)小時(shí)甚至幾天,重新連接后獲得更新信息.
MYSQL入門5.Q:我怎樣知道從服務(wù)器與主服務(wù)器的最新比較? 換句話說,我怎樣知道從服務(wù)器復(fù)制的最后一個(gè)查詢的日期?
A:你可以查看SHOW SLAVE STATUS語句的Seconds_Behind_Master列的結(jié)果.
MYSQL入門6. Q:我怎樣強(qiáng)制主服務(wù)器阻塞更新直到從服務(wù)器同步?
A:使用下面的步驟:
1. 在主服務(wù)器上,執(zhí)行這些語句:
MYSQL入門2.在從服務(wù)器上,發(fā)出下面的語句,其中Master_POS_WAIT()函數(shù)的參量是前面步驟中的得到的復(fù)制坐標(biāo)值:
mysql> SELECT MASTER_POS_WAIT('log_name', log_offset);
SELECT語句阻塞直到從服務(wù)器達(dá)到指定的日志文件和偏移量.此時(shí),從服務(wù)器與主服務(wù)器同步,語句返回.
MYSQL入門3.在主服務(wù)器上,發(fā)出下面的語句允許主服務(wù)器重新開始處理更新:
MYSQL入門7.Q:怎樣通過復(fù)制來提高系統(tǒng)的性能?
A:你應(yīng)將一個(gè)服務(wù)器設(shè)置為主服務(wù)器并且將所有寫指向該服務(wù)器.然后根據(jù)預(yù)算配置盡可能多的從服務(wù)器以及棧空間,并且在主服務(wù)器和從服務(wù)器之間分發(fā)讀取操作.你也可以用Cskip-innodb、Cskip-bdb、Clow-priority-updates以及Cdelay-key- write=ALL選項(xiàng)啟動(dòng)從服務(wù)器,以便在從服務(wù)器端提高速度.在這種情況下,為了提高速度,從服務(wù)器使用非事務(wù)MyISAM表來代替InnoDB和 BDB表.
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/5487.html