3.Mysql之xtrabackup命令實戰03
1.前言
在前面的兩小節,分別介紹xtrabackup工具的一些特點以及優缺點,且在第二小節中介紹了它的備份工作原理。
2.實戰(全量和增量)
其實這裡我就不想把我的實戰例子拿出來給大家分享,這裡只是分享幾個命令以及操作細節。
全量備份命令:
innobackupex --defaults-file=/data/3307/my.cnf --user=root --password='123' --no-timestamp /data/xbackup_3307/
其中引數:
--defaults-file:這個寫你Mysql例項的配置檔案(懂的都懂),
後面的--user 和 --password可以是你新建立的專門用於備份的使用者,但是該使用者必須具有create/insert/select/reload/lock table/replication client/create tablespace/process/super許可權,這裡我偷懶了,直接用root許可權(最高許可權)進行備份。
--no-timestamp:帶上該引數後就不會在你指定的路徑下再生成一個帶有日期的目錄,然後目錄下面才是是你用innobackupex執行後的檔案(我覺得備份時不要帶上該引數,這樣可以顯示出全備時具體的時間,好方便管理)。
以上命令的引數可以擴充套件。。。。
全量恢復命令:
innobackupex --defaults-file=/data/3308/my.cnf -uroot -p123 -P3308 --apply-log /data/xbackup_3307/ innobackupex --defaults-file=/data/3308/my.cnf -uroot -p123 -P3308 --copy-back /data/xbackup_3307/
說明:這裡的恢復命令主要有兩條:
第一條是apply-log:目的是將redo進行重做,將已經提交的事務寫到資料檔案中,未提交的事務使用undo回滾掉,該過程是模擬CSR過程。
第二條是copy-back: 目的是將innobackupex出的檔案全都拷貝到該配置檔案所對應的目錄中
最後:恢復完成!
-----------------------------------------------------------------------------------------------------------------------------------------
增量備份
說明:
(1)增量備份的方式,是基於上一次備份進行增量。 (2)增量備份無法單獨恢復。必須基於全備進行恢復。 (3)所有增量必須要按順序合併到全備中。
步驟:
先進行全備,然後第一次增量備份基於第一次的全備
innobackupex --defaults-file=/data/3307/my.cnf --user=root --password='123' --no-timestamp /data/xbackup_3307/ /*全備*/
第一次增備(基於第一次全備)
innobackupex --defaults-file=/data/3307/my.cnf --no-timestamp --incremental-basedir=/data/xbackup_3307 --incremental /data/incremental_one
--incremental-basedir=:後面跟全備目錄的絕對路徑
--incremental:後面跟第一次增量備份目錄的絕對路徑
注意:第一引數後面要跟上等於號,第二個引數後面沒有等於號
第二次增備(主要是基於第二增量備份的)
innobackupex --defaults-file=/data/3307/my.cnf --no-timestamp --incremental-basedir=/data/incremental_one --incremental /data/incremental_two
第三次、第四次等等........
增量備份恢復(過程)
##先apply全量備份 innobackupex --defaults-file=/data/3307/my.cnf -uroot -p123 -P3308 --apply-log /data/xbackup_3307/ ##然後再apply第一增量備份到全量備份中 innobackupex --defaults-file=/data/3307/my.cnf --apply-log --incremental-dir=/data/incremental_one /data/xbackup_3307 ##然後再apply第二次增量備份到全量備份中 innobackupex --defaults-file=/data/3307/my.cnf --apply-log --incremental-dir=/data/incremental_two /data/xbackup_3307
##最後再對全備進行apply-log一次
innobackupex --defaults-file=/data/3307/my.cnf --apply-log /data/xbackup_3307
##最後將恢復的全量備份copy-back(類似於全量備份恢復)
innobackupex --defaults-file=/data/3307/my.cnf --copy-back /data/xbackup_3307
以上可以進行引數擴充套件等等。
------------------------------------------------------------------------------------------------------------------------------
3.基於時間點恢復
innobackupex命令本身不支援基於時間點的備份和恢復,所以可以先使用innobackupex進行全備,然後使用binlog來實現基於時間的恢復
- 完全備份用innobackup就可以了
- binlog備份可以使用binlog server(早期的binlog server在使用--raw選項時,可能會導致最後一個事務的commit標記丟失,從而導致最後一個事務在執行恢復是被回滾),或者使用rsync命令來備份binlog日誌
3.1執行完全備份、binlog備份
在需要執行備份的資料庫伺服器上,檢視當前binlog檔案有哪些,一般在生產環境中備份資料需要被單獨放在備份NFS伺服器上,或者通過SCP、SSH傳輸到備份專用伺服器上,不會放到本地
遠端備份命令:
mysqlbinlog -R --raw --host='192.168.31.201' --user=rpl --password='123' --port=3307 --stop-never -r /data/binlogserver/ binlog.00001
##--host:主庫的IP地址 --user:主庫上備份使用者 --password:主庫上的備份使用者的密碼 這樣我用的是主從複製是建立的複製使用者來進行binlog備份的。 binlog.000001表示從
第一個binlog日誌開始備份。
引數介紹:
- –defaults-file=file_name:僅讀取該選項指定的配置檔案
- –host=host_name, -h host_name:在使用binlog server時,指定從哪臺mysqlserver主機上獲取二進位制日誌
- –password[=password], -p[password]:連線到伺服器時使用的密碼
- –port=port_num, -P port_num:用於連線到遠端server的TCP / IP埠號
- –raw:預設情況下,不使用–raw選項,mysqlbinlog讀取二進位制日誌檔案,並解析為文字格式輸出事件(直接列印在標準輸出中,可以使用輸出重定向到檔案中,也可以使用–result-file選項指定輸出檔案), –raw選項告訴mysqlbinlog仍然以讀取binlog時的原始二進位制格式輸出。該選項需要結合–read-from-remote-server選項使用
- –read-from-remote-server, -R 1、使用該選項時,mysqlbinlog會偽裝成一個slave,連線讀取,請求指定的binlog file,主庫獲取接收到這個請求之後就建立一個binlog dump執行緒推送binlog給mysqlbinlog server。 2、從MySQL server讀取二進位制日誌,而不是讀取本地日誌檔案。對於這些選項–host,–password,–port,–protocol,–socket和–user,除非給出了–read-from-remote-server選項結合使用,否則單獨指定這些TCP/IP連線選項將被忽略不生效
- –result-file=name, -r name:不與–raw選項一併使用時,此選項指定一個mysqlbinlog解析的文字存放的檔案,當單獨使用–raw選項時,mysqlbinlog會使用從遠端server傳輸的原始binlog格式寫入本地檔案中,預設情況下輸出檔案與原始日誌檔案使用相同的檔名稱。如果與–raw選項一併使用時,–result-file選項值會修改輸出檔名的字首,如:原本是mysql-bin.000001,使用–result-file=binlog,則輸出檔名為binlogmysql-bin.000001
說明:這裡binlog備份一般使用指令碼進行備份的,參考指令碼如下:
1 #!/bin/sh 2 BACKUP_BIN=/usr/local/mysql/bin/mysqlbinlog 3 LOCAL_BACKUP_DIR=/data/backup/binlog_bk 4 BACKUP_LOG=/data/backup/bakbinlog.log 5 REMOTE_HOST=192.168.56.100 6 #REMOTE_PORT=3306 7 SERVER_ID=20003306 8 REMOTE_USER=wanbin 9 REMOTE_PASS=mysql 10 #time to wait before reconnecting after failure 11 SLEEP_SECONDS=10 12 ##create local_backup_dir if necessary 13 ##mkdir -p ${LOCAL_BACKUP_DIR} 14 cd ${LOCAL_BACKUP_DIR} 15 ## 執行while迴圈,連線斷開後等待指定時間,重新連線 16 while : 17 FIRST_BINLOG=$(mysql --host=${REMOTE_HOST} --user=${REMOTE_USER} --password=${REMOTE_PASS} -e 'show binary logs'|grep -v "Log_name"|awk '{print $1}'|head -n 1) 18 do 19 if [ `ls -A "${LOCAL_BACKUP_DIR}" |wc -l` -eq 0 ];then 20 LAST_FILE=${FIRST_BINLOG} ##如果備份目錄中沒有備份檔案則 LAST_FILE=FIRST_FILE 21 else 22 LAST_FILE=`ls -l ${LOCAL_BACKUP_DIR} |tail -n 1 |awk '{print $9}'` ##last_file取序列最大的binlog檔案 23 fi 24 ${BACKUP_BIN} -R --raw --host=${REMOTE_HOST} --user=${REMOTE_USER} --password=${REMOTE_PASS} ${LAST_FILE} --stop-never --stop-never-slave-server-id=${SERVER_ID} 25 echo "`date +"%Y/%m/%d %H:%M:%S"` mysqlbinlog停止,返回程式碼:$?" | tee -a ${BACKUP_LOG} 26 echo "${SLEEP_SECONDS}秒後再次連線並繼續備份" | tee -a ${BACKUP_LOG} 27 sleep ${SLEEP_SECONDS} 28 donebinlog備份指令碼
4.總結:
基於時間的恢復:先恢復全備(這裡就是用innobackupex進行備份恢復,比如說一天一全備),然後備份binlog日誌(這裡通過mysqlbinlog命令進行遠端備份),可以通過修改上述binlog備份指令碼,可以每10s中進行備份,如果你不能允許10s的話,可以設定1s設定實時備份。
如果我們的機器在某天的時刻突然宕機了,那麼我們可以用前一天的全備+(全備完成之後的時刻到宕機時刻)的binlog備份就能完成整個資料庫的恢復了。
-->這裡我們要分析出資料庫全備完成時刻到資料庫宕機時刻之間的binlog 日誌在哪個範圍(找出來)
-->使用mysqlbinlog -h xxxx -u -p --start-position=xxx mysql-bin.00001 mysql-bin.000002 mysql-bin.00003 >/backup/binlog.sql
-->souce /backup/binlog.sql