mysql備份與恢復(方案二)

方案二、xtrabackup完全備份+xtrabacup增量備份
前面我們進行增量備份時,使用的還是老方法:備份二進制日誌。其實xtrabackup還支持進行增量備份。
先介紹下xtrabackup的備份原理
在InnoDB內部會維護一個redo日誌文件,我們也可以叫做事務日誌文件(transaction log,事務日誌)。事務日誌會存儲每一個InnoDB表數據的記錄修改。當InnoDB啓動時,InnoDB會檢查數據文件和事務日誌,並執行兩個步驟:它應用已經提交的事務日誌到數據文件,並將修改過但沒有提交的數據進行回滾操作。
xtrabackup在啓動時會記住log sequence number(LSN),並且複製所有的數據文件。複製過程需要一些時間,所以這期間如果數據文件有改動,那麼將會使數據庫處於一個不同的時間點。這時,xtrabackup會運行一個後臺進程,用於監視事務日誌,並從事務日誌複製最新的修改。xtrabackup必須持續的做這個操作,是因爲事務日誌是會輪轉重複的寫入,並且事務日誌可以被重用。所以xtrabackup自啓動開始,就不停的將事務日誌中每個數據文件的修改都記錄下來。這就是xtrabackup的備份過程

所以每個InnoDB的頁面都會包含一個LSN信息,每當相關的數據發生改變,相關的頁面的LSN就會自動增長。這正是InnoDB表可以進行增量備份的基礎。
xtraBackup基於InnoDB的crash-recovery功能。它會複製innodb的data file,由於不鎖表,複製出來的數據是不一致的,在恢復的時候使用crash-recovery,使得數據恢復一致。
當InnoDB啓動的時候,它會先去檢查data file和transaction log,並且會做二步操作:
1.It applies committed transaction logentries to the data files
2.it performs an undo operation on anytransactions that modified data but did not commit.
所以在prepare過程中,XtraBackup使用複製到的transactions log對備份出來的innodb data file進行crash recovery。
測試環境準備
創建一個測試數據庫,並創建一張表輸入幾行數據
mysql> create database test;
mysql> use test;
mysql> create table xx(id int,name varchar(20));
mysql> insert into xx values(1,’tom1’);
mysql> insert into xx values(2,’tom2’);

1、 xtrabacup進行備份
執行完全備份:
備份命令:

xtrabackup –defaults-file=/etc/my.cnf –user=root –password=”123456” –port=3306 –backup –target-dir=/opt/mysqlbackup/full/full_incre_$(date +%Y%m%d_%H%M%S)

部分顯示信息如下圖所示:
這裏寫圖片描述
其中,–defaults-file指定數據庫的配置文件,如果使用該參數必須做爲第一個參數;–user指定連接數據庫的用戶名;–password指定連接數據庫的密碼;–port指定連接數據庫的端口號;–backup 實施備份到target-dir; –target-dir=name 備份文件的存放目錄路徑。innobackupex要從其中獲取datadir等信息;–database指定要備份的數據庫,這裏指定的數據庫只對MyISAM表和InnoDB表的表結構有效,對於InnoDB 數據來說都是全備(所有數據庫中的InnoDB數據都進行了備份,不是隻備份指定的數據庫,恢復時也一樣);/opt/mysqlbackup/full/是備份文件的存放位置。
查看完全備份文件
[root@localhost ~]# ls /opt/mysqlbackup/full/ -l
drwxr-x—. 8 root root 4096 Sep 12 22:11 full_incre_20160912_221111
xtrabackup進行增量備份
先錄入些數據,實現第一次增量數據:
mysql> use test;
mysql> insert into xx values(3,’tom3’);
再進行增量備份1
備份命令:

xtrabackup –defaults-file=/etc/my.cnf –user=root –password=”123456” –port=3306 –backup –target-dir=/opt/mysqlbackup/inc/incre_$(date +%Y%m%d_%H%M%S) –incremental-basedir=/opt/mysqlbackup/full/full_incre_20160912_221111/

部分顯示信息如下圖所示:
這裏寫圖片描述
其中,–incremental-basedir指定上次完整備份或者增量備份文件的位置(即如果是第一次增量備份則指向完全備份所在目錄,在執行過增量備份之後再一次進行增量備份時,其–incremental-basedir應該指向上一次的增量備份所在的目錄)。
查看增量備份文件:
[root@localhost ~]# ls -l /opt/mysqlbackup/inc/
drwxr-x—. 8 root root 4096 Sep 12 22:15 incre_20160912_221510
注:
這裏的增量備份其實只針對的是InnoDB,對於MyISAM來說,還是完整備份。

