MySQL學習筆記之八:使用Xtrabackup進行MySQL熱備

  xtrabackup是由percona提供的mysql數據庫備份工具,是一款開源的能夠對innodb和xtradb數據庫進行熱備的工具。

  xtrabackup對InnoDB支持熱備,完全備份和增量備份;對MyISAM引擎支持溫備,完全備份


一、特點:

   ①備份過程快速、可靠;

   ②備份過程不會打斷正在執行的事務;

   ③能夠基於壓縮等功能節約磁盤空間和流量;

   ④自動實現備份檢驗;

   ④還原速度快;

     

二、安裝:

    其最新版的軟件可從 http://www.percona.com/software/percona-xtrabackup/ 獲取

      yum -y install percona-xtrabackup-2.3.4-1.el6.x86_64.rpm

    安裝XtraBackup後,會生成如下幾個工具:

      innobackupex:這個是其實是下面三個工具的一個perl腳本封裝,可以備份MyISAM, InnoDB, XtraDB表。但在處理MyISAM表時需要施加一個全局的讀鎖。通常使用該工具來作備份

      xtrabackup:只能備份InnoDB和XtraDB數據。

      xbcrypt:用來加密或解密備份的數據。

      xbstream:用來解壓或壓縮xbstream格式的壓縮文件。

[root@node1 ~]# yum -y install percona-xtrabackup-2.3.4-1.el6.x86_64.rpm
...
Installed:
  percona-xtrabackup.x86_64 0:2.3.4-1.el6                                                                                                                                  

Dependency Installed:
  libev.x86_64 0:4.03-3.el6            mysql-libs.x86_64 0:5.1.73-5.el6_6            perl-DBD-MySQL.x86_64 0:4.013-3.el6                        

Complete!

[root@node1 ~]# rpm -ql percona-xtrabackup
/usr/bin/innobackupex
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/share/doc/percona-xtrabackup-2.3.4
/usr/share/doc/percona-xtrabackup-2.3.4/COPYING
/usr/share/man/man1/innobackupex.1.gz
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz


三、innobackupex的常用選項

    --host:指定數據庫服務器地址

    --port:指定連接到數據庫服務器的哪個端口

    --socket:連接本地數據庫時使用的套接字路徑

    --no-timestamp:在使用innobackupex進行備份時,可使用--no-timestamp選項來阻止命令自動創建一個以時間命名的目錄;如此一來,innobackupex命令將會創建一個BACKUP-DIR目錄來存儲備份數據

    --default-files:可通過此選項指定其它的配置文件;但是使用時必須放於所有選項的最前面

    --incremental:指定創建增量備份

    --incremental-basedir:指定基於哪個備份做增量備份

    --apply-log:應用xtrabackup_logfile文件,重做已提交的事務,回滾未提交的事務

    --redo-only:只重做已提交的事務,不準加滾

    --use-memory:在“準備”階段可提供多少內存以加速處理,默認是100M

    --copy-back:恢復備份至數據庫服務器的數據目錄

    --compact:壓縮備份

    --stream={tar|xbstream}:對備份的數據流式化處理  

  

四、備份的實現

  1、完全備份(注意:xtrabackup不會備份二進制文件)

      1)創建備份用戶

            grant reload,lock tables,replication client,create tablespace,super on *.* to bkpuser@'192.168.30.%' identified by 's3cret';

      2)進行全備

             innobackupex --user=DBUSER --host=SERVER --password=DBUSERPASS /path/to/BACKUP-DIR


      使用innobakupex備份時,其會調用xtrabackup備份所有的InnoDB表,複製所有關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命名的目錄中。

      在備份的同時,innobackupex還會在備份目錄中創建如下文件:

       ①xtrabackup_checkpoints:備份類型(如完全或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌序列號)範圍信息。例如:          

           backup_type = full-backuped

           from_lsn = 0

           to_lsn = 1291135

