?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
MySQL主從復(fù)制
MySQL主從復(fù)制原理過程
主數(shù)據(jù)庫配置步驟
從數(shù)據(jù)庫配置步驟
MySQL主從復(fù)制生產(chǎn)標準實踐過程
MySQL主從同步配置步驟
定義服務(wù)器角色
數(shù)據(jù)庫環(huán)境準備
主庫上需要執(zhí)行的操作
編輯主庫的配置文件
查看開啟結(jié)果
建立同步賬號密碼
從庫上需要執(zhí)行的操作
將全備導(dǎo)入到數(shù)據(jù)庫
登陸從庫執(zhí)行change master語句
開啟同步
查看是否同步成功語句
一些常用語句
MySQL主從復(fù)制原理要點
生產(chǎn)場景快速配置MySQL主從復(fù)制方案
MySQL線程狀態(tài)
復(fù)制主線程狀態(tài)show processlist\G
復(fù)制從I/O線程狀態(tài)
復(fù)制從SQL線程狀態(tài)
MySQL的主從復(fù)制有利于數(shù)據(jù)庫架構(gòu)的健壯性、提升訪問速度和易于維護管理。
主從服務(wù)器互為備份
主從服務(wù)器讀寫分離分擔網(wǎng)站壓力
根據(jù)服務(wù)器拆分業(yè)務(wù)獨立并分擔壓力
以下簡單描述下MySQL Replication的復(fù)制過程
slave服務(wù)器上執(zhí)行start slave
命令,開啟主從復(fù)制開關(guān);
slave服務(wù)器的IO線程會通過 在Master上授權(quán)的復(fù)制用戶權(quán)限請求連接Master服務(wù)器,并請求從指定binlog日志文件位置(日志文件名和位置在配置主從復(fù)制服務(wù)時執(zhí)行change master 命令時指定)之后發(fā)送binlog日志內(nèi)容;
master服務(wù)器接受來自slave服務(wù)器的IO線程的請求后,master服務(wù)器上負責復(fù)制的IO線程根據(jù)slave服務(wù)器的IO線程請求的信息讀取指定binlog日志文件指定位置之后的binlog日志信息,然后返回給slave的IO線程,返回的信息中除了binlog日志內(nèi)容外,還有本次返回日志內(nèi)容后再master服務(wù)器端的新的binlog文件名稱以及在binlog中的下一個指定更新位置;
當slave服務(wù)器的IO線程獲取到來自master服務(wù)器上IO線程發(fā)送日志內(nèi)容以及日志文件以及位置點后,將binlog日志內(nèi)容一次寫入到slave端自身的relaylog(中繼日志)文件(mysql-relay-bin.xxxxxx)的末尾,并將新的binlog文件名和位置記錄到master-info文件中,以便下次讀取master端新binlog日志時能夠告訴master服務(wù)器需要從新binlog日志的哪個文件哪個位置開始請求新的binlog日志內(nèi)容;
slave服務(wù)器的SQL線程會實時的檢測本地relaylog中新增加的日志內(nèi)容,然后及時的把log文件中的內(nèi)容解析成在master端曾經(jīng)執(zhí)行的SQL語句的內(nèi)容,并在自身的slave服務(wù)器上按語句的順序執(zhí)行應(yīng)用這些SQL語句,應(yīng)用完畢后清理用過的日志;
經(jīng)過上面的過程,就可以確保在master端和slave端執(zhí)行了同樣的SQL語句。當復(fù)制狀態(tài)正常的情況下,master端和slave端的數(shù)據(jù)是完全一樣的,MySQL的同步機制是有一些特殊的情況,具體請參考官方的說明,大多數(shù)情況下,我們不用擔心。
開啟主數(shù)據(jù)庫的binlog(二進制日志功能),并設(shè)置server-id
創(chuàng)建用于同步數(shù)據(jù)的賬號rep
鎖表并查看當前日志名稱和位置(pos)[如果備份時使用了master-info參數(shù)可不鎖表]
備份當前主數(shù)據(jù)庫的全部數(shù)據(jù)(全備)
解鎖主數(shù)據(jù)庫,讓主數(shù)據(jù)庫繼續(xù)提供服務(wù)
繼續(xù)往主數(shù)據(jù)庫寫數(shù)據(jù)
把主數(shù)據(jù)庫備份的全備數(shù)據(jù)恢復(fù)到從數(shù)據(jù)庫
設(shè)置從數(shù)據(jù)庫server-id,并確保這個ID沒有被別的MySQL服務(wù)所使用。
在從數(shù)據(jù)庫上設(shè)置主從同步的相關(guān)信息,如主數(shù)據(jù)庫服務(wù)器的IP地址、端口號、同步賬號、密碼、binlog文件名、binlog位置(pos)點
開始主從同步start slave;
查看是否同步成功,show slave status\G;
準備兩臺數(shù)據(jù)庫環(huán)境,或者單臺多實例環(huán)境,保證能正常啟動和登錄;
配置my.cnf文件,主庫配置log-bin和server-id參數(shù);從庫配置server-id(不能喝主庫和其他從庫一致),一般不開啟
log-bin
從庫功能。(注意:修改完后重啟生效);
登錄主庫使用grant語句增加用于從庫連接主庫同步的賬號,例如:rep并授予
replication slave
同步的權(quán)限;
登錄主庫,使用
flush table with read lock
(在同步的過程中窗口關(guān)閉失效,超時參數(shù)[
interactive_timeout
和
wait_timeout
]到了也失效),然后
show master status
查看binlog的位置狀態(tài);
新增加一個窗口,linux命令行備份或?qū)С鲈袛?shù)據(jù)庫數(shù)據(jù),并拷貝到從庫所在服務(wù)器(如果數(shù)據(jù)量很大,并且允許停機,可以停機打包,而不用
mysqldump
);
unlock tables
解鎖主庫;
把主庫到處的原有數(shù)據(jù)備份恢復(fù)到從庫;
根據(jù)主庫的
show master; status
查看到的binlog日志文件名和位置信息,在從庫上執(zhí)行
change master to ...
語句;
從庫
start slave
開啟同步開關(guān);
從庫
show slave status\G
檢查同步狀態(tài),并在主庫進行更新測試。
注意:
5.1版本的MySQL版本的鎖表語句是flush tables with read lock;
5.5版本的MySQL的鎖表語句是flush table with read lock;
主庫(mysql master): [ip為192.168.247.129的3306端口]
從庫(mysql slave):[ip為192.168.247.129的3309端口]
具備單機單數(shù)據(jù)庫多實例的環(huán)境或者兩臺服務(wù)器每臺機器有一個數(shù)據(jù)的環(huán)境
打開binlog日志(從庫不做級聯(lián)的話不建議開啟)和配置不重復(fù)的server-id
[root@curder.centos5 /usr/local/mysql/data] # egrep 'log-bin|server-id' /usr/local/mysql/data/3306/my.cnf log-bin=mysql-bin server-id = 3306
# mysql -uroot -paaaaaa -S /usr/local/mysql/data/3306/mysql.sock -e "show variables like 'log_bin'" +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | ON | +---------------+-------+
首先登陸mysql3306實例主數(shù)據(jù)庫mysql -uroot -paaaaaa -S /usr/local/mysql/data/3306/mysql.sock
執(zhí)行授權(quán)語句
mysql> grant replication slave on *.* to 'rep'@'192.168.0.%' identified by 'reppasswd'; mysql> flush privileges;
授權(quán)局域網(wǎng)內(nèi) rep 用戶通過 reppasswd 密碼進行同步
另外:如果不存在全備 需要在主庫上執(zhí)行如下語句獲得全備
mysql> flush table with read lock; # 備份期間禁止用戶寫操作(窗口不允許關(guān)閉)
備份語句,獲得全備
# mysqldump -uroot -paaaaaa -S /usr/local/mysql/data/3306/mysql.sock -B curder --events --master-data=2 > rep.sql
最后操作完別忘了解除鎖定 unlock tables;
注意:
5.1版本的MySQL版本的鎖表語句是flush tables with read lock;
5.5版本的MySQL的鎖表語句是flush table with read lock;
mysql -uroot -paaaaaa -S /usr/local/mysql/data/3308/mysql.sock < ~/rep.sql
change master to master_host='192.168.0.15', master_port=3306, master_user='rep', # 賬號信息為主庫建立的用戶信息 master_password='reppasswd', # 在主庫設(shè)置同步賬戶時設(shè)置 master_log_file='mysql-bin.000003', # 該值通過在mysql master服務(wù)器全備前鎖定的值上show master status;查看 master_log_pos=2840; # 該值通過在master服務(wù)器上show master status;查看
上述語句信息以文件的形式存放在從庫的master.info中。
start slave
show slave status\G
Slave_IO_Running: Yes # 從庫IO進程(從master服務(wù)器取log的線程) Slave_SQL_Running: Yes # 從庫SQL進程(讀取relaylog 寫數(shù)據(jù)) Seconds_Behind_Master: 0 # 落后主庫的秒數(shù)
另外
show master status; # 查看master的狀態(tài), 尤其是當前的二進制日志及位置 show slave status; # 查看slave的狀態(tài). reset slave; # 重置slave狀態(tài). start slave; # 啟動slave狀態(tài)(一旦啟動 則開始監(jiān)聽msater的變化) stop slave; # 暫停slave狀態(tài);
異步方式同步;
邏輯同步模式,多種模式,默認是通過SQL語句執(zhí)行;
主庫通過記錄binlog實現(xiàn)對從庫的同步;
主庫1個IO線程,從庫1個IO線程和一個SQL線程來完成;
從庫關(guān)鍵字文件
master.info
,
relay-log
,
relay-info
功能,
如果從庫還想級聯(lián)從庫,需要打開
log-bin
和
log-slave-updates
參數(shù)
安裝好要配置的主從的數(shù)據(jù)庫,配置好log-bin和server-id參數(shù)
無需配置主庫my.cnf文件,主庫的log-bin和server-id參數(shù)默認就是配置好的
登錄主庫增加用于從庫連接主庫同步的賬號,例如:rep,并授權(quán)replication slave同步的權(quán)限
使用凌晨mysqldump
命令帶--master-data=1
備份的全備數(shù)據(jù)恢復(fù)到從庫
在從庫執(zhí)行change master to...
語句,無需binlog文件以及對應(yīng)位置點(在步驟4中以及通過備份參數(shù)指定)
從庫start slave
開啟同步開關(guān)
從庫show slave status\G
,檢查同步狀態(tài),并在主庫進行更新測試
show processlist\G
sending binlog event to slave
二進制日志由各種事件組成,一個事件通常為一個更新加一些其他信息。線程已經(jīng)從二進制日志讀取了一個事件并且正將它發(fā)送到從服務(wù)器
finished reading one binlog;switching to next binlog
線程已經(jīng)讀完二進制日志文件并且正打開下一個要大宋到服務(wù)器的日志文件
has send all binlog to slave;waiting for binlog to be updated
線程已經(jīng)從二進制日志讀取所有主要的更新并已經(jīng)發(fā)送到了從服務(wù)器。 現(xiàn)在正空閑,等待由主服務(wù)器上新的更新導(dǎo)致的出現(xiàn)在二進制日志中的新事件
waiting to finalize termination
線程停止時發(fā)生的一個很簡單的狀態(tài)
該狀態(tài)出現(xiàn)在Slave_IO_State
列,可以通過show slave status
顯示。
Connection to master
線程正試圖連接主服務(wù)器
Checking master version
建立同主服務(wù)器之間的連接后立即臨時出現(xiàn)的狀態(tài)
Registering slave onmaster
建立同主服務(wù)器之間的連接后立即臨時出現(xiàn)的狀態(tài)
Requesting binlog dump
建立同主服務(wù)器之間的連接后立即臨時出現(xiàn)的狀態(tài),線程向主服務(wù)器發(fā)送一條請求,索取從請求的二進制日志文件名和位置開始的二進制日志的內(nèi)容
Waiting to reconnect after a failed binlog request
如果二進制日志轉(zhuǎn)儲請求失敗(由于沒有連接),線程進入休眠裝填,然后定期嘗試重新連接??梢允褂?!-- /react-text -->--master-connect-retry
選項指定重試之間的間隔
Reconnecting after a failed binlog dump request
線程正嘗試重新連接主服務(wù)器
Waiting for master to send event
線程已經(jīng)連接上主服務(wù)器,正等待二進制日志事件到達。如果主服務(wù)器正空閑,會持續(xù)較長的時間。如果等到持續(xù)slave_read_timeout
秒,則發(fā)生超時。此時線程認為連接被中斷并企圖重新連接。
Queueing master event to the relay log
線程已經(jīng)讀取一個事件,正將它復(fù)制到中繼日志供SQL線程來處理
Waiting to reconnect after a failed master event read
讀取時(由于沒有連接)出現(xiàn)錯誤。線程企圖重新連接前將休眠master-connect-retry
秒
Reconnectiong after a failed master event read
線程正嘗試重新連接主服務(wù)器,當連接重新建立后,狀態(tài)變?yōu)?!-- /react-text -->Waiting for master to send
Waiting for slave SQL thread to free enough relay log space
正使用一個非零relay_log_space_limit值,中繼日志已經(jīng)增長到其組合大小超過該值。I/O線程正等待知道SQL線程處理中繼日志內(nèi)容并刪除部分中繼日志文件來釋放足夠的空間
Waiting for slave mutex on exit
線程停止時發(fā)生的一個很簡單的狀態(tài),I/O線程的State列也可以顯示語句的文本,這說明已經(jīng)從中繼日志讀取了一個事件,從中提取了語句,并且正在執(zhí)行語句。
Reading event from the relay log
線程已經(jīng)從中繼日志讀取一個事件,可以對事件進行處理
Has read all relay log;waiting for the slave I/O thread to update it
線程已經(jīng)處理了中繼日志文件中的所有事件,現(xiàn)在正等待I/O線程將新事件寫入中繼日志