6.9 同步 faq
問: master還在運(yùn)行中,如何在不停止它的情況下配置slave?
答: 需要設(shè)計(jì)幾個(gè)選項(xiàng)參數(shù)。如果已經(jīng)有了master的備份并且記錄了數(shù)據(jù)快照二進(jìn)制日志文件名以及偏移位置(運(yùn)行 show master status 查看結(jié)果),執(zhí)行以下步驟:
確定slave指定了一個(gè)唯一的服務(wù)器編號(hào)。
在slave上執(zhí)行如下語句,把一些選項(xiàng)值改成實(shí)際值:
mysql> change master to
-> master_host='master_host_name',
-> master_user='master_user_name',
-> master_password='master_pass',
-> master_log_file='recorded_log_file_name',
-> master_log_pos=recorded_log_position;
在slave上執(zhí)行 start slave 語句。
如果事先沒有備份master的數(shù)據(jù),可以用以下方法快速創(chuàng)建一個(gè)備份。以下所有的操作都是在master上。
提交語句:
mysql> flush tables with read lock;
確保這個(gè)鎖一直存在,執(zhí)行以下命令(或者其他類似的):
shell> tar zcf /tmp/backup.tar.gz /var/lib/mysql
執(zhí)行以下語句,記錄下輸出的結(jié)果,后面要用到:
mysql> show master status;
釋放鎖:
mysql> unlock tables;
上述步驟的另一個(gè)辦法是創(chuàng)建master的sql轉(zhuǎn)儲(chǔ)文件。只需在master上執(zhí)行 mysqldump --master-data 命令,然后將導(dǎo)出來的sql轉(zhuǎn)儲(chǔ)文件載入slave。不過,這么做會(huì)制作二進(jìn)制數(shù)據(jù)快照的方式慢一點(diǎn)。
無論使用上述兩種方法的哪種,最后都能創(chuàng)建master的數(shù)據(jù)快照然后記錄二進(jìn)制日志文件名以及偏移位置??梢栽诤脦椎钠渌膕lave上使用同一個(gè)備份的二進(jìn)制數(shù)據(jù)快照。得到master的快照后,只要master的二進(jìn)制日志完好無損,接著就能開始設(shè)置slave了。兩個(gè)決定是否需要等待較長時(shí)間的限制是:在master上磁盤空間保存二進(jìn)制日志,以及slave從master抓取更新事件。
也可以使用 load data from master。這個(gè)語句可以很方便地在slave上取得數(shù)據(jù)快照并且能立刻調(diào)整二進(jìn)制日志文件名以及偏移位置。在將來,我們推薦用 load data from master 來設(shè)置slave。警告,它只能用于 myisam 表,并且可能會(huì)保持一個(gè)較長時(shí)間的讀鎖。由于它還沒達(dá)到所期望的高效率,因此如果數(shù)據(jù)表很大,最好還是在執(zhí)行完 flush tables with read lock 后直接制作二進(jìn)制數(shù)據(jù)快照。
問:是否slave總是需要連接到master?
答:不,非必需。slave可以好幾小時(shí)甚至幾天關(guān)閉或者不連接master,然后重連再取得更新操作日志。例如,可以在撥號(hào)鏈接上設(shè)置一個(gè)mater/slave關(guān)系,撥號(hào)可能只是零星的不定期的連接。這種做法隱含的是,在任何指定的時(shí)間里,除非使用特殊的度量標(biāo)準(zhǔn),否則slave不能保證總是能和master保持同步。在未來,有個(gè)選項(xiàng)可以阻止master,除非至少有一個(gè)slave在同步中。
問:怎么知道比master晚了多少?也就是說,怎么知道slave最后同步的時(shí)間?
答:如果slave是4.1.1或者更高,只需查看 show slave status 結(jié)果中的 seconds_behind_master 字段。對于老版本,可以用以下辦法。如果在slave上執(zhí)行 show processlist 語句結(jié)果顯示sql線程(對mysql 3.23則是slave線程)正在運(yùn)行,這就意味著該線程至少從master讀取一個(gè)更新操作事件。詳情請看"6.3 replication implementation details"。
當(dāng)sql線程執(zhí)行一個(gè)master上讀取的更新操作事件時(shí),它把自己的時(shí)間改成事件的時(shí)間(這也就是 timestamp 也要同步的原因)。在
show processlist 結(jié)果中的 time 字段中,slave的sql線程顯示的秒數(shù)就是最后一次同步的時(shí)間戳和slave本機(jī)的實(shí)際時(shí)間相差秒數(shù)。可以根據(jù)這個(gè)值來判斷最后同步的時(shí)間。注意,如果slave已經(jīng)從master斷開好幾個(gè)小時(shí)了,然后重新連接,就能看到slave的
新聞熱點(diǎn)
疑難解答
圖片精選