如今大多數同窗在線上採起的備份策略都是xtrabackup全備+binlog備份,那麼當某天某張表意外的刪除,那麼如何快速從xtrabackup全備中恢復呢?從MySQL 5.6版本開始,支持可傳輸表空間(Transportable Tablespace),那麼利用這個功能就能夠實現單表的恢復,一樣利用這個功能還能夠把innodb表移動到另一臺服務器上。能夠參考:https://yq.aliyun.com/articles/59271mysql
下面進行從xtrabackup全備恢復單表的測試。sql
1.開啓了參數innodb_file_per_tablecentos
2.安裝工具:mysql-utilities,其中mysqlfrm能夠讀取表結構。安全
$ yum install mysql-utilities -y
查看原表中的數據:服務器
mysql> select count(*) from sbtest.sbtest1; +----------+ | count(*) | +----------+ | 10000 | +----------+ 1 row in set (0.00 sec)
執行備份:app
$ innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 /data/
apply-log工具
$ innobackupex --defaults-file=/etc/my.cnf --apply-log /data/2018-03-21_08-09-43
刪除sbtest1表測試
mysql> drop table sbtest.sbtest1;
利用mysql-utilities工具讀取表結構(不支持MariaDB哦)spa
$ mysqlfrm --diagnostic /data/2018-03-21_08-09-43/sbtest/sbtest1.frm
獲得表結構code
CREATE TABLE `sbtest1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `k` int(11) NOT NULL DEFAULT '0', `c` char(120) NOT NULL DEFAULT '', `pad` char(60) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `k_1` (`k`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
加一個寫鎖,確保安全
mysql> lock tables sbtest1 write;
丟棄表空間
mysql> alter table sbtest1 discard tablespace; Query OK, 0 rows affected (0.00 sec)
從備份中拷貝ibd文件,而且修改權限
$ cp /data/2018-03-21_08-09-43/sbtest/sbtest1.ibd /var/lib/mysql/sbtest/ $ chown -R mysql.mysql /var/lib/mysql/sbtest/sbtest1.ibd
這裏有警告,能夠忽略。詳情能夠看:https://yq.aliyun.com/articles/59271
查詢數據是否一致:
mysql> alter table sbtest1 import tablespace; Query OK, 0 rows affected, 1 warning (0.08 sec) mysql> select count(*) from sbtest1; +----------+ | count(*) | +----------+ | 10000 | +----------+ 1 row in set (0.00 sec)
最後解鎖:
mysql> unlock tables;