MySQL binlog 長途備份辦法詳解。本站提示廣大學習愛好者:(MySQL binlog 長途備份辦法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL binlog 長途備份辦法詳解正文
之前備份binlog時,都是先在當地停止備份緊縮,然後發送到長途辦事器中。然則這個中照樣有必定風險的,由於日記的備份都是周期性的,假如在某個周期中,辦事器宕機了,硬盤破壞了,便可能招致這段時光的binlog就喪失了。
並且,之前用劇本對長途辦事器停止備份的方法,有個缺陷:沒法對MySQL辦事器以後正在寫的二進制日記文件停止備份。所以,只能比及MySQL辦事器全體寫完能力停止備份。而寫完一個binlog的時光其實不固定,這就招致備份周期的不肯定。
從MySQL5.6開端,mysqlbinlog支撐將長途辦事器上的binlog及時復制到當地辦事器上。
mysqlbinlog的及時二進制復制功效並不是簡略的將長途辦事器的日記復制過去,它是經由過程MySQL 5.6頒布的Replication API及時獲得二進制事宜。實質上,就相當於MySQL的從辦事器。與通俗辦事器相似,主辦事器產生事宜後,普通都邑在0.5~1秒內停止備份。
備份敕令
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:用於備份長途辦事器的binlog。假如不指定該選項,則會查找當地的binlog。
--raw:binlog日記會以二進制格局存儲在磁盤中,假如不指定該選項,則會以文本情勢保留。
--user:復制的MySQL用戶,只須要授與REPLICATION SLAVE權限。
--stop-never:mysqlbinlog可以只從長途辦事器獲得指定的幾個binlog,也可將赓續生成的binlog保留到當地。指定此選項,代表只需長途辦事器不封閉或許銜接未斷開,mysqlbinlog就會赓續的復制長途辦事器上的binlog。
mysql-bin.000001:代表從哪一個binlog開端復制。
除以上選項外,還有以下幾個選項須要留意:
--stop-never-slave-server-id:在備份長途辦事器的binlog時,mysqlbinlog實質上就相當於一個從辦事器,該選項就是用來指定從辦事器的server-id的。默許為-1。
--to-last-log:代表mysqlbinlog不只可以或許獲得指定的binlog,還能獲得厥後生成的binlog,獲得完了,才終止。假如指定了--stop-never選項則會隱式翻開--to-last-log選項。
--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。
缺乏:
這個方法有個成績,關於慣例的主從復制來講,假如主從直接的銜接斷開了,則從會主動再次銜接,而關於mysqlbinlog,假如斷開了,其實不會主動銜接。
處理計劃:
可經由過程劇本來填補上述缺乏。
#!/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
劇本解讀:
1. 現實上界說了一個逝世輪回,假如備份掉敗,則10s後從新銜接。
2. 第一次運轉時需指定FIRST_BINLOG的值,指從哪一個binlog開端復制,普通為mysql-bin.000001。後續履行的時刻就直接獲得備份目次下最新的binlog,從最新的binlog開端復制。
總結:
1. 假如指定了--raw,mysqlbinlog獲得事宜後,其實不會及時落盤,而是先保留在當地辦事器的內存中,每4K刷盤一次。這也就削減了頻仍的日記寫操作。假如此時mysqlbinlog和主辦事器之間的銜接斷開了,則內存中的binlog會立時刷新到磁盤中。
2. 雖然mysqlbinlog相似於從辦事器,但從辦事器上的relaylog倒是及時存盤的,即從辦事器獲得主辦事器發生的事宜後,會及時寫入到relaylog中。
3. 假如不指定--raw,這個時刻會以文本格局存盤,此時,--result-file=/test/不克不及指定為目次,必需明白寫上文件名,比方--result-file=/test/1.sql,此時,mysqlbinlog獲得事宜後,是及時落盤的,不會每4K刷盤一次。
以上所述是小編給年夜家引見的MySQL binlog 長途備份教程詳解的相干常識,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!