向表中再插入幾行數據,繼續第二次增量備份
mysql> use test;
mysql> insert into xx values(4,’tom4’);
mysql> commit;
進行第二次增量備份
備份命令:

xtrabackup –defaults-file=/etc/my.cnf –user=root –password=”123456” –port=3306 –backup –target-dir=/opt/mysqlbackup/inc/incre_$(date +%Y%m%d_%H%M%S) –incremental-basedir=/opt/mysqlbackup/inc/incre_20160912_221510/

部分顯示信息如下圖所示:
這裏寫圖片描述
注:第二次增量備份–incremental-basedir指向上一次增量備份文件的位置。
查看增量備份文件
[root@localhost ~]# ls -l /opt/mysqlbackup/inc/
drwxr-x—. 8 root root 4096 Sep 12 22:15 incre_20160912_221510
drwxr-x—. 8 root root 4096 Sep 12 22:19 incre_20160912_221916
2、 xtrabacup進行增量恢復
爲了驗證比對,先刪除兩個增量備份前表裏面的數據
mysql> use test;
mysql> delete from xx where id=3;

完整備份恢復:
在進行恢復前,如果完整備份在遠程主機上,首先將完整備份複製到本地主機上,如果是tar包,則需要先解包,解包命令爲:tar –izxf xxx.tar,這裏必須使用-i參數(忽略存檔中的 0 字節塊(通常意味着文件結束))。
開始全備份恢復
命令如下:

xtrabackup –defaults-file=/etc/my.cnf –prepare –user=root –password=”123456” –apply-log-only –target-dir=/opt/mysqlbackup/full/full_incre_20160912_221111/

部分顯示信息如下圖所示:
這裏寫圖片描述
恢復到第一次增量的時刻
增量備份恢復的步驟和完整備份恢復的步驟基本一致,只是應用日誌的過程稍有不同。增量備份恢復時,是先將所有的增量備份挨個應用到完整備份的數據文件中,然後再將完整備份中的數據恢復到數據庫中。
恢復命令:

xtrabackup –defaults-file=/etc/my.cnf –prepare –user=root –password=”123456” –apply-log-only –target-dir=/opt/mysqlbackup/full/full_incre_20160912_221111/–incremental-dir=/opt/mysqlbackup/inc/incre_20160912_221510/

部分顯示信息如下圖所示:
這裏寫圖片描述
恢復到第二次增量備份前面:
恢復命令:

xtrabackup –defaults-file=/etc/my.cnf –prepare –user=root –password=”123456” –apply-log-only –target-dir=/opt/mysqlbackup/full/full_incre_20160912_221111/ –incremental-dir=/opt/mysqlbackup/inc/incre_20160912_221916/

部分顯示信息如下圖所示:
這裏寫圖片描述
恢復整個庫
恢復命令:

xtrabackup –defaults-file=/etc/my.cnf –prepare –user=root –password=”123456” –target-dir=/opt/mysqlbackup/full/full_incre_20160912_221111/

部分顯示信息如下圖所示:
這裏寫圖片描述
然後停止mysql數據庫:
[root@localhost ~]# systemctl stop mysqld
開始rsync數據文件:

cd /opt/mysqlbackup/full/full_incre_20160912_221111/

rsync -rvt –exclude ‘xtrabackup_checkpoints’ –exclude ‘xtrabackup_logfile’ ./ /usr/local/mysql/data/

當數據恢復至DATADIR目錄以後,還需要確保所有數據文件的屬主和屬組均爲正確的用戶,如mysql,否則,在啓動mysqld之前還需要事先修改數據文件的屬主和屬組。
授予mysql訪問權限:

chown -R mysql:mysql /usr/local/mysql/data/

啓動mysql服務:

systemctl start mysqld

驗證
登錄mysql,看到以前在備份之後刪除的數據已經通過2次增量備份恢復過來了,如下所示:
[root@localhost ~]# mysql -uroot -p123456 -e “select * from test.xx”
+——+——+
| id | name |
+——+——+
| 1 | tom1 |
| 2 | tom2 |
| 3 | tom3 |
| 4 | tom4 |
+——+——+
方案三:innobackupex全庫備份+innobackupex增量備份
測試環境準備
創建一個測試數據庫,並創建一張表輸入幾行數據
mysql> create database test2;
mysql> use test2;
mysql> create table yy(id int,name varchar(20));
mysql> insert into yy values(1,’kim1’);
mysql> insert into yy values(2,’kim2’);
1、innobackupex先做完全備份
命令如下:

