說明: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'
注意:表的名稱必須相同 ,經過上述測試,庫名可以不同
該方法也可以用於分割槽表的備份和恢復
建立本地表和全域性表
臨時表有兩種型別 本地表和全域性表。它們在名稱 可見性以及可用性上有區別。本地臨時表的名稱以單個數字符號 打頭 它們僅對當前的使用者連線可見的 當使用者從 sql server 例項斷開連線時被刪除。全域性臨時表的名稱以兩個數字符號 打頭,建立後對任何使用者都是可見的,當所有引用該錶的使用者與伺服器...
mysql無法本地連線 MySQL無法本地連線
今天在gpu上安裝mysql,折騰了大半天,伺服器用的是arch系統,之前沒接觸過,遇到了不少問題,我現在從安裝開始講 在arch上安裝mysql mariadb 現在是 arch linux 官方預設的 mysql 實現。oracle mysql 已被移動到 aur,推薦所有使用者公升級 brok...
mysql 表空間收縮 mysql壓縮表空間
repair table table name 修復表 optimize table table name 優化表 optimize local no write to binlog table tbl name tbl name 如果您已經刪除了表的一大部分,或者如果您已經對含有可變長度行的表 含...