天天看點

使用Xtrabackup備份工具

         使用Xtrabackup備份工具

MySQL自帶工具的缺點

1.mysqldump效率比較低,備份和還原的速度都很慢,任何資料插入和更新操作都會被挂起

2.mysqlhotcopy  mysqlhotcopy 是專門針對myisam 資料表進行備份,備份的過程中,任何資料插入和更新操作都會被挂起

xtrabackup 是 percona 的一個開源項目

可以熱備份innodb ,XtraDB,MyISAM

主要包括兩個工具

xtrabackup、innobackupex

xtrabackup隻能備份InnoDB和XtraDB兩種資料表,不能備份MyISAM資料表

innobackupex則封裝了xtrabackup,是一個腳本封裝,能同時備份innodb和myisam

xtrabackup做完整備份 增量 差異

         恢複

os             Red Hat Enterprise Linux Server release 6.4 (Santiago)

mysql-server   MySQL-server-5.6.15-1.el6.x86_64

xtrbackup      percona-xtrabackup-2.1.6-702.rhel6.x86_64.rpm

percona-xtrabackup 軟體提供2個備份指令

/usr/bin/xtrabackup_55  ->  備份 MySQL-server-5.5

/usr/bin/xtrabackup_56  ->  備份 MySQL-server-5.6

xtrabackup_56 備份指令常用選項

注意: xtrabackup隻能對innodb表 和 XtraDB表做備份,且隻能備份表中的資料,不能備份表結構,所有用xtrabackup進行資料恢複時 表一定要存在。

--datadir=/var/lib/mysql   指定資料庫目錄

--backup  備份資料

--prepare 恢複資料

--target-dir  指定資料備份目錄  

--incremental-basedir  指定對哪個資料備份目錄做增量備份

--incremental-dir  指定用哪個增量備份目錄做資料恢複

一、用xtrabackup 做完整備份

1、[root@localhost ~]# mysql -uroot -p123

2、mysql> create database  test10;

3、mysql> create table test10.a(id int)engine=innodb;

4、mysql> insert into test10.a values(10),(10),(10),(10),(10);

5、建立存放完整備份檔案的目錄

[root@localhost ~]# mkdir  /databasedir/first -p

6、對伺服器上的所有庫做完整備份(xtrabackup_56指令沒有對某個庫做完整備份的選項)

[root@localhost ~]# xtrabackup_56  --datadir=/var/lib/mysql/ --backup  --target-dir=/databasedir/first

二、模拟資料丢失,用完整備份檔案恢複資料

1、mysql> delete from   test10.a;

2、用完整備份檔案恢複資料

[root@localhost ~]# xtrabackup_56  --prepare  --target-dir=/databasedir/first/

[root@localhost ~]# cp /databasedir/first/test10/* /var/lib/mysql/test10/

cp: overwrite `/var/lib/mysql/test10/a.ibd'? y

[root@localhost ~]#

3、mysql> quit;

4、重新開機資料庫服務//重新開機之後資料庫才能重新加載日志檔案,才能備份成功

[root@localhost ~]# service  mysql  restart

Shutting down MySQL.. SUCCESS!

Starting MySQL... SUCCESS!

5、

[root@localhost ~]# mysql -uroot -p123

mysql> select * from test10.a;

+------+

| id   |

|   10 |

5 rows in set (0.00 sec)

mysql>

這樣xtrabackup做資料的完整備份與完整恢複就完成了。

三、用xtrabackup做資料的增量備份

1、向test10下的a表插入新的記錄條目

mysql> insert into test10.a values(80),(80),(80),(80),(80);

2、建立存放新的記錄備份檔案的目錄

[root@localhost ~]# mkdir  /databasedir/two

3、用xtrabackup做資料的增量備份

[root@localhost ~]# xtrabackup_56  --datadir=/var/lib/mysql/  --backup  --incremental-basedir=/databasedir/first/  --target-dir=/databasedir/two

4、第二次向test10下的a表插入新的記錄條目

mysql> insert into test10.a values(300),(300),(300),(300),(300);

5、建立存放新的記錄備份檔案的目錄

[root@localhost ~]# mkdir /databasedir/three

6、用xtrabackup做資料的增量備份

[root@localhost ~]# xtrabackup_56  --datadir=/var/lib/mysql/  --backup  --incremental-basedir=/databasedir/two/  --target-dir=/databasedir/three

四、用完整備份+增量備份恢複資料

1、模拟資料丢失

mysql> delete from test10.a;

2、用備份檔案恢複資料

[root@localhost ~]# xtrabackup_56 --prepare --target-dir=/databasedir/first/

[root@localhost ~]# xtrabackup_56 --prepare --target-dir=/databasedir/first --incremental-dir=/databasedir/two/

[root@localhost ~]# xtrabackup_56 --prepare --target-dir=/databasedir/first --incremental-dir=/databasedir/three/

3、把恢複後的資料拷貝到test10資料庫目錄下

4、重新開機資料庫服務

|   80 |

|  300 |

15 rows in set (0.00 sec)

這樣完整備份+增量備份恢複資料ok了。

做完實驗之後檢視一下各自目錄下的日志檔案和check_point檔案

xtrabackup工作原理

MySQL資料庫本身提供的工具并不支援真正的增量備份,二進制日志恢複是point-in-time(時間點)的恢複而不是增量備份。Xtrabackup工具支援對InnoDB存儲引擎的增量備份,工作原理如下:

  (1)首先完成一個完全備份,并記錄下此時檢查點的LSN(Log Sequence Number)。

  (2)在程序增量備份時,比較表空間中每個頁的LSN是否大于上次備份時的LSN,如果是,則備份該頁,同時記錄目前檢查點的LSN。

  首先,在logfile中找到并記錄最後一個checkpoint(“last checkpoint LSN”),然後開始從LSN的位置開始拷貝InnoDB的logfile到xtrabackup_logfile;接着,開始拷貝全部的資料文 件.ibd;在拷貝全部資料檔案結束之後,才停止拷貝logfile。

  因為logfile裡面記錄全部的資料修改情況,是以,即時在備份過程中資料檔案被修改過了,恢複時仍然能夠通過解析xtrabackup_logfile保持資料的一緻。

  C、Xtrabackup備份原理

  XtraBackup基于InnoDB的crash-recovery功能。它會複制innodb的data file,由于不鎖表,複制出來的資料是不一緻的,在恢複的時候使用crash-recovery,使得資料恢複一緻。

  InnoDB維護了一個redo log,又稱為transaction log,事務日志,它包含了innodb資料的所有改動情況。當InnoDB啟動的時候,它會先去檢查data file和transaction log,并且會做二步操作:

  XtraBackup在備份的時候, 一頁一頁地複制innodb的資料,而且不鎖定表,與此同時,XtraBackup還有另外一個線程監視着transactions log,一旦log發生變化,就把變化過的log pages複制走。為什麼要急着複制走呢? 因為transactions log檔案大小有限,寫滿之後,就會從頭再開始寫,是以新資料可能會覆寫到舊的資料。

  在prepare過程中,XtraBackup使用複制到的transactions log對備份出來的innodb data file進行crash recovery。

      本文轉自Jx戰壕  51CTO部落格,原文連結:http://blog.51cto.com/xujpxm/1386298,如需轉載請自行聯系原作者