innobackupex –defaults-file=/etc/my.cnf –user=root –password=”123456” /opt/mysqlbackup/full/full_incre_$(date +%Y%m%d_%H%M%S) –no-timestamp

部分顯示信息如下圖所示:
這裏寫圖片描述
查看完全備份文件

ll /opt/mysqlbackup/full/

drwxr-x—. 10 root root 4096 Sep 12 23:52 full_incre_20160912_235237
innobackupex做增量備份
做第一次增量備份
先錄入增量數據
mysql> use test2;
mysql> insert into yy values(3,’kim3’);
再進行增量備份,命令如下:

innobackupex –incremental /opt/mysqlbackup/inc/incre_$(date +%Y%m%d_%H%M%S) –incremental-basedir=/opt/mysqlbackup/full/full_incre_20160912_235237/ –user=root –password=”123456” –no-timestamp

部分顯示信息如下圖所示:
這裏寫圖片描述
查看增量備份文件

ll /opt/mysqlbackup/inc/

drwxr-x—. 10 root root 4096 Sep 12 23:56 incre_20160912_235636
基於全備和第一個增量備份來做第二次增量備份
先錄入增量數據錄入
mysql> use test2;
mysql> insert into yy values(4,’kim4’);
開始進行第二次增量備份,備份命令:

innobackupex –incremental /opt/mysqlbackup/inc/incre_$(date +%Y%m%d_%H%M%S) –incremental-basedir=/opt/mysqlbackup/inc/incre_20160912_235636/ –user=root –password=”123456” –no-timestamp

部分顯示信息如下圖所示:
這裏寫圖片描述
查看增量備份文件

ll /opt/mysqlbackup/inc/

drwxr-x—. 10 root root 4096 Sep 12 23:56 incre_20160912_235636
drwxr-x—. 10 root root 4096 Sep 12 23:59 incre_20160912_235942
2、innobackupex做增量恢復
先刪除兩次增量數據,用來查看驗證恢復結果
mysql> use test2;
mysql> delete from yy where id=3;
開始做恢復,恢復全備份
命令如下:

innobackupex –apply-log –redo-only /opt/mysqlbackup/full/full_incre_20160912_235237/

部分顯示信息如下圖所示:
這裏寫圖片描述
–redo-only 用於準備增量備份內容把數據合併到全備份目錄,配合incremental-dir 增量備份目錄使用
基於全備份進行第一次增量備份的恢復
命令如下:

innobackupex –apply-log –redo-only /opt/mysqlbackup/full/full_incre_20160912_235237/ –incremental-dir=/opt/mysqlbackup/inc/incre_20160912_235636/

基於全備份和第一次增量備份,恢復第二次增量備份
命令如下:

innobackupex –apply-log –redo-only /opt/mysqlbackup/full/full_incre_20160912_235237/ –incremental-dir=/opt/mysqlbackup/inc/incre_20160912_235942/

恢復整個數據庫
停止數據庫

systemctl stop mysqld

清空數據目錄下所有文件

mkdir -p /tmp/mysqldatabak

mv /usr/local/mysql/data/* /tmp/mysqldatabak/

將恢復好的數據按照配置文件的需求拷貝到相應目錄

innobackupex –defaults-file=/etc/my.cnf –user=root –password=”123456” –copy-back /opt/mysqlbackup/full/full_incre_20160912_235237/

當數據恢復至DATADIR目錄以後,還需要確保所有數據文件的屬主和屬組均爲正確的用戶,如mysql,否則,在啓動mysqld之前還需要事先修改數據文件的屬主和屬組。
賦予mysql賬號權限

chown -R mysql:mysql /usr/local/mysql/data/

啓動mysql服務

systemctl start mysqld

登錄mysql界面,查看數據是否已經恢復,如下所示:
mysql> use test2;
mysql> select * from yy;
+——+——+
| id | name |
+——+——+
| 1 | kim1 |
| 2 | kim2 |
| 3 | kim3 |
| 4 | kim4 |
+——+——+

附:Xtrabackup的“流”及“備份壓縮”功能
Xtrabackup對備份的數據文件支持“流”功能,即可以將備份的數據通過STDOUT傳輸給tar程序進行歸檔,而不是默認的直接保存至某備份目錄中。要使用此功能,僅需要使用–stream選項即可。如:

innobackupex –user=root –password=”123456” –stream=tar /opt/mysqlbackup/full/ | gzip >/opt/mysqlbackup/full/full_date +%F_%H%M%S.tar.gz

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