《Mysql學習MySQL binlog 遠程備份方法詳解》要點:
本文介紹了Mysql學習MySQL binlog 遠程備份方法詳解,希望對您有用。如果有疑問,可以聯系我們。
以前備份binlog時,都是先在本地進行備份壓縮,然后發送到遠程服務器中.但是這其中還是有一定風險的,因為日志的備份都是周期性的,如果在某個周期中,服務器宕機了,硬盤損壞了,就可能導致這段時間的binlog就丟失了.MYSQL數據庫
而且,以前用腳本對遠程服務器進行備份的方式,有個缺點:無法對MySQL服務器當前正在寫的二進制日志文件進行備份.所以,只能等到MySQL服務器全部寫完才能進行備份.而寫完一個binlog的時間并不固定,這就導致備份周期的不確定.MYSQL數據庫
從MySQL5.6開始,mysqlbinlog支持將遠程服務器上的binlog實時復制到本地服務器上.MYSQL數據庫
mysqlbinlog的實時二進制復制功能并非簡單的將遠程服務器的日志復制過來,它是通過MySQL 5.6公布的Replication API實時獲取二進制事件.本質上,就相當于MySQL的從服務器.與普通服務器類似,主服務器發生事件后,一般都會在0.5~1秒內進行備份.MYSQL數據庫
備份命令 MYSQL數據庫
解釋如下: MYSQL數據庫
--read-from-remote-server:用于備份遠程服務器的binlog.如果不指定該選項,則會查找本地的binlog.MYSQL數據庫
--raw:binlog日志會以二進制格式存儲在磁盤中,如果不指定該選項,則會以文本形式保存.MYSQL數據庫
--user:復制的MySQL用戶,只需要授予REPLICATION SLAVE權限.MYSQL數據庫
--stop-never:mysqlbinlog可以只從遠程服務器獲取指定的幾個binlog,也可將不斷生成的binlog保存到本地.指定此選項,代表只要遠程服務器不關閉或者連接未斷開,mysqlbinlog就會不斷的復制遠程服務器上的binlog.MYSQL數據庫
mysql-bin.000001:代表從哪個binlog開始復制.MYSQL數據庫
除了以上選項外,還有以下幾個選項需要注意:MYSQL數據庫
--stop-never-slave-server-id:在備份遠程服務器的binlog時,mysqlbinlog本質上就相當于一個從服務器,該選項就是用來指定從服務器的server-id的.默認為-1.MYSQL數據庫
--to-last-log:代表mysqlbinlog不僅能夠獲取指定的binlog,還能獲取其后生成的binlog,獲取完了,才終止.如果指定了--stop-never選項則會隱式打開--to-last-log選項.MYSQL數據庫
--result-file:用于設置遠程服務器的binlog,保存到本地的前綴.譬如對于mysql-bin.000001,如果指定--result-file=/test/backup-,則保存到本地后的文件名為/test/backup-mysql-bin.000001.注意:如果將--result-file設置為目錄,則一定要帶上目錄分隔符“/”.譬如--result-file=/test/,而不是--result-file=/test,不然保存到本地的文件名為/testmysql-bin.000001.MYSQL數據庫
不足:MYSQL數據庫
這個方式有個問題,對于常規的主從復制來說,如果主從直接的連接斷開了,則從會自動再次連接,而對于mysqlbinlog,如果斷開了,并不會自動連接.MYSQL數據庫
解決方案: MYSQL數據庫
可通過腳本來彌補上述不足.MYSQL數據庫
#!/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} ## 運行while循環,連接斷開后等待指定時間,重新連接 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}秒后再次連接并繼續備份" | tee -a ${BACKUP_LOG} sleep ${SLEEP_SECONDS} done
腳本解讀: MYSQL數據庫
1. 實際上定義了一個死循環,如果備份失敗,則10s后重新連接.MYSQL數據庫
2. 第一次運行時需指定FIRST_BINLOG的值,指從哪個binlog開始復制,一般為mysql-bin.000001.后續執行的時候就直接獲取備份目錄下最新的binlog,從最新的binlog開始復制.MYSQL數據庫
總結:MYSQL數據庫
1. 如果指定了--raw,mysqlbinlog獲取事件后,并不會實時落盤,而是先保存在本地服務器的內存中,每4K刷盤一次.這也就減少了頻繁的日志寫操作.如果此時mysqlbinlog和主服務器之間的連接斷開了,則內存中的binlog會馬上刷新到磁盤中.MYSQL數據庫
2. 盡管mysqlbinlog類似于從服務器,但從服務器上的relaylog卻是實時存盤的,即從服務器獲取主服務器產生的事件后,會實時寫入到relaylog中.MYSQL數據庫
3. 如果不指定--raw,這個時候會以文本格式存盤,此時,--result-file=/test/不能指定為目錄,必須明確寫上文件名,譬如--result-file=/test/1.sql,此時,mysqlbinlog獲取事件后,是實時落盤的,不會每4K刷盤一次.MYSQL數據庫
以上所述是小編給大家介紹的MySQL binlog 遠程備份教程詳解的相關知識,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的.在此也非常感謝大家對維易PHP網站的支持!MYSQL數據庫
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/5386.html