Innobackupex 單表備份

Innobackupex 單表備份

一、使用Xtrabackup對數據庫進行部分備份
Xtrabackup也可以實現部分備份,即只備份某個或某些指定的數據庫或某數據庫中的某個或某些表。但要使用此功能,必須啓用innodb_file_per_table選項,即每張表保存爲一個獨立的文件。同時,其也不支持--stream選項,即不支持將數據通過管道傳輸給其它程序進行處理。
此外,還原部分備份跟還原全部數據的備份也有所不同,即你不能通過簡單地將prepared的部分備份使用--copy-back選項直接複製回數據目錄,而是要通過導入表的方向來實現還原。當然,有些情況下,部分備份也可以直接通過--copy-back進行還原,但這種方式還原而來的數據多數會產生數據不一致的問題,因此,無論如何不推薦使用這種方式。


(1)創建部分備份

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

(a)使用--include
使用--include時,要求爲其指定要備份的表的完整名稱,即形如databasename.tablename,如:
# innobackupex --include='^kk[.]k_4' /data/backup/kk-include

Note: 會匹配所有的庫


(b)使用--tables-file
此選項的參數需要是一個文件名,此文件中每行包含一個要備份的表的完整名稱;如:
# echo -e 'kk.k_4\nmageedu.tb2' > /tmp/tables.txt
# innobackupex --tables-file=/tmp/tables.txt /data/backup/kk-file

(c)使用--databases
此選項接受的參數爲數據名,如果要指定多個數據庫,彼此間需要以空格隔開;同時,在指定某數據庫時,也可以只指定其中的某張表。此外,此選項也可以接受一個文件爲參數,文件中每一行爲一個要備份的對象。如:
# innobackupex --databases='mageedu.tb1 testdb" /data/backup/kk-database



(2)整理(preparing)部分備份
prepare部分備份的過程類似於導出表的過程,要使用--export選項進行:
# innobackupex --apply-log --export /data/backup/kk-database

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

(3)還原部分備份
還原部分備份的過程跟導入表的過程相同(即下面第二部分的導入或導出單張表)。當然,也可以通過直接複製prepared狀態的備份至數據目錄中實現還原,不過此時要求數據目錄處於一致狀態。


i.e.

1) innobackupex --no-timestamp --databases="fei" /data/backup/fei/
2) innobackupex --apply-log --use-memory=4G --export /data/backup/fei/
3) rm -rf /var/lib/mysql/fei

cp -rf /data/backup/fei/fei /var/lib/mysql/
chown -R mysql.mysql /var/lib/mysql/
/etc/init.d/mysql start

二、導入或導出單張表

默認情況下,InnoDB表不能通過直接複製表文件的方式在mysql服務器之間進行移植,即便使用了innodb_file_per_table選項。而使用Xtrabackup工具可以實現此種功能,不過,此時需要“導出”表的mysql服務器啓用了innodb_file_per_table選項(嚴格來說,是要“導出”的表在其創建之前,mysql服務器就啓用了innodb_file_per_table選項),並且“導入”表的服務器同時啓用了innodb_file_per_table和innodb_expand_import選項。innodb_expand_import選項,Mysql 5.5已經更名爲innodb_import_table_from_xtrabackup。


(1)“導出”表
導出表是在備份的prepare階段進行的,因此,一旦完全備份完成,就可以在preparef過程中通過--export選項將某表導出了:
# innobackupex --apply-log --use-memory=4G --export /data/backup/kk-database/

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

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

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


然後將此表的表空間刪除:
mysql> ALTER TABLE kk.hh DISCARD TABLESPACE;

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

mysql> ALTER TABLE kk.hh IMPORT TABLESPACE;


i.e.

前提準備

vim /etc/mysql/my.cnf

innodb_file_per_table = 1
innodb_import_table_from_xtrabackup = 1 or innodb_expand_import = 1

/etc/init.d/mysql restart 重啓mysql

1) 備份

mysql> use kk;

mysql> create table hh engine=Innodb as select * from information_schema.tables;

innobackupex --no-timestamp --databases="kk.hh" /data/backup/kk-database/

mysqldump -uroot -p -d kk > createtab.sql 導出表結構供導入表的時候使用

2) 準備

innobackupex --apply-log --use-memory=4G --export /data/backup/kk-database/

3) 恢復

mysql> CREATE TABLE `hh` (
`TABLE_CATALOG` varchar(512) CHARACTER SET utf8 NOT NULL DEFAULT '',
`TABLE_SCHEMA` varchar(64) CHARACTER SET utf8 NOT NULL DEFAULT '',
`TABLE_NAME` varchar(64) CHARACTER SET utf8 NOT NULL DEFAULT '',
`TABLE_TYPE` varchar(64) CHARACTER SET utf8 NOT NULL DEFAULT '',
`ENGINE` varchar(64) CHARACTER SET utf8 DEFAULT NULL,
`VERSION` bigint(21) unsigned DEFAULT NULL,
`ROW_FORMAT` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`TABLE_ROWS` bigint(21) unsigned DEFAULT NULL,
`AVG_ROW_LENGTH` bigint(21) unsigned DEFAULT NULL,
`DATA_LENGTH` bigint(21) unsigned DEFAULT NULL,
`MAX_DATA_LENGTH` bigint(21) unsigned DEFAULT NULL,
`INDEX_LENGTH` bigint(21) unsigned DEFAULT NULL,
`DATA_FREE` bigint(21) unsigned DEFAULT NULL,
`AUTO_INCREMENT` bigint(21) unsigned DEFAULT NULL,
`CREATE_TIME` datetime DEFAULT NULL,
`UPDATE_TIME` datetime DEFAULT NULL,
`CHECK_TIME` datetime DEFAULT NULL,
`TABLE_COLLATION` varchar(32) CHARACTER SET utf8 DEFAULT NULL,
`CHECKSUM` bigint(21) unsigned DEFAULT NULL,
`CREATE_OPTIONS` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`TABLE_COMMENT` varchar(2048) CHARACTER SET utf8 NOT NULL DEFAULT ''
) ENGINE=InnoDB ;

mysql> ALTER TABLE kk.hh DISCARD TABLESPACE;

cp kk-database/kk/hh.exp /var/lib/mysql/kk/ && cp kk-database/kk/hh.ibd /var/lib/mysql/kk/

chown -R /var/lib/mysql/kk

mysql> ALTER TABLE kk.hh IMPORT TABLESPACE;


Copy single DB:


To take a backup of a single database you just need to use --include. --databases has no effect for InnoDB files. For example, to backup only the "test" database you can do the following:

innobackupex --include="^test\." /tmp/

This kind of backups are called "partial backups" and the restore process is more complicated. First before taking the backup you need to have innodb_file_per_table enabled.

During the preparation stage you need to use --export --apply-log. That will create .exp files that will allow you to recover tables one by one. Then you will need to import tables one by one following this procedure:

http://www.percona.com/doc/percona-x...porting-tables

You cannot just move the backup to the datadir of mysql if you are backing up a single database, because the shared tablespace (ibdata) contains information from all the InnoDB tables. If you restore a partial backup without following the restore procedure of that link you can lose the access to the access to all other databases.


參考文檔:http://blog.chinaunix.net/uid-23491661-id-3166863.html

http://www.percona.com/doc/percona-xtrabackup/2.1/innobackupex/innobackupex_script.html

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