1. 程式人生 > >innodb表 手工導入導出

innodb表 手工導入導出

過程 lte 文件 mysq 加鎖 和數 直接 有一個 cfg

上一篇文章介紹了“innobackupex 熱備指定庫表操作”,分析其整個過程,就是將表的字典和數據文件導出在導入的原理,那麽針對單表的備份與恢復(新實例或者新庫中恢復),我們可以直接采用物理導出innodb表的辦法。
具體操作如下:
1.將備份表加鎖,導出cfg。

mysql> select * from t1;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 3 |
| 4 |
+------+
7 rows in set (0.00 sec)

mysql> flush table t1 with read lock;

Query OK, 0 rows affected (0.01 sec)

發現t1生成了cfg文件。

[root@222 test]# ls
db.opt t1.cfg t1.frm t1.ibd t2.frm t2.ibd

執行unlock tables ,cfg文件回收。

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

[root@222 test]# ls ../test/
db.opt t1.frm t1.ibd t2.frm t2.ibd

2.在unlock tables前,將t1的cfg和ibd文件備份。

[root@222 test]# cp t1.ibd t1.cfg /home/backup/

3.創建一個新庫,並創建相同結構的t1表。
mysql> create database test1;
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> use test1;
Database changed
mysql>
mysql> create table t1 like test.t1;
Query OK, 0 rows affected (0.03 sec)

4.刪除新建的t1表空間。

mysql> alter table t1 discard tablespace;

Query OK, 0 rows affected (0.02 sec)

發現新建的t1表空間的ibd文件被清除。

[root@222 test]# ls ../test1/
db.opt t1.frm

5.將備份的t1表的cfg和ibd文件拷貝到新建的庫下。
[root@222 test]# cd /home/backup/

[root@222 test1]# ll -trh
總用量 116K
-rw-rw----. 1 mysql mysql 61 12月 16 09:49 db.opt
-rw-rw----. 1 mysql mysql 8.4K 12月 16 09:49 t1.frm
-rw-r-----. 1 root root 96K 12月 16 09:51 t1.ibd
-rw-r-----. 1 root root 354 12月 16 09:51 t1.cfg
[root@222 test1]# chown -R mysql.mysql *
[root@222 test1]#
[root@222 test1]#
[root@222 test1]# ll -trh
總用量 116K
-rw-rw----. 1 mysql mysql 61 12月 16 09:49 db.opt
-rw-rw----. 1 mysql mysql 8.4K 12月 16 09:49 t1.frm
-rw-r-----. 1 mysql mysql 96K 12月 16 09:51 t1.ibd
-rw-r-----. 1 mysql mysql 354 12月 16 09:51 t1.cfg

6.執行新建t1表導入表空間操作。
mysql> alter table t1 import tablespace;
Query OK, 0 rows affected (0.08 sec)

7.查詢結果和第1步備份的表一致,操作完成

mysql> select * from test1.t1;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 3 |
| 4 |
+------+
7 rows in set (0.00 sec)

btw.
a.由於新表存在cfg文件,在刪除庫操作的時候會報錯,
ERROR 1010 (HY000): Error dropping database (can‘t rmdir ‘./test1/‘, errno: 17)
如果使用innobackupex備份,並導入的exp文件,則會發現刪除庫後,exp文件無法刪除,那麽手工將exp文件刪除,在刪除庫即可。
如果使用如上方法手工命令方式導入cfg文件,在刪除庫時報錯,但是查看庫文件時發現無文件,則在執行一遍即可;對於新導入的cfg文件,可以在次執行如下命令,則cfg文件消失。
mysql> flush table t1 for export;
Query OK, 0 rows affected (0.00 sec)

[root@222 test1]# ll -trh
總用量 116K
-rw-rw----. 1 mysql mysql 61 12月 16 09:49 db.opt
-rw-rw----. 1 mysql mysql 8.4K 12月 16 09:56 t1.frm
-rw-r-----. 1 mysql mysql 96K 12月 16 09:56 t1.ibd
-rw-r-----. 1 mysql mysql 355 12月 16 09:57 t1.cfg

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

[root@222 test1]# ll -trh
總用量 112K
-rw-rw----. 1 mysql mysql 61 12月 16 09:49 db.opt
-rw-rw----. 1 mysql mysql 8.4K 12月 16 09:56 t1.frm
-rw-r-----. 1 mysql mysql 96K 12月 16 09:56 t1.ibd

b.發現手工命令行方式備份恢復更加便捷,但是會有一個鎖表的過程,那麽則根據不同情況選擇不同方式進行備份,對於線上有寫入的表采用innobackupex方式,不會導致復制延遲;對於無寫入的表,直接采用加鎖導入cfg文件方式,操作更加便捷。

OK,done。

innodb表 手工導入導出