xtrabackup備份mysql innodb

wang_0720發表於2014-03-19
在mysql資料量不大的時候用mysqldump來備份還可以湊合,當資料越來越大時,利用mysqldump出來的資料還原的話就很費時了,這時就需要一種高效率的備份還原工具來完成這個重要的任務。好在percona公司給使用者提供了一款開源、免費的熱備工具,xtrabackup.xtrabakup包含兩個工具:
xtrabackup是用於熱備份innodb, xtradb表中資料的工具,不能備份其他型別的表,也不能備份資料表結構
innobackupex是將xtrabackup進行封裝的perl指令碼,提供了備份myisam表的能力
本文將對innobackupex進行詳細的說明和測試
原理
1 記錄備份開始時InnoDB儲存引擎重做日誌產生的檢查點LSN
2 複製共享表空間檔案以及獨立表空間檔案
3 記錄複製完表空間檔案後,InnoDB儲存引擎重做日誌檔案檢查點LSN
4 複製在備份時產生的重做日誌
安裝xtrabackup很簡單,要安裝perl-DBD-MySQL包。從procona官網下載合適版本的xtrabackup,將其解包,在解開的包percona-xtrabackup-2.1.8-Linux-i686中有如下命令
innobackupex      
xbcrypt  
xtrabackup    
xtrabackup_56
innobackupex-1.5.1 
xbstream 
xtrabackup_55
將這些命令複製到/usr/bin下,方便以後使用。
到此xtrabackup安裝工作結束
備份測試
全備
資料庫建測試表
mysql> use test;
Database changed
mysql> create table book (id int,name varchar(5));
Query OK, 0 rows affected (0.01 sec)

mysql> desc book;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(11)    | YES  |     | NULL    |       |
| name  | varchar(5) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
寫入輸入若干條
[root@localhost ~]# cat test.sh
#!/bin/bash
for i in `seq 1 1000`;do
mysql -e "insert into test.book values($i,"$i");"
done
執行該指令碼,向book表中插入1000條資料
驗證資料
mysql> select count(*) from book;
+----------+
| count(*) |
+----------+
|     1000 |
+----------+
1 row in set (0.02 sec)
全備資料
innobackupex --defaults-file=/etc/my.cnf  /home/databackup/full/
為了測試方便,這裡沒設mysql密碼,可以加引數--user=xxx --password=yyy
如果沒有報錯,在/home/databackup/full/目錄下會生成以當前時間命令的目錄,其下有若干檔案
[root@localhost ~]# ll /home/databackup/full/2014-03-19_15-51-43/
total 18464
-rw-r--r--. 1 root root      262 Mar 19 15:51 backup-my.cnf
-rw-r-----. 1 root root 18874368 Mar 19 15:51 ibdata1
drwxr-xr-x. 2 root root     4096 Mar 19 15:51 mysql
drwxr-xr-x. 2 root root     4096 Mar 19 15:51 performance_schema
drwx------. 2 root root     4096 Mar 19 15:51 test
-rw-r--r--. 1 root root       13 Mar 19 15:51 xtrabackup_binary
-rw-r--r--. 1 root root       26 Mar 19 15:51 xtrabackup_binlog_info
-rw-r-----. 1 root root       89 Mar 19 15:51 xtrabackup_checkpoints
-rw-r-----. 1 root root     2560 Mar 19 15:51 xtrabackup_logfile
ll /home/databackup/full/2014-03-19_15-51-43/test/
total 144
-rw-r-----. 1 root root   8586 Mar 19 15:51 book.frm
-rw-r-----. 1 root root 131072 Mar 19 15:51 book.ibd
-rw-r--r--. 1 root root     61 Mar 19 15:51 db.opt
有book.ibd檔案,說明mysql使用了獨立表空間。
刪除表book,模擬災難恢復
mysql> use test;
Database changed
mysql> drop table book;
Query OK, 0 rows affected (0.04 sec)

mysql> show tables;
Empty set (0.00 sec)
關閉mysql,恢復資料
innobackupex --apply-log --redo-only /home/databackup/full/2014-03-19_15-51-43/
利用全備的資料來恢復,--apply-log引數是應用transaction_logfile產生新的重做日誌 ,--redo-only只做redo,不做rollback,
再次執行,生成redolog,以便mysql能快速啟動
innobackupex --apply-log --redo-only /home/databackup/full/2014-03-19_15-51-43/
複製檔案到資料目錄,建議先將資料目錄中的資料打包,然後清空,否則會報錯。
innobackupex --copy-back /home/databackup/full/2014-03-19_15-51-43/
該資料許可權為mysql
chown mysql.mysql -R /var/lib/mysql
啟動mysql
驗證恢復結果
mysql> use test;
Database changed
mysql> select count(*) from book;
+----------+
| count(*) |
+----------+
|     1000 |
+----------+
1 row in set (0.00 sec)
增量備份
innobackupex --defaults-file=/etc/my.cnf --incremental-basedir=/home/databackup/full/2014-03-19_15-51-43/ --incremental /home/databackup/delta/
--incremental-basedir指向全備目錄,也可以指向最近一次增量備份的目錄
--incremental 指向本次要增量備份的目錄
上面語句執行成功之後,會在--incremental執行的目錄下建立一個時間戳子目錄,在該目錄下存放著增量備份的所有檔案
恢復
innobackupex --apply-log --redo-only BASE-DIR  
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1  
innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
BASE-DIR全備目錄,INCREMENTAL-DIR-1第一次增量的目錄,INCREMENTAL-DIR-2第二次增量的目錄
本例:
innobackupex --apply-log --redo-only /home/databackup/full/2014-03-19_15-51-43/
innobackupex --apply-log --redo-only /home/databackup/full/2014-03-19_15-51-43/ --incremental-dir=/home/databackup/delta/2014-03-19_16-23-11
如果有多個增量的話要依次把增量日誌應用到全備。
innobackupex --apply-log BASE-DIR
再次執行apply-log回滾未完成的日誌
最後複製檔案
innobackupex --copy-back BASE-DIR
該許可權,啟動mysql

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27181165/viewspace-1125092/,如需轉載,請註明出處,否則將追究法律責任。

相關文章