說明:mysql(5.6.6及以上),innodb_file_per_table開啟。
1.1. 操作步驟:
0. 目標伺服器建立相同表結構
1. 目的伺服器: alter table t discard tablespace;
2. 源伺服器 : flush tables t for export;
3. 從源伺服器上 拷貝t.ibd, t.cfg檔案到目的伺服器
4. 源伺服器: unlock tables;
5. 目的伺服器: alter table t import tablespace;
1.2. 演示
將多例項的 [mysql5711] 中 burn_test 庫下的test_purge表 ,傳輸到 [mysql57112]中 burn_test2 庫下的test_purge表
1.2.1. 準備工作
1. 在 目標伺服器 上建立表空間
-- 源伺服器 [mysql5711]
mysql> select * from burn_test.test_purge;
+----+------+
| a | b |
+----+------+
| 1 | 10 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
| 6 | 60 |
| 7 | 70 |
| 8 | 80 |
| 10 | 100 |
+----+------+
8 rows in set (0.01 sec)
-- 目標伺服器 [mysql57112]
---- test_purge在 目標伺服器 上不存在,先建立該錶
mysql> create table `test_purge` (
`a` int(11) not null auto_increment,
`b` int(11) default null,
primary key (`a`),
unique key `b` (`b`)
) engine=innodb auto_increment=11 default charset=utf8mb4;
query ok, 0 rows affected (0.16 sec)
2. 建立完成後進行檢查
## 目標伺服器
#[root@myserver burn_test_2]> ll | grep test_purge
-rw-r-----. 1 mysql mysql 8578 mar 21 10:31 test_purge.frm # 表結構
-rw-r-----. 1 mysql mysql 57344 mar 21 10:31 test_purge.ibd # 表空間,需要通過 discard 將表空間檔案刪除
alter table test_purge discard tablespace; 的含義是 保留test_purge.frm 檔案, 刪除test_purge.ibd
3. 通闢 discard 刪除ibd檔案
-- 目標伺服器
mysql> alter table test_purge discard tablespace;
query ok, 0 rows affected (0.04 sec)
mysql> show tables;
+-----------------------+
| tables_in_burn_test_2 |
+-----------------------+
| test_backup1 |
| test_purge |
+-----------------------+
2 rows in set (0.00 sec)
mysql> select * from test_purge;
error 1814 (hy000): tablespace has been discarded for table 'test_purge'
[root@myserver burn_test_2]> ll | grep test_purge
-rw-r-----. 1 mysql mysql 8578 mar 21 10:31 test_purge.frm
1.2.2. 匯出表空間
1. 在源伺服器上,通闢 export 命令匯出表空間(同時加讀鎖)
-- 源伺服器
mysql> flush table test_purge for export; -- 其實是對這個表加乙個讀鎖
query ok, 0 rows affected (0.00 sec)
2. 將匯出的 cfg檔案 和 ibd檔案 , 拷貝到目標伺服器 的資料庫下
## 源伺服器
#[root@myserver burn_test]> ll | grep test_purge
-rw-r-----. 1 mysql mysql 462 mar 21 10:58 test_purge.cfg # export後,多出來的檔案,裡面儲存了一些元資料資訊
-rw-r-----. 1 mysql mysql 8578 mar 4 15:41 test_purge.frm
-rw-r-----. 1 mysql mysql 57344 mar 5 15:28 test_purge.ibd
[root@myserver burn_test]> cp test_purge.cfg test_purge.ibd /data/mysql_data/5.7.11_2/burn_test_2/ # 拷貝表空間和cfg檔案,遠端請使用scp(本地多例項演示,這裡的庫名是不同的)
3. 匯出表空間後,盡快解鎖
-- 源伺服器
mysql> unlock tables; -- 盡快的解鎖
query ok, 0 rows affected (0.00 sec)
注意:一定要先拷貝cfg和ibd檔案,然後才能unlock,因為 unlock 的時候, cfg檔案會被刪除
# 源伺服器上的日誌
[note] innodb: stopping purge # 其實stop purge,找個測試的表 for export 即可
[note] innodb: writing table metadata to './burn_test/test_purge.cfg'
[note] innodb: table `burn_test`.`test_purge` flushed to disk
[note] innodb: deleting the meta-data file './burn_test/test_purge.cfg' # unlock table後,該檔案自動被刪除
[note] innodb: resuming purge # unlock後,恢復purge執行緒
4. 在目標伺服器上 修改 cfg檔案和ibd檔案的 許可權
## 目標伺服器
#[root@myserver burn_test_2]> chown mysql.mysql test_purge.cfg test_purge.ibd
5. 在目標伺服器上通闢 import 命令匯入表空間
-- 目標伺服器
--mysql> alter table test_purge import tablespace; -- 匯入表空間
query ok, 0 rows affected (0.24 sec)
mysql> select * from test_purge; -- 可以讀取到從源伺服器拷貝過來的資料
+----+------+
| a | b |
+----+------+
| 1 | 10 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
| 6 | 60 |
| 7 | 70 |
| 8 | 80 |
| 10 | 100 |
+----+------+
8 rows in set (0.00 sec)
# error.log中出現的資訊
innodb: importing tablespace for table 'burn_test/test_purge' that was exported from host 'myserver'
注意:表的名稱必須相同 ,經過上述測試,庫名可以不同
該方法也可以用於分割槽表的備份和恢復
mysql之 表空間傳輸
說明 mysql 5.6.6及以上 innodb file per table開啟。1.1.操作步驟 0.目標伺服器建立相同表結構 1.目的伺服器 alter table t discard tablespace 2.源伺服器 flush tables t for export 3.從源伺服器上 拷...
oracle表空間傳輸
表空間傳輸 write by hanchaoyong in date 2006 01 13 方法介紹 實現表空間的傳輸的條件 作業系統和資料庫版本最好一致 表空間傳輸的速度就是複製檔案的速度.表空間類的資料物件不可以跨越表空間.環境說明 源頭 機器a 表空間 test db 目標 機器b 表空間 t...
傳輸表空間只傳輸新的表
建立表空間 create tablespace abctest1 datafile oradata orcl datafile test 1.dbf size 10m create tablespace abctest2 datafile oradata orcl datafile test 2.d...