1. 程式人生 > 其它 >3.Mysql之xtrabackup命令實戰03

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 done
binlog備份指令碼

 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