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