默認情況下,InnoDB表不能通過直接復制表文件的方式在mysql服務器之間進行移植,即便使用了innodb_file_per_table選項。而使用Xtrabackup工具可以實現此種功能,不過只能"導出"具有.ibd文件的表,也就是說導出表的mysql服務器啟用了innodb_file_per_table選項,而且要導出的表還是在啟用該選項之后才創建的。
導入表的是,要求導入表的服務器版本是MySQL 5.6+,且啟用了innodb_file_per_table選項。
(1). 導出表
導出表是在"準備"的過程中進行的,不是在備份的時候導出。對于一個已經備份好的備份集,使用"--apply-log"和"--export"選項即可導出備份集中的表。
假如以全備份集/bakdir/2017-04-02_17-41-38為例,要導出其中的表。
innobackupex --apply-log --export /bakdir/2017-04-02_17-41-38
在導出過程中,會看到如下信息:
1 2 |
|
它說明了創建了一個.exp文件。
查看備份集目錄下的backuptest目錄,會發現多出了2個文件:.cfg和.exp,再加上.ibd文件,這3個文件是后續導入表時所需的文件。
-rw-r--r-- 1 root root 349 Apr 2 18:15 num_innodb.cfg
-rw-r----- 1 root root 16K Apr 2 18:15 num_innodb.exp
-rw-r----- 1 root root 8.4K Apr 2 17:41 num_innodb.frm
-rw-r----- 1 root root 31M Apr 2 17:41 num_innodb.ibd
其中.cfg文件是一種特殊的innodb數據字典文件,它和exp文件的作用是差不多的,只不過后者還支持在xtradb中導入,嚴格地講,要將導出的表導入到MySQL5.6或者percona server 5.6中,".cfg"文件完全可以不需要,但是如果有該文件的話,會進行架構驗證。
(2). 導入表
要在mysql服務器上導入來自于其它服務器的某innodb表,需要先在當前服務器上創建一個跟原表表結構一致的表,而后才能實現將表導入:
mysql> CREATE TABLE tabletest (...) ENGINE=InnoDB;
然后將此表的表空間:
mysql> ALTER TABLE mydatabase.tabletest DISCARD TABLESPACE;
接下來,將來自于"導出"表的的.ibd和.exp文件復制到當前服務器的數據目錄,如果導入目標服務器是MySQL 5.6+,也可以復制.cfg文件。然后使用如下命令將其“導入”:
mysql> ALTER TABLE mydatabase.tabletest IMPORT TABLESPACE;
xtrabackup支持部分備份,意味著可以指定備份哪個數據庫或者哪個表。
部分備份只有一點需要注意:在恢復的時候不要通過"--copy-back"的方式拷貝回datadir,而是應該使用導入表的方式。盡管使用拷貝的方式有時候是可行的,但是很多情況下會出現數據庫不一致的狀態。
(1). 備份
創建部分備份有三種方式:
- ?通過"--include"選項可以指定正則來匹配要備份的表,這種方式要使用完整對象引用格式,即db_name.tab_name的方式。
- 將要備份的表分行枚舉到一個文件中,通過"--tables-file"指定該文件。
- 或者使用"--databases"指定要備份的數據庫或表,指定備份的表時要使用完整對象引用格式,多個元素使用空格分開。
使用前兩種部分備份方式,只能備份innodb表,不會備份任何myisam,即使指定了也不會備份。而且要備份的表必須有獨立的表空間文件,也就是說必須開啟了innodb_file_per_table,更精確的說,要備份的表是在開啟了innodb_file_per_table選項之后才創建的。第三種備份方式可以備份myisam表。
例如?--include='^back.*[.]num_*'?,將備份back字母開頭的數據庫中num開頭的表,其中"[.]"的中括號不能少,因為正則中"."有特殊意義,所以使用中括號來枚舉以實現對象的完整引用。
innobackupex --user=root --password=123456 --include='^back*[.]num_*' /bakdir/
使用"--include"和"--tables-file"備份后,會生成一個時間戳目錄,目錄中只有和要備份的表有關的文件。
[root@xuexi data]# ls /bakdir/2017-04-02_17-35-46/ backup-my.cnf ibdata1 xtrabackup_binlog_info xtrabackup_checkpoints xtrabackup_info xtrabackup_logfile
如果使用的是--databases選項,則會生成一個時間戳目錄,里面有備份的數據庫代表的目錄,如果只備份了某個表,則該數據庫目錄中只有該表相關的文件。
innobackupex --user=root --password=123456 --databases='mysql.user backuptest' /bakdir/
上面只備份mysql.user表和backuptest數據庫,在生成的時間戳目錄中將有兩個mysql目錄和backuptest目錄。
[root@xuexi data]# ls /bakdir/2017-04-02_17-41-38/ backup-my.cnf backuptest ibdata1 mysql xtrabackup_binlog_info xtrabackup_checkpoints xtrabackup_info xtrabackup_logfile[root@xuexi data]# ls /bakdir/2017-04-02_17-41-38/backuptest/ db.opt num_innodb.frm num_innodb.ibd num_isam.frm num_isam.MYD num_isam.MYI[root@xuexi data]# ls /bakdir/2017-04-02_17-41-38/mysql/ user.frm user.MYD user.MYI
?