MySQL備份利器之Xtrabackup--恢復

三:恢復

 

 

3.1.1全備恢復理論


1)準備階段:在全備完成後,還不能直接被用於恢復。因爲可能還有些未提交的事務,

或者有些事務還沒有被重做。做這些掛起的操作時爲了保證數據文件的一致性。這也是準備
階段的一個目的。一旦這些操作完成了,數據就可以被應用了。


$ innobackupex --apply-log /path/to/BACKUP-DIR


這裏你還可以加入--use-memory 選項來確保內存,因爲這個準備階段的進程會消耗很多
內存


$ innobackupex --apply-log --use-memory=4G /path/to/BACKUP-DIR


2)恢復階段:在準備階段完成後,通過--copy-back 選項來完成把備份恢復到服務器的
datadir 目錄下。

$ innobackupex --copy-back /path/to/BACKUP-DIR

3)在啓動mysql 服務器前,先將文件的所有者更改一下

$ chown -R mysql:mysql /var/lib/mysql

3.1.2 全備恢復案例


1)innobackupex --apply-log /home/mysqlbackup/2013-02-19_12-20-49
2)刪除原來的數據目錄,此處即爲/home/mysql/mysqldata/3306/。(但是要保留my.cnf)
3)innobackupex --defaults-file=/home/mysql/mysqldata/3306/my.cnf --copy-back
/home/mysqlbackup/2013-02-19_12-20-49
其中/home/mysqlbackup/2013-02-19_12-20-49 爲全備文件

增量備份的恢復
1)增量備份恢復的理論
1)prepare 階段
與全備的prepare 階段有所不同,這個階段需要注意更多的問題:
A)在每一個增量備份上只有已經提交的事務才能被重做。這個過程是將全備的內
容與增量備份的內容合在一起。
B)爲了能夠應用這些備份數據,那些沒有被提交的事務必須被回滾掉。
----------------------------------------------------------------------------------------------------------------------
注意:如果你在一個基準備份中應用和提交的事務和回滾了未提交的事務,你
將不能增加那些增加的部分了。如果你在一個增量備份中做了以上兩個操作,
你將不能從這個時刻開始添加數據。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
􀁺 innobackupex --apply-log --redo-only /基準備份的目錄(即之前全備的那個目錄)
􀁺 innobackupex --apply-log --redo-only /基準備份--incremental-dir=/第一個增量備份的目

􀁺 innobackupex --apply-log /基準備份--incremental-dir=/第二個增量備份的目錄
􀁺 innobackupex --apply-log /基準備份
----------------------------------------------------------------------------------------------------------------------
注意:在進行最後一次增量備份的應用時,不用--redo-only 參數了。這是因爲如
果應用了,下次還有下一個增量備份需要prepare 時,就不能被應用了,這符合
上面的兩條原則
----------------------------------------------------------------------------------------------------------------------
2)Restore 階段
在完成了增量備份的prepare 階段,現在的基準目錄(base+incremental=full)就像是做
了一個全備的目錄。可以同直接進行restore:
􀁺 innobackupex --copy-back /基準目錄
2)增量備份恢復的案例
----------------------------------------------------------------------------------------------------------------
全備(基準):/home/mysqlbackup/2013-02-19_12-20-49/
第一次增備:/home/inc1/2013-02-20_10-25-19/
第二次增備:/home/inc2/2013-02-20_10-35-48
----------------------------------------------------------------------------------------------------------------


1)應用基準
[root@localhost home]#innobackupex -apply-log --redo-only
/home/mysqlbackup/2013-02-19_12-20-49/
2)應用第一個增量備份
[root@localhost home]#innobackupex -apply-log --redo-only
/home/mysqlbackup/2013-02-19_12-20-49/--incremental-dir=/home/inc1/2013-02-20_1
0-25-19
3)應用第二個增量備份
[root@localhost home]#innobackupex -apply-log
/home/mysqlbackup/2013-02-19_12-20-49/--incremental-dir=/home/inc2/2013-02-20_1
0-35-48
4)再次應用基準
[root@localhost home]#innobackupex -apply-log
/home/mysqlbackup/2013-02-19_12-20-49/
5)恢復
[root@game7 3306]# innobackupex
--defaults-file=/home/mysql/mysqldata/3306/my.cnf
--copy-back /home/mysqlbackup/2013-02-19_12-20-49/


時間點恢復
基於時間點恢復的理論
通過innobackupex 和mysql 服務的二進制日誌文件可以進行基於時間點的恢復,將數據
庫恢復到歷史的某個狀態。二進制日誌中保存着對數據庫的操作細節,就像Oracle 中的redo
log 一樣。這次,你可以用一個歷史備份加上二進制日誌來將數據庫恢復到某個時刻。
可以通過innobackupex 做一次全備
$ innobackupex /path/to/backup --no-timestamp
接下來,就準備恢復的日誌應用
$ innobackupex --apply-log /path/to/backup
假設某個時刻已經過去了,想恢復數據庫到該時刻,應先知道當前的二進制日誌情況
mysql> SHOW BINARY LOGS;
mysql> SHOW MASTER STATUS;
第一個Query 將會告訴你包含了哪些二進制日誌文件,第二個Query 將會告訴你哪個二
進制日誌文件時當前正在使用,和當前的日誌位置點。
之後,你可以通過之前做的備份中的xtrabackup_binlog_info 文件,知道備份到的日誌
編號及日誌位置
$ cat /path/to/backup/xtrabackup_binlog_info
將數據庫通過之前做的備份進行恢復
$ innobackupex --copy-back /path/to/backup
此時數據已達到了某個時刻,此時可以應用之前得到的信息,再運用mysqlbinlog 工具
進行基於時間點的恢復

基於時間點恢復的案例
1)建立一個快照,通過全備的方法
root@game7 home]# innobackupex --user=root --password=123456
--defaults-file=/usr/local/mysql/data/3306/my.cnf /home/backup/full
--no-timestamp
2)進行應用
innobackupex --apply-log /home/backup/full/
3)查詢當前的日誌位置狀態量
mysql> show master logs;
+------------------+-------------------+
| Log_name | File_size |
+------------------+-------------------+
| mysql-bin.000001 | 1092 |
| mysql-bin.000002 | 106 |
+------------------+--------------------+
4)到備份目錄中去查看它的日誌位置狀態量
[root@game7 full]# cat xtrabackup_binlog_info
mysql-bin.000001 803
5)進行恢復
innobackupex --defaults-file=/usr/local/mysq/data/3306/my.cnf
--copy-back /home/backup/full/
此時,數據庫已經恢復到mysql-bin.000001 803 這個狀態了。。。。。。。。
6)進行基於時間點得恢復
[root@game7 test]# mysqlbinlog /home/mysql/mysqllog/3306/mysql-bin.000001
/home/mysql/mysqllog/3306/mysql-bin.000002 --start-position=803>mybinlog.sql
此時,會生成一個mybinlog.sql 文件,這個文件就是803 之後的所有操作的日誌(裏面
全都是sql 語句)
7)進入mysql 客戶端,然後執行mybinlog.sql,就可以實現恢復到最新狀態
mysql>source mybinlog.sql
8)查看數據表,證明已經恢復到最新狀態了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章