MySQL binlog 遠(yuǎn)程備份方法詳解
以前備份binlog時(shí),都是先在本地進(jìn)行備份壓縮,然后發(fā)送到遠(yuǎn)程服務(wù)器中。但是這其中還是有一定風(fēng)險(xiǎn)的,因?yàn)槿罩镜膫浞荻际侵芷谛缘?,如果在某個(gè)周期中,服務(wù)器宕機(jī)了,硬盤損壞了,就可能導(dǎo)致這段時(shí)間的binlog就丟失了。
而且,以前用腳本對(duì)遠(yuǎn)程服務(wù)器進(jìn)行備份的方式,有個(gè)缺點(diǎn):無(wú)法對(duì)MySQL服務(wù)器當(dāng)前正在寫的二進(jìn)制日志文件進(jìn)行備份。所以,只能等到MySQL服務(wù)器全部寫完才能進(jìn)行備份。而寫完一個(gè)binlog的時(shí)間并不固定,這就導(dǎo)致備份周期的不確定。
從MySQL5.6開始,mysqlbinlog支持將遠(yuǎn)程服務(wù)器上的binlog實(shí)時(shí)復(fù)制到本地服務(wù)器上。
mysqlbinlog的實(shí)時(shí)二進(jìn)制復(fù)制功能并非簡(jiǎn)單的將遠(yuǎn)程服務(wù)器的日志復(fù)制過(guò)來(lái),它是通過(guò)MySQL 5.6公布的Replication API實(shí)時(shí)獲取二進(jìn)制事件。本質(zhì)上,就相當(dāng)于MySQL的從服務(wù)器。與普通服務(wù)器類似,主服務(wù)器發(fā)生事件后,一般都會(huì)在0.5~1秒內(nèi)進(jìn)行備份。
備份命令
mysqlbinlog --read-from-remote-server --raw --host=192.168.244.145 --port=3306 --user=repl --password=repl --stop-never mysql-bin.000001
解釋如下:
--read-from-remote-server:用于備份遠(yuǎn)程服務(wù)器的binlog。如果不指定該選項(xiàng),則會(huì)查找本地的binlog。
--raw:binlog日志會(huì)以二進(jìn)制格式存儲(chǔ)在磁盤中,如果不指定該選項(xiàng),則會(huì)以文本形式保存。
--user:復(fù)制的MySQL用戶,只需要授予REPLICATION SLAVE權(quán)限。
--stop-never:mysqlbinlog可以只從遠(yuǎn)程服務(wù)器獲取指定的幾個(gè)binlog,也可將不斷生成的binlog保存到本地。指定此選項(xiàng),代表只要遠(yuǎn)程服務(wù)器不關(guān)閉或者連接未斷開,mysqlbinlog就會(huì)不斷的復(fù)制遠(yuǎn)程服務(wù)器上的binlog。
mysql-bin.000001:代表從哪個(gè)binlog開始復(fù)制。
除了以上選項(xiàng)外,還有以下幾個(gè)選項(xiàng)需要注意:
--stop-never-slave-server-id:在備份遠(yuǎn)程服務(wù)器的binlog時(shí),mysqlbinlog本質(zhì)上就相當(dāng)于一個(gè)從服務(wù)器,該選項(xiàng)就是用來(lái)指定從服務(wù)器的server-id的。默認(rèn)為-1。
--to-last-log:代表mysqlbinlog不僅能夠獲取指定的binlog,還能獲取其后生成的binlog,獲取完了,才終止。如果指定了--stop-never選項(xiàng)則會(huì)隱式打開--to-last-log選項(xiàng)。
--result-file:用于設(shè)置遠(yuǎn)程服務(wù)器的binlog,保存到本地的前綴。譬如對(duì)于mysql-bin.000001,如果指定--result-file=/test/backup-,則保存到本地后的文件名為/test/backup-mysql-bin.000001。注意:如果將--result-file設(shè)置為目錄,則一定要帶上目錄分隔符“/”。譬如--result-file=/test/,而不是--result-file=/test,不然保存到本地的文件名為/testmysql-bin.000001。
不足:
這個(gè)方式有個(gè)問(wèn)題,對(duì)于常規(guī)的主從復(fù)制來(lái)說(shuō),如果主從直接的連接斷開了,則從會(huì)自動(dòng)再次連接,而對(duì)于mysqlbinlog,如果斷開了,并不會(huì)自動(dòng)連接。
解決方案:
可通過(guò)腳本來(lái)彌補(bǔ)上述不足。
#!/bin/sh BACKUP_BIN=/usr/bin/mysqlbinlog LOCAL_BACKUP_DIR=/backup/binlog/ BACKUP_LOG=/backup/binlog/backuplog REMOTE_HOST=192.168.244.145 REMOTE_PORT=3306 REMOTE_USER=repl REMOTE_PASS=repl FIRST_BINLOG=mysql-bin.000001 #time to wait before reconnecting after failure SLEEP_SECONDS=10 ##create local_backup_dir if necessary mkdir -p ${LOCAL_BACKUP_DIR} cd ${LOCAL_BACKUP_DIR} ## 運(yùn)行while循環(huán),連接斷開后等待指定時(shí)間,重新連接 while : do if [ `ls -A "${LOCAL_BACKUP_DIR}" |wc -l` -eq 0 ];then LAST_FILE=${FIRST_BINLOG} else LAST_FILE=`ls -l ${LOCAL_BACKUP_DIR} | grep -v backuplog |tail -n 1 |awk '{print $9}'` fi ${BACKUP_BIN} --raw --read-from-remote-server --stop-never --host=${REMOTE_HOST} --port=${REMOTE_PORT} --user=${REMOTE_USER} --password=${REMOTE_PASS} ${LAST_FILE} echo "`date +"%Y/%m/%d %H:%M:%S"` mysqlbinlog停止,返回代碼:$?" | tee -a ${BACKUP_LOG} echo "${SLEEP_SECONDS}秒后再次連接并繼續(xù)備份" | tee -a ${BACKUP_LOG} sleep ${SLEEP_SECONDS} done
腳本解讀:
1. 實(shí)際上定義了一個(gè)死循環(huán),如果備份失敗,則10s后重新連接。
2. 第一次運(yùn)行時(shí)需指定FIRST_BINLOG的值,指從哪個(gè)binlog開始復(fù)制,一般為mysql-bin.000001。后續(xù)執(zhí)行的時(shí)候就直接獲取備份目錄下最新的binlog,從最新的binlog開始復(fù)制。
總結(jié):
1. 如果指定了--raw,mysqlbinlog獲取事件后,并不會(huì)實(shí)時(shí)落盤,而是先保存在本地服務(wù)器的內(nèi)存中,每4K刷盤一次。這也就減少了頻繁的日志寫操作。如果此時(shí)mysqlbinlog和主服務(wù)器之間的連接斷開了,則內(nèi)存中的binlog會(huì)馬上刷新到磁盤中。
2. 盡管mysqlbinlog類似于從服務(wù)器,但從服務(wù)器上的relaylog卻是實(shí)時(shí)存盤的,即從服務(wù)器獲取主服務(wù)器產(chǎn)生的事件后,會(huì)實(shí)時(shí)寫入到relaylog中。
3. 如果不指定--raw,這個(gè)時(shí)候會(huì)以文本格式存盤,此時(shí),--result-file=/test/不能指定為目錄,必須明確寫上文件名,譬如--result-file=/test/1.sql,此時(shí),mysqlbinlog獲取事件后,是實(shí)時(shí)落盤的,不會(huì)每4K刷盤一次。
以上所述是小編給大家介紹的MySQL binlog 遠(yuǎn)程備份教程詳解的相關(guān)知識(shí),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- mysql 正確清理binlog日志的兩種方法
- MySQL 自動(dòng)清理binlog日志的方法
- MySQL數(shù)據(jù)庫(kù)恢復(fù)(使用mysqlbinlog命令)
- MySQL中的binlog相關(guān)命令和恢復(fù)技巧
- Mysql Binlog快速遍歷搜索記錄及binlog數(shù)據(jù)查看的方法
- Mysql Data目錄和 Binlog 目錄 搬遷的方法
- Mysql數(shù)據(jù)庫(kù)之Binlog日志使用總結(jié)(必看篇)
- mysql對(duì)binlog的處理說(shuō)明
- 教你自動(dòng)恢復(fù)MySQL數(shù)據(jù)庫(kù)的日志文件(binlog)
- Mysql數(shù)據(jù)庫(kù)清理binlog日志命令詳解
相關(guān)文章
通過(guò)mysqladmin遠(yuǎn)程管理mysql的方法
在一些特殊場(chǎng)景下,想要遠(yuǎn)程重啟mysql,以便讓某些修改能及時(shí)的生效,但是mysql并沒有提供遠(yuǎn)程重啟的功能,唯一能做的就是遠(yuǎn)程關(guān)閉mysql服務(wù)2013-03-03PHP使用mysqli擴(kuò)展連接MySQL數(shù)據(jù)庫(kù)
這篇文章主要介紹了PHP使用mysqli擴(kuò)展連接MySQL數(shù)據(jù)庫(kù),需要的朋友可以參考下2014-08-08基于MySQL的存儲(chǔ)引擎與日志說(shuō)明(全面講解)
下面小編就為大家分享一篇基于MySQL的存儲(chǔ)引擎與日志說(shuō)明(全面講解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12MySql數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)點(diǎn)總結(jié)
這篇文章主要介紹了MySql數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)點(diǎn),總結(jié)整理了mysql數(shù)據(jù)庫(kù)基本創(chuàng)建、查看、選擇、刪除以及數(shù)據(jù)類型相關(guān)操作技巧,需要的朋友可以參考下2020-06-0610個(gè)mysql中select語(yǔ)句的簡(jiǎn)單用法
本篇文章主要講述的是MySQL SELECT句法的簡(jiǎn)單分析,我們大家都知道MySQL數(shù)據(jù)庫(kù)是我們大家經(jīng)常使用的數(shù)據(jù)庫(kù),其相關(guān)的應(yīng)用也是備受關(guān)注的,那么以下的文章主要是對(duì)MySQL SELECT句法的簡(jiǎn)單分析。2014-08-08MySQL數(shù)據(jù)庫(kù)三種常用存儲(chǔ)引擎特性對(duì)比
MySQL中的數(shù)據(jù)用各種不同的技術(shù)存儲(chǔ)在文件(或內(nèi)存)中,這些技術(shù)中的每一種技術(shù)都使用不同的存儲(chǔ)機(jī)制,索引技巧,鎖定水平并且最終提供廣泛的不同功能和能力。在MySQL中將這些不同的技術(shù)及配套的相關(guān)功能稱為存儲(chǔ)引擎。2016-01-01MySQL時(shí)間盲注的五種延時(shí)方法實(shí)現(xiàn)
MySQL時(shí)間盲注主要有五種,sleep(),benchmark(t,exp),笛卡爾積,GET_LOCK() RLIKE正則,本文就主要介紹了這五種方法,感興趣的可以了解一下2021-05-05快速解決mysql導(dǎo)數(shù)據(jù)時(shí),格式不對(duì)、導(dǎo)入慢、丟數(shù)據(jù)的問(wèn)題
這篇文章主要介紹了快速解決mysql導(dǎo)數(shù)據(jù)時(shí),格式不對(duì)、導(dǎo)入慢、丟數(shù)據(jù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07