MySQL備份恢復:從Xtrabackup完整備份中恢復單個表

如今大多數同窗在線上採起的備份策略都是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;
相關文章
相關標籤/搜索