說明:實驗環境是mysql5.7.17
這個過程演示瞭如何從運行的MySQL服務器實例複製一個普通的InnoDB表到另一個正在運行的實例。在相同的實例中,可以使用較小的調整來執行完整的表恢復。
在源實例上創建一個表
Mysql> use test
Database changed
Mysql> CREATE TABLE t(c1 INT) ENGINE=InnoDB;
Query OK, 0 rows affected (0.02 sec)
在目標實例創建一個相同表結構的表
Mysql> use test
Database changed
Mysql> CREATE TABLE t(c1 INT) ENGINE=InnoDB;
Query OK, 0 rows affected (0.01 sec)
在目標實例上,丟棄現有的表空間
(在可以導入表空間之前,InnoDB必須丟棄附着在接收表上的表空間。)
Mysql> ALTER TABLE t DISCARD TABLESPACE;
Query OK, 0 rows affected (0.01 sec)
[[email protected] test]# ll
-rw-rw---- 1 mysql mysql 433 Apr 9 00:30 t.frm
在源實例上運行FLUSH TABLES … FOR EXPORT 鎖定表並生成.cfg元數據文件
Mysql> use test
Database changed
Mysql> FLUSH TABLES t FOR EXPORT;
Query OK, 0 rows affected (0.03 sec)
[[email protected] test]# ll
-rw-rw---- 1 mysql mysql 358 Apr 8 21:24 t.cfg
-rw-rw---- 1 mysql mysql 433 Apr 8 21:15 t.frm
-rw-rw---- 1 mysql mysql 98304 Apr 8 21:15 t.ibd
元數據(.cfg)是在InnoDB數據目錄中創建的。
將.ibd文件和.cfg元數據文件從源實例複製到目標實例
[[email protected] test]# scp /data/mysql/data/test/t.{ibd,cfg} 192.168.1.69:/data/mysql/test
[[email protected] test]# chown mysql.mysql t.ibd t.cfg
在釋放共享鎖之前,必須先複製.ibd文件和.cfg文件
在源實例中解鎖
使用解鎖表來釋放FLUSH TABLES ... FOR EXPORT:所獲得的鎖
Mysql> use test;
Database changed
Mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)
在目的地實例中,導入表空間
Mysql> use test
Database changed
Mysql> ALTER TABLE t IMPORT TABLESPACE;
Query OK, 0 rows affected (0.06 sec)
ALTER TABLE … IMPORT TABLESPACE特性並不強制對導入的數據施加外鍵約束。如果表之間有外鍵約束,那麼所有表都應該在相同的(邏輯的)點上導出。在這種情況下,您將停止更新表,提交所有事務,在表上獲得共享鎖,然後執行導出操作。