MySQL Transportable Tablespace(傳輸表空間) 使用詳解
將大的InnoDB表從一個例項,移動或者複製到另一個例項,有很多的方法,在5.6之前常用的是通過物理或者邏輯備份來實現。
在5.6.6+的版本中,用到了一種基於表空間遷移的快速方法,即類似Oracle TTS。
因為用到,故整理記錄至此。
實驗用到兩臺機器,單機單例項,MySQL 5.6.30。
並將通過vm1> mysql1> vm2> mysql2> 區分兩臺shell環境和mysql client環境。
〇 過程:
① 先在mysql1上建立測試資料:
② 再保證mysql2上有相同的庫表結構,此處為新建,並將mysql2上新建的test.tts表discard掉ibd檔案:
③ 對mysql1的test.tts表做FLUSH TABLES操作,此時會多了一個cfg檔案:
④ 開多一個終端,在vm1上將ibd和cfg檔案scp到vm2上:
⑤ 將mysql1的test.tts表做UNLOCK操作(此時可發現cfg檔案已被刪除):
⑥ 在vm2上將傳過來的ibd和cfg檔案修改許可權:
⑦ 將上述ibd檔案IMPORT到tts表中:
至此,已經將mysql1例項上的tts表中資料快速地遷移到mysql2例項上了。
〇 上述幾個步驟的解釋:
操作②中的discard tablespace會在表上加上MDL鎖,刪除change buffer所有相關的快取項,設定表後設資料資訊,標誌tablespace為刪除狀態,重新生成表的id,保證基於表id的操作後續均會失敗,再將idb檔案幹掉,在②中的兩次du可以看到.idb檔案已經被刪除了。這是一個十分危險的操作,慎重;此操作也會被記錄到binlog中,若在複製結構可能會有很大的影響,切記先臨時關閉binlog。
操作③中的flush table ... for export會給test.tts表加上共享鎖,並將purge coordinator thread(在並行複製中類似sql thread)停止,並且將髒頁強制同步到磁碟,建立並將test.tts表的後設資料寫入.cfg檔案;
FLUSH TABLES ... FOR EXPORT在error log中體現了這個過程:
[Note] InnoDB: Sync to disk of '"test"."tts"' started.
[Note] InnoDB: Stopping purge
[Note] InnoDB: Writing table metadata to './test/tts.cfg'
[Note] InnoDB: Table '"test"."tts"' flushed to disk
操作⑤執行unlock tables將③中的鎖解除,此時.cfg檔案被刪掉,purge coordinator thread也會重新啟動;(在做flush table ... for export時不能關閉session,避免鎖釋放造成.cfg檔案刪除)
UNLOCK TABLES在error log中記錄為:
[Note] InnoDB: Deleting the meta-data file './test/tts.cfg'
[Note] InnoDB: Resuming purge
操作⑦則是通過import tablespace操作,將從vm1上傳輸過來的.ibd檔案和匯入到tts表中,此時.cfg檔案也必須存在;
ALTER TABLE ... IMPORT TABLESPACE在error log中記錄為:
[Note] InnoDB: Importing tablespace for table 'test/tts' that was exported from host 'vm01'
[Note] InnoDB: Phase I - Update all pages
[Note] InnoDB: Sync to disk
[Note] InnoDB: Sync to disk - done!
[Note] InnoDB: Phase III - Flush changes to disk
[Note] InnoDB: Phase IV - Flush complete
[Note] InnoDB: "test"."tts" autoinc value set to 786406
過程為讀取cfg檔案:表定義,索引定義,索引RootPage,列定義等等。再讀取import檔案每一個page,檢查完整性,根據讀取到的cfg檔案,重新設定當前表的後設資料資訊。
總結一下整個過程就是:
create table $new_table ...
alter table $new_table discard tablespace;(刪除新表的tablespace檔案,保留frm檔案)
flush table $old_table for export;(關閉該表,並且生成cfg檔案)
拷貝ibd檔案,已經對應的cfg檔案。
unlock tables;
將ibd檔案和cfg檔案copy到新地址,修改好許可權
alter table $new_table import tablespace;
〇 限制:
兩個例項都必須開啟獨立表空間,innodb_file_per_table
遷移的兩個例項的innodb_page_size必須一致,並且mysql server版本建議一致
不支援在分割槽表上執行discard tablespace
不支援在有主外來鍵關係的表上執行discard tablespace,除非設定foregin_key_checks=0
〇 參考文件:
MySQL 5.6 Reference Manual - 14.5.5 Copying Tablespaces to Another Server (Transportable Tablespaces)
作者微信公眾號(持續更新)
![](https://i.iter01.com/images/6ec15f918875f5ed5b5e7cf502bb6dc663e0c2d0fdd26c63628e9a2a621e8240.png)
在5.6.6+的版本中,用到了一種基於表空間遷移的快速方法,即類似Oracle TTS。
因為用到,故整理記錄至此。
實驗用到兩臺機器,單機單例項,MySQL 5.6.30。
並將通過vm1> mysql1> vm2> mysql2> 區分兩臺shell環境和mysql client環境。
〇 過程:
① 先在mysql1上建立測試資料:
-
mysql> \R mysql1>
-
PROMPT set to 'mysql1> '
-
mysql1> USE test;
-
Database changed
-
mysql1> CREATE TABLE tts(id int PRIMARY KEY AUTO_INCREMENT, name char(128));
-
Query OK, 0 rows affected (0.01 sec)
-
-
mysql1> INSERT INTO tts(name) VALUES(REPEAT('a',128));
-
Query OK, 1 row affected (0.00 sec)
-
-
mysql1> INSERT INTO tts(name) SELECT name FROM tts;
-
Query OK, 1 row affected (0.00 sec)
-
Records: 1 Duplicates: 0 Warnings: 0
-
-
mysql1> INSERT INTO tts(name) SELECT name FROM tts;
-
Query OK, 2 rows affected (0.00 sec)
-
Records: 2 Duplicates: 0 Warnings: 0
-
-
………………………………
-
-
mysql1> INSERT INTO tts(name) SELECT name FROM tts;
-
Query OK, 131072 rows affected (0.79 sec)
-
Records: 131072 Duplicates: 0 Warnings: 0
-
-
mysql1> INSERT INTO tts(name) SELECT name FROM tts;
-
Query OK, 262144 rows affected (2.15 sec)
-
Records: 262144 Duplicates: 0 Warnings: 0
-
-
mysql1> \! du -sh /data/mysql/test/tts*
-
12K /data/mysql/test/tts.frm
- 92M /data/mysql/test/tts.ibd
② 再保證mysql2上有相同的庫表結構,此處為新建,並將mysql2上新建的test.tts表discard掉ibd檔案:
-
mysql> \R mysql2>
-
PROMPT set to 'mysql2> '
-
mysql2> USE test;
-
Database changed
-
mysql2> CREATE TABLE tts(id int PRIMARY KEY AUTO_INCREMENT, name char(128));
-
Query OK, 0 rows affected (0.01 sec)
-
-
mysql2> \! du -sh /data/mysql/test/tts*
-
12K /data/mysql/test/tts.frm
-
96K /data/mysql/test/tts.ibd
- 注意!該alter table ... discard tablespace操作會記錄binlog並影響複製結構,慎用,或set sql_log_bin=0;
-
mysql2> ALTER TABLE tts DISCARD TABLESPACE;
-
Query OK, 0 rows affected (0.01 sec)
-
-
mysql2> \! du -sh /data/mysql/test/tts*
- 12K /data/mysql/test/tts.frm
③ 對mysql1的test.tts表做FLUSH TABLES操作,此時會多了一個cfg檔案:
-
mysql1> FLUSH TABLE tts FOR EXPORT;
-
Query OK, 0 rows affected (0.05 sec)
-
-
mysql1> \! du -sh /data/mysql/test/tts*
-
4.0K /data/mysql/test/tts.cfg
-
12K /data/mysql/test/tts.frm
- 92M /data/mysql/test/tts.ibd
④ 開多一個終端,在vm1上將ibd和cfg檔案scp到vm2上:
-
vm1> scp /data/mysql/test/tts.{ibd,cfg} user@vm2:/data/mysql/test
-
user@vm2's password:
-
tts.ibd 100% 92MB 46.0MB/s 00:02
-
tts.cfg 100% 380 0.4KB/s 00:00
⑤ 將mysql1的test.tts表做UNLOCK操作(此時可發現cfg檔案已被刪除):
-
mysql1> UNLOCK TABLES;
-
Query OK, 0 rows affected (0.00 sec)
-
-
mysql1> \! du -sh /data/mysql/test/tts*
-
12K /data/mysql/test/tts.frm
- 92M /data/mysql/test/tts.ibd
⑥ 在vm2上將傳過來的ibd和cfg檔案修改許可權:
- vm2> chown mysql:mysql /data/mysql/test/tts.{ibd,cfg}
-
mysql2> ALTER TABLE tts IMPORT TABLESPACE;
-
Query OK, 0 rows affected (0.93 sec)
-
-
mysql2> SELECT count(*) FROM tts;
-
+----------+
-
| count(*) |
-
+----------+
-
| 524288 |
-
+----------+
- 1 row in set (0.94 sec)
至此,已經將mysql1例項上的tts表中資料快速地遷移到mysql2例項上了。
〇 上述幾個步驟的解釋:
操作②中的discard tablespace會在表上加上MDL鎖,刪除change buffer所有相關的快取項,設定表後設資料資訊,標誌tablespace為刪除狀態,重新生成表的id,保證基於表id的操作後續均會失敗,再將idb檔案幹掉,在②中的兩次du可以看到.idb檔案已經被刪除了。這是一個十分危險的操作,慎重;此操作也會被記錄到binlog中,若在複製結構可能會有很大的影響,切記先臨時關閉binlog。
操作③中的flush table ... for export會給test.tts表加上共享鎖,並將purge coordinator thread(在並行複製中類似sql thread)停止,並且將髒頁強制同步到磁碟,建立並將test.tts表的後設資料寫入.cfg檔案;
FLUSH TABLES ... FOR EXPORT在error log中體現了這個過程:
[Note] InnoDB: Sync to disk of '"test"."tts"' started.
[Note] InnoDB: Stopping purge
[Note] InnoDB: Writing table metadata to './test/tts.cfg'
[Note] InnoDB: Table '"test"."tts"' flushed to disk
操作⑤執行unlock tables將③中的鎖解除,此時.cfg檔案被刪掉,purge coordinator thread也會重新啟動;(在做flush table ... for export時不能關閉session,避免鎖釋放造成.cfg檔案刪除)
UNLOCK TABLES在error log中記錄為:
[Note] InnoDB: Deleting the meta-data file './test/tts.cfg'
[Note] InnoDB: Resuming purge
操作⑦則是通過import tablespace操作,將從vm1上傳輸過來的.ibd檔案和匯入到tts表中,此時.cfg檔案也必須存在;
ALTER TABLE ... IMPORT TABLESPACE在error log中記錄為:
[Note] InnoDB: Importing tablespace for table 'test/tts' that was exported from host 'vm01'
[Note] InnoDB: Phase I - Update all pages
[Note] InnoDB: Sync to disk
[Note] InnoDB: Sync to disk - done!
[Note] InnoDB: Phase III - Flush changes to disk
[Note] InnoDB: Phase IV - Flush complete
[Note] InnoDB: "test"."tts" autoinc value set to 786406
過程為讀取cfg檔案:表定義,索引定義,索引RootPage,列定義等等。再讀取import檔案每一個page,檢查完整性,根據讀取到的cfg檔案,重新設定當前表的後設資料資訊。
總結一下整個過程就是:
create table $new_table ...
alter table $new_table discard tablespace;(刪除新表的tablespace檔案,保留frm檔案)
flush table $old_table for export;(關閉該表,並且生成cfg檔案)
拷貝ibd檔案,已經對應的cfg檔案。
unlock tables;
將ibd檔案和cfg檔案copy到新地址,修改好許可權
alter table $new_table import tablespace;
〇 限制:
兩個例項都必須開啟獨立表空間,innodb_file_per_table
遷移的兩個例項的innodb_page_size必須一致,並且mysql server版本建議一致
不支援在分割槽表上執行discard tablespace
不支援在有主外來鍵關係的表上執行discard tablespace,除非設定foregin_key_checks=0
〇 參考文件:
MySQL 5.6 Reference Manual - 14.5.5 Copying Tablespaces to Another Server (Transportable Tablespaces)
作者微信公眾號(持續更新)
![](https://i.iter01.com/images/6ec15f918875f5ed5b5e7cf502bb6dc663e0c2d0fdd26c63628e9a2a621e8240.png)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-2134065/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 傳輸表空間MySql
- mysql之 表空間傳輸MySql
- MySQL傳輸表空間的簡單使用方法MySql
- Tablespace表空間刪除
- 【TABLESPACE】Oracle表空間最佳實踐Oracle
- 【TABLESPACE】Oracle 表空間結構說明Oracle
- Postgresql表空間詳解SQL
- 【XTTS】Oracle傳輸表空間xtts增量方式TTSOracle
- Oracle的表空間quota詳解Oracle
- oracle建立使用者,表空間,臨時表空間,分配許可權步驟詳解Oracle
- ORA-1653: unable to extend table by 1024 in tablespace(oracle表空間滿了的解決方案)Oracle
- 用傳輸表空間跨平臺遷移資料
- MySQL innodb表使用表空間物理檔案複製表MySql
- 11g-Reduce Transportable Tablespace Downtime using XTTS (Doc ID 1389592.1)TTS
- MySQL使用小技巧(information_schema表空間)MySqlORM
- MySQL InnoDB表空間加密MySql加密
- Oracle11g新增檢視查詢表空間使用率DBA_TABLESPACE_USAGE_METRICSOracle
- mysql收縮共享表空間MySql
- MySQL InnoDB Undo表空間配置MySql
- 【資料遷移】XTTS跨平臺傳輸表空間(1.傳統方式)TTS
- 當使用者無限制使用表空間配額且表空間有足夠空間時出現超出表空間的空間限額
- MySQL 中的共享表空間與獨立表空間如何選擇MySql
- 【XTTS】使用XTTS傳輸表空間將Oracle11.2.0.4資料遷移至Oracle19CTTSOracle
- 完全可傳輸的匯出/匯入(full transportable export/import)ExportImport
- 【資料遷移】XTTS跨平臺傳輸表空間v4TTS
- MySQL InnoDB臨時表空間配置MySql
- MySQL 遷移表空間,備份單表MySql
- mysql臨時表,臨時表空間,ibtmp1表空間暴增原因初探MySql
- 16、表空間 建立表空間
- undo表空間使用率過高解決
- mysql5.7 General tablespace使用說明MySql
- mysql關於表空間的總結MySql
- MySQL 增加InnoDB系統表空間大小MySql
- MySQL InnoDB File-Per-Table表空間MySql
- MySQL 系統表空間檔案解析MySql
- Oracle新建使用者、表空間、表Oracle
- 臨時表空間和回滾表空間使用率查詢
- 12c – 使用跨平臺增量備份來減少傳輸表空間的停機時間 (文件 ID 2102859.1)
- 12c – 使用跨平臺增量備份來減少傳輸表空間的停機時間 (Doc ID 2102859.1)