從完整備份恢復單個innodb表


現在大多數同學在線上采取的備份策略都是xtrabackup全備+binlog備份,那么當某天某張表意外的刪除那么如何從xtrabackup全備中恢復呢?從mysql 5.6版本開始,支持可移動表空間(Transportable Tablespace)那么利用這個功能就可以實現單表的恢復,同樣利用這個功能還可以把innodb表移動到另外一台服務器上。可以參考:https://yq.aliyun.com/articles/59271

下面進行從xtrabackup全備恢復單表的測試。

1. 開啟了參數innodb_file_per_table

2. 安裝工具:mysql-utilities,其中mysqlfrm可以讀取表結構。

yum install mysql-utilities -y

查看原表中的數據:

mysql> select * from yayun.t1;
+------+------+
| id   | name |
+------+------+
|    1 | aa   |
|    2 | bb   |
|    3 | cc   |
|    4 | dd   |
+------+------+
4 rows in set (0.00 sec)

mysql> 

執行備份:

innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --sock=/data/mysql/3306/mysqltmp/mysql.sock /data/

apply-log

innobackupex --defaults-file=/data/mysql/3306/my.cnf --apply-log /data/2017-03-22_16-13-00/

刪除t1表:

mysql> use yayun
Database changed
mysql> drop table t1;
Query OK, 0 rows affected (0.13 sec)

mysql> 

讀取表結構

mysqlfrm --diagnostic /data/2017-03-22_16-13-00/yayun/t1.frm 

輸出:

# Reading .frm file for /data/2017-03-22_16-13-00/yayun/t1.frm:
# The .frm file is a TABLE.
# CREATE TABLE Statement:

CREATE TABLE `yayun`.`t1` (
  `id` int(11) DEFAULT NULL, 
  `name` char(180) DEFAULT NULL 
) ENGINE=InnoDB;

#...done.

建表:

mysql> use yayun
Database changed
mysql> CREATE TABLE `yayun`.`t1` (
    ->   `id` int(11) DEFAULT NULL, 
    ->   `name` char(180) DEFAULT NULL 
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.08 sec)

mysql> 

加一個寫鎖,確保安全

mysql> lock tables t1 write;       
Query OK, 0 rows affected (0.00 sec)

mysql> 

丟棄表空間:

mysql> alter table t1 discard tablespace;       
Query OK, 0 rows affected (0.07 sec)

mysql> 

從備份中拷貝ibd文件,並且修改權限

[root@db_server_yayun_01 ~]# cp /data/2017-03-22_16-13-00/yayun/t1.ibd /data/mysql/3306/data/yayun/
[root@db_server_yayun_01 ~]# chown -R mysql.mysql /data/mysql/3306/data/yayun/t1.ibd 

載入表空間:

mysql> alter table t1 import tablespace;       
Query OK, 0 rows affected, 1 warning (0.15 sec)

mysql> show warnings;
+---------+------+------------------------------------------------------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                                                                  |
+---------+------+------------------------------------------------------------------------------------------------------------------------------------------+
| Warning | 1810 | InnoDB: IO Read error: (2, No such file or directory) Error opening './yayun/t1.cfg', will attempt to import without schema verification |
+---------+------+------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> 

這里有警告,可以忽略。詳情可以看:https://yq.aliyun.com/articles/59271
查詢數據是否一致:

mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
|    1 | aa   |
|    2 | bb   |
|    3 | cc   |
|    4 | dd   |
+------+------+
4 rows in set (0.00 sec)

mysql> 

最后解鎖:

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

mysql> 

 

參考文章:

https://www.percona.com/blog/2017/03/15/restore-single-innodb-table-full-backup-accidentally-dropping/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM