innobackupex 部分表備份和恢復

賀子_DBA時代發表於2018-12-01

Percona XtraBackup的功能之一“部分備份(partial backups)”,即讓使用者可以備份指定的表或 。要注意的是:你希望備份的表必須是在獨立的表空間中,即該表在建立以前,你的 開啟了innodb_file_per_table設定。

還一點要注意的是:不要將prepared backup備份的東西複製回去。部分備份使用的是匯入表(importing the tables),而不是全庫備份的--copy-back引數。

關於innobackupex可以實現部分表或者庫的(增量)備份和恢復

部分備份共有三種方式,分別是:

1. 用正規表示式表示要備份的庫名及表名(引數為--include);

2. 將要備份的表名或庫名都寫在一個文字檔案中(引數為--tables-file)

3. 將要備份表名或庫名完整的寫在命令列或者檔案中中(引數為:--databases)

方式一:使用--include引數

這種方式透過正規表示式來匹配資料庫名和表名,你需要寫完整的資料庫名及表名,如果資料庫有使用者名稱密碼請使用--user和--password指定相關資訊。,格式如下:databasename.tablename。下面是一個例子:

[root@tool202 2018-12-01_20-39-31]# innobackupex --include='liuwenhe.liuwenhe'  /data/

上面的方式會和其他使用innobackupex命令的備份方式一樣,建立一個時間戳命名的資料夾,不同的是,最終只包括那些正規表示式匹配的表(liuwenhe.liuwenhe)。

要注意的是,這個命令最後會傳給xtrabackup --tables命令執行;

方式二:使用--tables-file引數

這種方式是將所有要備份的完整表名都寫在一個文字檔案中,每行一個完整表名,然後程式讀取這個文字檔案進行備份。完整表名即:databasename.tablename,如果需要備份某個庫的全部表則可以寫成databasename.*.需要注意的是檔案中每行開頭和結尾不能有空格!下面是一個例子:

[root@rongduan-renhang32 ~]# cat  name.txt

liuwenhe.liu

liuwenhe.he

liuhe.*

可以有需要的話使用下面命令去掉每行結尾的空格

[root@rongduan-renhang32 ~]#sed  -e 's/[ ]*$//g'  name.txt  >name1.txt

2.然後執行備份:

[root@rongduan-renhang32 ~]#  innobackupex  --user=root --password='V56788@1qaz' --port=3306 --tables-file=/root/name.txt   /data/

上面的方式會和其他使用innobackupex命令的備份方式一樣,建立一個時間戳命名的資料夾,不同的是,最終只包括那些檔案中指定的表名。

這個命令最後會傳給xtrabackup --tables-file命令執行,而不是--tables,這個命令只會建立那些需要備份的資料庫資料夾。

方式三:使用--databases引數

使用這種方式,使用者既可以將所有要備份的資料庫名和完整表名都寫在一起,以空格分隔,也可以將資料庫名、完整表名寫在一個檔案中,每行一個,需要注意的是如果需要備份整個mysql庫,那麼區別於 --tables-file引數,直接寫上庫名字就可以了 ,.下面是一個例子:

[root@tool202 liuwenhe]#  innobackupex  --user=root --password='V56788@1qaz' --port=3306 --databases="liuwenhe.liuwenhe  mysql" /data

或者

[root@rongduan-renhang32 ~]# cat  name.txt

liuwenhe.liuwenhe

mysql            ###不用寫成mysql.*區別於--tables-file引數!

可以有需要的話使用下面命令去掉每行結尾的空格

[root@rongduan-renhang32 ~]#sed  -e 's/[ ]*$//g'  name.txt  >name1.txt

2.然後執行備份:

[root@rongduan-renhang32 ~]#  innobackupex  --user=root --password='V56788@1qaz' --port=3306 --databases=/root/name.txt   /data/

上面的方式會和其他使用 innobackupex 命令的備份方式一樣,建立一個時間戳命名的資料夾,最終結果將包括 liuwenhe 資料庫中的 liuwenhe 表,以及整個完整的mysql資料庫。

準備部分備份(Preparing Partial Backups)

執行preparing partial backups,使用--apply-log和--export引數,幷包含上一步生成的時間戳資料夾,如下:

[root@tool202 2018-12-01_21-10-20]# innobackupex   --port=3306 --apply-log  --export  /data/liuwenhe/2018-12-01_21-11-07/

執行命令的時候,對於那些不需要備份的表,會出現表不存在的提示。不用擔心,這是正常現象。

最終,記得觀察下面的輸出,已確定準備備份工作結束。

181201 21:15:50 completed OK!

恢復的操作:

1.先建立上需要恢復的表,注意表的儲存行的格式要和源端一樣,可以透過如下檢視錶的

root@localhost : liuwenhe 21:33:36>show  table  status like    'liuwenhe'\G;

*************************** 1. row ***************************

           Name: liuwenhe

         Engine: InnoDB

        Version: 10

     Row_format: Compact

           Rows: 4

Avg_row_length: 4096

    Data_length: 16384

Max_data_length: 0

   Index_length: 0

      Data_free: 0

Auto_increment: NULL

    Create_time: 2018-12-01 19:43:48

    Update_time: NULL

     Check_time: NULL

      Collation: utf8_general_ci

       Checksum: NULL

Create_options: row_format=COMPACT

        Comment:

1 row in set (0.00 sec)

如果不一樣可以透過如下方式修改:

root@localhost : liuwenhe 21:37:36>alter table  liuwenhe.liuwenhe Row_format=Compact;

Query OK, 0 rows affected (0.34 sec)

Records: 0  Duplicates: 0  Warnings: 0

注意: mysql5.6建立的表預設為 Row_format=Compact,而mysql5.7.18中預設是dynamic格式

透過引數innodb_default_row_format控制!!!

3.注意區別於oracle的offline表空間,mysql 中執行discard 之後,對應的表的.ibd檔案就沒有了

alter table liuwenhe.liuwenhe discard tablespace ;

4.然後copy備份的目錄中的該表的.ibd檔案到相應的目錄下:

5.然後載入到表空間:

alter table liuwenhe.liuwenhe import tablespace ;

至此恢復工作完成!!!

總結:我們可以透過innobackupex來實現部分表的備份和增量備份和恢復,innodb的表是不可以直接copy表檔案的方式來恢復的;也可以透過使用mysqlfrm工具來讀取innobackupex備份中的某個表的表結構,用於先建立上表結構,然後再discad tablespace,copy表的.ibd檔案,最後import來實現從全例項備份中來恢復個別的表!注意恢復個別表的前提是:開啟了引數innodb_file_per_table,

mysqlfrm工具可以讀取表結構,可以使用yum安裝:yum install mysql-utilities -y


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

相關文章