每個InnoDB頁(通常爲16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的。

       ②xtrabackup_binlog_info:mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置。

       ③xtrabackup_logfile

       ④xtrabackup_info:有關此次備份的各種詳細信息

       ⑤backup-my.cnf:備份命令用到的配置選項信息;

#以下備份和原始數據位於同一主機上,純粹爲演示方便,實際環境中儘量分開
[root@node1 ~]# innobackupex /backup   #執行完全備份
...
160305 07:44:45 [00] Writing backup-my.cnf
160305 07:44:45 [00]        ...done
160305 07:44:45 [00] Writing xtrabackup_info
160305 07:44:45 [00]        ...done
xtrabackup: Transaction log of lsn (1827871) to (1827871) was copied.
160305 07:44:45 completed OK!
[root@node1 ~]# ls /backup
2016-03-05_07-44-42
[root@node1 ~]# cd /backup/2016-03-05_07-44-42/
[root@node1 2016-03-05_07-44-42]# ls   #可以看到,innobackupex不會備份二進制日誌
backup-my.cnf  hellodb  ibdata1  library  mysql  performance_schema  test  testdb  
xtrabackup_binlog_info  xtrabackup_checkpoints  xtrabackup_info  xtrabackup_logfile
[root@node1 2016-03-05_07-44-42]# cat xtrabackup_binlog_info 
mysql-bin.000007        326     0-1-30
[root@node1 2016-03-05_07-44-42]# cat xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 1827871
last_lsn = 1827871
compact = 0
recover_binlog_info = 0
[root@node1 2016-03-05_07-44-42]# cat xtrabackup_info 
uuid = 13334d2d-e263-11e5-b40f-000c2940359d
name = 
tool_name = innobackupex
tool_command = /backup
tool_version = 2.3.4
ibbackup_version = 2.3.4
server_version = 10.0.13-MariaDB-log
start_time = 2016-03-05 07:44:42
end_time = 2016-03-05 07:44:45
lock_time = 0
binlog_pos = filename 'mysql-bin.000007', position '326', GTID of the last change '0-1-30'
innodb_from_lsn = 0
innodb_to_lsn = 1827871
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N


  2、增量備份

      我們知道,innodb會維護一個redo log file(即事務日誌文件),它會記錄每個innodb表數據的修改。每個InnoDB的頁面都會包含一個LSN信息,每當相關的數據發生改變,相關的頁面的LSN就會自動增長。

      xtrabackup會在後臺開啓一個log-copying的線程,該線程會對redo log file進行監視,並把從LSN(Xtrabackup在啓動時會從redo log file中獲取最近一次的checkpoint對應的log sequence number)開始增加的數據塊(日誌記錄)不斷的複製到叫xtrabackup_logfile的文件中。這個操作會在整個備份過程中一直進行,這也是爲什麼xtrabackup能對innodb表進行增量備份和熱備的原因


      innobackupex --incremental /data/backups --incremental-basedir=DIR

        --incremental:指定創建增量備份

        --incremental-basedir基於哪個備份目錄做增量備份,第一次增量備份應指向完全備份目錄,後續增量備份應指向上一次的增量備份目錄

        此命令執行結束後,innobackupex命令會在/backup目錄中創建一個新的以時間命名的目錄以存放所有的增量備份數據

      第一個增量備份目錄中的xtrabackup_checkpoints內容可能類似:         

        backup_type = incremental

        from_lsn = 1291135

        to_lsn = 1352113

      我們也可使用--incremental-lsn選項直接指定LSN來做增量備份:

        innobackupex --incremental /data/backups --incremental-lsn=最近一次備份的to_lsn

        因此,第二個增量備份也可寫作:

         innobackupex --incremental /data/backups --incremental-lsn=1352113

      注意:增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是完全備份。

#對數據庫做一些更改
MariaDB [(none)]> create database electronic;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> use electronic
Database changed
MariaDB [electronic]> create table computer (Brand char(15) not null primary key,Quantify int);
Query OK, 0 rows affected (0.31 sec)
[root@node1 ~]# innobackupex --incremental /backup --incremental-basedir=/backup/2016-03-05_07-44-42/   #基於完全備份做第一次增量備份
...
MySQL binlog position: filename 'mysql-bin.000007', position '638', GTID of the last change '0-1-32'
160305 08:43:47 [00] Writing backup-my.cnf
160305 08:43:47 [00]        ...done
160305 08:43:47 [00] Writing xtrabackup_info
160305 08:43:47 [00]        ...done
xtrabackup: Transaction log of lsn (1831879) to (1831879) was copied.
160305 08:43:47 completed OK!
[root@node1 ~]# ls /backup
2016-03-05_07-44-42  2016-03-05_08-43-41
[root@node1 ~]# cd /backup/2016-03-05_08-43-41/
[root@node1 2016-03-05_08-43-41]# ls
backup-my.cnf  hellodb        ibdata1.meta  mysql               test    xtrabackup_binlog_info  xtrabackup_info
electronic     ibdata1.delta  library       performance_schema  testdb  xtrabackup_checkpoints  xtrabackup_logfile
[root@node1 2016-03-05_08-43-41]# ls electronic/
computer.frm  computer.ibd.delta  computer.ibd.meta  db.opt
[root@node1 2016-03-05_08-43-41]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1827871
to_lsn = 1831879
last_lsn = 1831879
compact = 0
recover_binlog_info = 0
#再做一些更改
MariaDB [(none)]> create database commodity;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> create table commodity.sales (Category char(15) not null,Sales int);
Query OK, 0 rows affected (0.29 sec)
[root@node1 ~]# innobackupex --incremental /backup --incremental-lsn=1831879   #可基於lsn號做增量備份
[root@node1 ~]# ls /backup
2016-03-05_07-44-42  2016-03-05_08-43-41  2016-03-05_09-24-41
[root@node1 ~]# cd /backup/2016-03-05_09-24-41/
[root@node1 2016-03-05_09-24-41]# ls
backup-my.cnf  electronic  ibdata1.delta  library  performance_schema  testdb                  xtrabackup_checkpoints  xtrabackup_logfile
commodity      hellodb     ibdata1.meta   mysql    test                xtrabackup_binlog_info  xtrabackup_info
[root@node1 2016-03-05_09-24-41]# cat xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 1831879
to_lsn = 1837327
last_lsn = 1837327
compact = 0
recover_binlog_info = 0

  3、“準備”(prepare)備份

       在備份完成後,數據尚且不能直接用於恢復操作,因爲備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務,而且備份過程中可能還有數據的更改動作,此時xtrabackup_logfile就可派上用場了。xtrabackup會解析該文件,對事務已經提交但數據還沒有寫入的部分,進行redo重做;將已經寫到數據文件,但未提交的事務通過undo進行回滾,從而使得數據文件處於一致性狀態。此功能是通過使用innobakupex命令的 --apply-log 選項實現的;另外,一個事務在前一個備份中沒有提交,但可能在其後的備份中提交了,innobakupex命令的 --redo-only 選項表示只能redo,不能回滾,此選項在合併增量備份中需要用到(最後一個除外)。

       執行步驟:

        innobackupex --apply-log --redo-only [--use-memory=1G] BASE-DIR   #使用較大的內存可加快處理速度

        innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1   #合併第一個增量備份

        innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2  #合併最後一個增量備份

        innobackupex --apply-log BASE-DIR  #合併所有增量備份後對所有未提交的事務進行回滾

        其中BASE-DIR指的是完全備份所在的目錄,而INCREMENTAL-DIR-1指的是第一次增量備份的目錄,INCREMENTAL-DIR-2指的是第二次增量備份的目錄,依次類推。

       注意增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是完全備份。


  4、恢復數據(數據恢復完畢後最好做一次完全備份)

      innobackupex命令的--copy-back選項用於執行恢復操作,其通過複製所有數據相關的文件至mysql服務器DATADIR目錄中來執行恢復過程。innobackupex通過backup-my.cnf來獲取DATADIR目錄的相關信息。

      innobackupex --copy-back BASE-DIR

      如果執行正確,其輸出信息的最後幾行通常如下:

        innobackupex: Starting to copy InnoDB log files

        innobackupex: in '/backup/2012-04-07_08-17-03'

        innobackupex: back to original InnoDB log directory '/mydata/data'

        innobackupex: Finished copying back files.


        120407 09:36:10  innobackupex: completed OK!

        要確保如上信息的最行一行出現“innobackupex: completed OK!”。

      注意:

        恢復之前,mysql服務必須停止

        恢復之前,數據目錄必須爲空,--copy-back不會覆蓋已存在的文件,除非添加選項--force-non-empty-directories

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

          chown -R mysql:mysql /mydata/data/

#還原備份
MariaDB [(none)]> create table hellodb.staff (ID tinyint not null,Name char(15));
Query OK, 0 rows affected (0.32 sec)

MariaDB [(none)]> drop database hellodb;   #模擬誤刪數據
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000007 |     1150 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> exit
Bye
[root@node1 ~]# service mysqld stop   #立即停止服務
Shutting down MySQL.. SUCCESS! 
[root@node1 ~]# cat /backup/2016-03-05_09-24-41/xtrabackup_binlog_info   #查看最近一次備份時二進制日誌的位置
mysql-bin.000007	942	0-1-34
[root@node1 ~]# mysqlbinlog /mysql-binlog/mysql-bin.000007 | less   #查看誤操作的起始位置
...
# at 1063
#160305  9:52:24 server id 1  end_log_pos 1150  Query   thread_id=15    exec_time=0     error_code=0
SET TIMESTAMP=1457142744/*!*/;
drop database hellodb
...
[root@node1 ~]# mysqlbinlog --start-position=942 --stop-position=1063 /mysql-binlog/mysql-bin.000007 > /tmp/mysql.sql   #將最後一次備份到誤操作之間的所有日誌導出
[root@node1 ~]# innobackupex --apply-log --redo-only /backup/2016-03-05_07-44-42   #“準備”備份
...
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 1827871
160305 10:04:42 completed OK!
[root@node1 ~]# innobackupex --apply-log --redo-only /backup/2016-03-05_07-44-42 --incremental-dir=/backup/2016-03-05_08-43-41
...
[root@node1 ~]# innobackupex --apply-log /backup/2016-03-05_07-44-42 --incremental-dir=/backup/2016-03-05_09-24-41
...
160305 10:09:45 completed OK!
[root@node1 ~]# innobackupex --apply-log /backup/2016-03-05_07-44-42
...
[root@node1 ~]# rm -rf /mydata/data/*   #恢復數據前,數據目錄必須爲空
[root@node1 ~]# innobackupex --copy-back /backup/2016-03-05_07-44-42/   #恢復數據
...
160305 10:28:43 [01] Copying ./xtrabackup_info to /mydata/data/xtrabackup_info
160305 10:28:43 [01]        ...done
160305 10:28:43 completed OK!
[root@node1 ~]# ls /mydata/data
commodity   hellodb  ib_logfile0  library  node1.err           test    xtrabackup_binlog_pos_innodb
electronic  ibdata1  ib_logfile1  mysql    performance_schema  testdb  xtrabackup_info
[root@node1 ~]# chown -R mysql.mysql /mydata/data   #數據恢復後一定要注意修改屬主屬組
[root@node1 ~]# vim /etc/my.cnf
...
[mysqld]
...
skip-networking   #先禁止通過網絡訪問
...
[root@node1 ~]# service mysqld start
Starting MySQL.. SUCCESS!
[root@node1 ~]# mysql < /tmp/mysql.sql   #導入,將最近一次備份到誤刪動作之間的修改動作重放

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| commodity          |
| electronic         |
| hellodb            |   #已恢復
| information_schema |
| library            |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
9 rows in set (0.00 sec)

MariaDB [(none)]> use hellodb
Database changed
MariaDB [hellodb]> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
...
| staff             |
...
[root@node1 ~]# vim /etc/my.cnf
...
[mysqld]
...
#skip-networking   #去掉該行

[root@node1 ~]# service mysqld reload
 SUCCESS! Reloading service MySQL
[root@node1 ~]# rm -rf /backup/*
[root@node1 ~]# innobackupex --parallel=4 /backup   #恢復數據後應立即做一次完全備份
...
160305 14:30:59 Backup created in directory '/backup/2016-03-05_14-30-48'
...
160305 14:30:59 completed OK!
[root@node1 ~]# ls /backup
2016-03-05_14-30-48


  5、Xtrabackup的“流”及“備份壓縮”功能

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

        例如:innobackupex --stream=tar /backup | gzip > /backup/`date +%F_%H-%M-%S`.tar.gz

      甚至也可以使用類似如下命令將數據備份至其它服務器:

        innobackupex --stream=tar /backup | ssh [email protected] "cat - > /backups/`date +%F_%H-%M-%S`.tar"

      此外,在執行備份時,還可以使用 --parallel 選項對多個文件進行並行複製。此選項用於指定在複製時啓動的線程數目。當然,在實際進行備份時要利用此功能的便利性,也需要啓用innodb_file_per_table選項或共享的表空間通過innodb_data_file_path選項存儲在多個ibdata文件中。對某一數據庫的多個文件的複製無法利用到此功能。其簡單使用方法如下:

        innobackupex --parallel=# /path/to/backup 

[root@node1 ~]# innobackupex --stream=tar /bkptest | gzip > / bkptest/`date +%F_%H-%M-%S`.tar.gz
...
xtrabackup: Transaction log of lsn (1839146) to (1839146) was copied.
160305 12:20:17 completed OK!
[root@node1 ~]# ls /bkptest
2016-03-05_12-20-06.tar.gz


  6、導入或導出單張表

      默認情況下,InnoDB表不能通過直接複製表文件的方式在mysql服務器之間進行移植,即便使用了innodb_file_per_table選項。而使用Xtrabackup工具可以實現此種功能,此時需要“導出”表和“導入”表的mysql服務器都啓用了innodb_file_per_table選項。

     ①“導出”表

         導出表是在備份的prepare階段進行的,因此,一旦完全備份完成,就可以在prepare過程中通過--export選項將某表導出了:

           innobackupex --apply-log --export /path/to/backup

         此命令會爲每個innodb表的表空間創建一個以.exp結尾的文件,這些以.exp結尾的文件則可以用於導入至其它服務器。

     ②“導入”表

         要在mysql服務器上導入來自於其它服務器的某innodb表,需要先在當前服務器上創建一個跟原表表結構一致的表,而後才能實現將表導入:

           mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;

         然後將此表的表空間刪除:

           mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

         接下來,將來自於“導出”表的服務器的mytable表的mytable.ibd和mytable.exp文件複製到當前服務器的數據目錄,然後使用如下命令將其“導入”:

           chown mysql.mysql mytable.ibd mytable.exp   #導入之前先修改其屬主屬組

           mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

[root@node1 ~]# innobackupex --apply-log --export /backup/2016-03-05_14-30-48/
...
160305 14:37:09 completed OK!
[root@node1 ~]# cd /backup/2016-03-05_14-30-48/
[root@node1 2016-03-05_14-30-48]# ls testdb
db.opt  students.cfg  students.exp  students.frm  students.ibd  wuxia.cfg  wuxia.exp  wuxia.frm  wuxia.ibd
mysql> create database culture;
Query OK, 1 row affected (0.00 sec)

mysql> use culture
Database changed
mysql> create table wuxia (
    ->   TID tinyint unsigned not null auto_increment primary key,
    ->   Name char(20) not null,
    ->   Class char(20),
    ->   Gender enum('f','m') not null,
    ->   Age tinyint) engine=innodb;
Query OK, 0 rows affected (0.15 sec)

mysql> mysql alter table wuxia discard tablespace;
Query OK, 0 rows affected (0.04 sec)
[root@node1 2016-03-05_14-30-48]# scp testdb/{wuxia.exp,wuxia.ibd} [email protected]:/mydata/data/culture
[email protected]'s password: 
wuxia.exp                                                   100%   16KB  16.0KB/s   00:00    
wuxia.ibd                                                   100%   96KB  96.0KB/s
[root@node3 ~]# cd /mydata/data/culture
[root@node3 culture]# ls
db.opt  wuxia.exp  wuxia.frm  wuxia.ibd
#複製表文件後一定要注意其屬性和權限,確保mysql用戶能訪問
[root@node3 culture]# chown mysql.mysql wuxia.exp wuxia.ibd
[root@node3 culture]# chmod --reference=wuxia.frm wuxia.exp wuxia.ibd
[root@node3 culture]# ll
total 120
-rw-rw---- 1 mysql mysql    61 Feb 24 22:21 db.opt
-rw-rw---- 1 mysql mysql 16384 Feb 24 22:41 wuxia.exp
-rw-rw---- 1 mysql mysql  1138 Feb 24 22:30 wuxia.frm
-rw-rw---- 1 mysql mysql 98304 Feb 24 22:41 wuxia.ibd

mysql> alter table wuxia import tablespace;   #導入表空間
Query OK, 0 rows affected, 1 warning (0.11 sec)

mysql> select * from wuxia;
+-----+--------------+------------+--------+------+
| TID | Name         | Class      | Gender | Age  |
+-----+--------------+------------+--------+------+
|   1 | Ling Huchong | Huashanpai | m      |   27 |
|   2 | Zhou Zhiruo  | Emeipai    | f      |   25 |
|   3 | Qiao Feng    | Gaibang    | m      |   30 |
+-----+--------------+------------+--------+------+
3 rows in set (0.04 sec)


  7、使用Xtrabackup對數據庫進行部分備份

      Xtrabackup也可以實現部分備份,即只備份某個或某些指定的數據庫或某數據庫中的某個或某些表。但要使用此功能,必須啓用 innodb_file_per_table 選項,即每張表保存爲一個獨立的文件。同時,其也不支持--stream選項,即不支持將數據通過管道傳輸給其它程序進行處理。

      此外,還原部分備份跟還原全部數據的備份也有所不同,即不能通過簡單地將prepared的部分備份使用 --copy-back 選項直接複製回數據目錄,而是要通過導入表的方向來實現還原,如果表較多的話就比較麻煩。當然,有些情況下,部分備份也可以直接通過--copy-back進行還原,但這種方式還原而來的數據多數會產生數據不一致的問題,因此,不推薦使用這種方式。

      ①創建部分備份

         有三種方式:正則表達式(--include), 枚舉表文件(--tables-file)和列出要備份的數據庫(--databases)。

         (a)使用--include

             要求爲其指定要備份的表的完整名稱,即形如databasename.tablename

             innobackupex --include='^mydatabase[.]mytable' /path/to/backup     

         (b)使用--tables-file

             此選項的參數需要是一個文件名,此文件中每行包含一個要備份的表的完整名稱;

             echo -e 'magedu.tb1\nmagedu.tb2' > /tmp/tables.txt

             innobackupex --tables-file=/tmp/tables.txt /path/to/backup

         (c)使用--databases

             此選項接受的參數爲數據庫名,如果要指定多個數據庫,彼此間需要以空格隔開;同時,在指定某數據庫時,也可以只指定其中的某張表。此外,此選項也可以接受一個文件爲參數,文件中每一行爲一個要備份的對象。如:

             innobackupex --databases="hellodb testdb" /path/to/backup

      ②整理(preparing)部分備份

         prepare部分備份的過程類似於導出表的過程,要使用--export選項進行:

           innobackupex --apply-log --export /path/to/partial/backup

         此命令執行過程中,innobackupex會調用xtrabackup命令從數據字典中移除缺失的表,因此,會顯示出許多關於“表不存在”類的警告信息。同時,也會顯示出爲備份文件中存在的表創建.exp文件的相關信息。

      ③還原部分備份

         還原部分備份的過程跟導入表的過程相同。當然,也可以通過直接複製prepared狀態的備份直接至數據目錄中實現還原,不過此時要求數據目錄處於一致狀態。


  8、壓縮備份

      innobackup通過 --compact 選項提供了壓縮備份的功能,壓縮備份以忽略輔助索引爲代價來獲取更小的備份體積,因此,在“準備”備份的階段會花更多的時間重建輔助索引

      注意:壓縮備份不支持“統一表空間”,只支持“單獨表空間”(innodb-file-per-table)

      創建壓縮備份:

         innobackupex --compact /data/backups

         若壓縮成功,則備份目錄的xtrabackup_checkpoints文件中會有一行“compact = 1”;

      “準備”壓縮備份:需要指定 --rebuild-indexed 選項

         innobackupex --apply-log --rebuild-indexes /data/backups/2013-02-01_10-29-48

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