使用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,如需轉載請自行聯系原作者