MySQL 傳輸表空間
將file-per-table表空間複製到另一個例項
如何將一個file-per-table表空間從一個MySQL例項複製到另一個例項中,也就是眾所周知的可傳輸表空間特性。
有很多原因可以解釋為什麼你可以將一個InnoDB檔案表空間複製到不同的例項中:
.在不增加生產伺服器額外負載的情況下執行報表。
.在新的從伺服器上為表設定相同的資料
.在出現問題或錯誤後恢復表或分割槽的備份版本。
.作為一種比mysqldump命令匯入更快的移動資料的方法。資料立即可用,而不需要重新插入和重建索引
.將每個file-per-table表空間移動到具有更適合系統需求的儲存介質的伺服器。例如,您可能希望在SSD裝置上有繁忙的表,或者在高容量HDD裝置上有大型表。
限制和使用說明
.只有當innodb_file_per_table設定為ON(預設設定)時,才可以複製表空間。駐留在共享系統表空間中的表不能被靜默。
.當一個表被靜默時,只允許在受影響的表上執行只讀事務
.在匯入表空間時,頁面大小必須與匯入例項的頁面大小相匹配。
.當foreign_key_checks設定為1時,對於父-子(主-外來鍵)關係的表空間不支援DISCARD TABLESPACE。在丟棄父-子表的表空間之前,設定foreign_key_checks=0。分割槽InnoDB表不支援外來鍵。
.ALTER TABLE……IMPORT TABLESPACE不會對匯入的資料強制外來鍵約束。如果表之間存在外來鍵約束,那麼所有表都應該在同一(邏輯)時間點匯出。分割槽InnoDB表不支援外來鍵。
.ALTER TABLE……IMPORT TABLESPACE 和 ALTER TABLE…IMPORT PARTITION…TABLESPACE不需要.cfg後設資料檔案來匯入一個表空間。但是,如果匯入時沒有.cfg檔案,則不會執行後設資料檢查,並且會發出類似於下面的警告:
Message: InnoDB: IO Read error: (2, No such file or directory) Error opening '.\ test\t.cfg', will attempt to import without schema verification 1 row in set (0.00 sec)
在期待沒用模式不匹配的情況下,不使用.cfg檔案進行匯入可能會更方便。此外,在無法從.ibd檔案收集後設資料的崩潰恢復場景中,不需要.cfg檔案就可以匯入。
.由於.cfg後設資料檔案的限制,當為分割槽表匯入表空間檔案時,不會對分割槽型別或分割槽定義差異報告模式不匹配。列差異被報告。
.當在子分割槽表上執行ALTER TABLE ... DISCARD PARTITION ... TABLESPACE和ALTER TABLE ... IMPORT PARTITION ... TABLESPACE,分割槽和子分割槽表名都是允許的。當指定分割槽名時,該分割槽的子分割槽將包含在操作中。
.如果兩個例項都有GA(通用可用性)狀態,並且它們的版本在同一系列可以從另一個MySQL伺服器例項匯入表空間檔案。否則,該檔案必須是在匯入它的同一個伺服器例項上所建立
.在複製場景中,innodb_file_per_table必須在主節點和從節點上都設定為ON。
.在Windows環境下,InnoDB內部儲存資料庫、表空間和表名時使用小寫字母。為了避免在區分大小寫的作業系統(如Linux、UNIX)上的匯入問題,請在建立資料庫、表空間和表時使用小寫名稱。一種方便的方法是在建立資料庫、表空間或表之前,在my.cnf或my.ini檔案的[mysqld]部分中新增下面這一行:
[mysqld] lower_case_table_names=1
.alter table ... discard tablespace和alter table ... import tabelspace不支援屬於InnoDB通用表空間中的表。
.InnoDB表的預設行格式可以透過innodb_default_row_format配置選項進行配置。如果匯入的表沒有明確定義行格式(ROW_FORMAT),或者使用了ROW_FORMAT=DEFAULT,那麼如果源例項上的innodb_default_row_format設定與目標例項上的innodb_default_row_format設定不一致,可能會導致模式不匹配錯誤
.在使用InnoDB表空間加密特性匯出加密的表空間時,InnoDB除了生成一個.cfg後設資料檔案外,還會生成一個.cfp檔案。在目標例項上執行ALTER TABLE…IMPORT TABLESPACE之前,必須將.cfp檔案與.cfg檔案和表空間檔案一起復制到目標例項中。cfp檔案包含一個傳輸金鑰和一個加密的表空間金鑰。在匯入時,InnoDB使用傳輸金鑰來解密表空間金鑰。
傳輸表空間示例
例如1:複製一個InnoDB表到另一個例項
這個過程演示瞭如何將一個普通的InnoDB表從一個正在執行的MySQL伺服器例項複製到另一個正在執行的例項。可以使用相同的過程在相同的例項上執行全表恢復,只是做了一些小小的調整。
1. 在源例項上,如果不存在表,則建立一個表:
mysql> use test; Database changed mysql> create table t(c1 int) engine=innodb; Query OK, 0 rows affected (0.12 sec) mysql> insert into t values(1); Query OK, 1 row affected (0.16 sec)
2.在目標例項上,如果不存在表,則建立表:
mysql> use test; Database changed mysql> create table t(c1 int) engine=innodb; Query OK, 0 rows affected (0.09 sec)
3.在目標例項上,丟棄現有的表空間。(在匯入表空間之前,InnoDB必須丟棄連線到接收表空間的表空間。)
[mysql@localhost test]$ ls -lrt 總用量 112 -rw-r-----. 1 mysql mysql 67 3月 15 16:55 db.opt -rw-r-----. 1 mysql mysql 8556 3月 15 16:57 t.frm -rw-r-----. 1 mysql mysql 98304 3月 15 16:57 t.ibd mysql> alter table t discard tablespace; Query OK, 0 rows affected (0.17 sec) [mysql@localhost test]$ ls -lrt 總用量 16 -rw-r-----. 1 mysql mysql 67 3月 15 16:55 db.opt -rw-r-----. 1 mysql mysql 8556 3月 15 16:57 t.frm
4.在源例項上,執行FLUSH TABLES…FOR EXPORT將暫停表並建立.cfg後設資料檔案
mysql> flush tables t for export; Query OK, 0 rows affected (0.00 sec) [mysql@localhost test]$ ls -lrt 總用量 116 -rw-r-----. 1 mysql mysql 67 3月 15 16:53 db.opt -rw-r-----. 1 mysql mysql 8556 3月 15 16:54 t.frm -rw-r-----. 1 mysql mysql 98304 3月 15 16:54 t.ibd -rw-r-----. 1 mysql mysql 371 3月 15 17:00 t.cfg
在InnoDB資料目錄下建立後設資料(.cfg)
注意:FLUSH TABLES …… FOR EXPORT在MySQL 5.6.6版本中可用。該語句確保對指定表的更改已重新整理到磁碟,以便在例項執行時可以生成二進位制表副本。當FLUSH TABLES ... FOR EXPORT時,InnoDB會在表所在的資料庫目錄中生成一個.cfg檔案。cfg檔案中包含匯入表空間檔案時用於模式驗證的後設資料。
5.將.ibd檔案和.cfg後設資料檔案從源例項複製到目標例項
[mysql@localhost test]$ scp t.{ibd,cfg} mysql@192.168.1.243:/mysqldata/mysql/test/ mysql@192.168.1.243's password: t.ibd 100% 96KB 96.0KB/s 00:00 t.cfg 100% 371 0.4KB/s 00:00 [mysql@localhost test]$
在釋放共享鎖之前必須複製.ibd與.cfg檔案。
6.在源例項上,使用unlock tables語句來釋放由flush tables ... for export所獲取的鎖:
mysql> unlock tables; Query OK, 0 rows affected (0.00 sec) 7.在目標例項上,匯入表空間: mysql> alter table t import tablespace; Query OK, 0 rows affected (0.15 sec) mysql> desc t; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | c1 | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 1 row in set (0.00 sec) mysql> select * from t; +------+ | c1 | +------+ | 1 | +------+ 1 row in set (0.00 sec)
可以看到表t從一個例項遷移到另一個例項上。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2886315/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql之 表空間傳輸MySql
- MySQL傳輸表空間的簡單使用方法MySql
- 【XTTS】Oracle傳輸表空間xtts增量方式TTSOracle
- 用傳輸表空間跨平臺遷移資料
- MySQL InnoDB表空間加密MySql加密
- mysql收縮共享表空間MySql
- MySQL InnoDB Undo表空間配置MySql
- 【資料遷移】XTTS跨平臺傳輸表空間(1.傳統方式)TTS
- MySQL 中的共享表空間與獨立表空間如何選擇MySql
- 【資料遷移】XTTS跨平臺傳輸表空間v4TTS
- MySQL InnoDB臨時表空間配置MySql
- MySQL 遷移表空間,備份單表MySql
- mysql臨時表,臨時表空間,ibtmp1表空間暴增原因初探MySql
- 16、表空間 建立表空間
- mysql關於表空間的總結MySql
- MySQL 增加InnoDB系統表空間大小MySql
- MySQL InnoDB File-Per-Table表空間MySql
- MySQL 系統表空間檔案解析MySql
- MySQL innodb表使用表空間物理檔案複製表MySql
- MySQL 5.7新支援--通用表空間實戰MySql
- MySQL UNDO表空間獨立和截斷MySql
- 談談什麼是MySQL的表空間?MySql
- MySQL使用小技巧(information_schema表空間)MySqlORM
- MySQL空間最佳化(空間清理)MySql
- 【資料遷移】XTTS跨平臺傳輸表空間v3(3.DFT方式)TTS
- 【資料遷移】XTTS跨平臺傳輸表空間v3(2.RMAN增量)TTS
- 【XTTS】使用XTTS傳輸表空間將Oracle11.2.0.4資料遷移至Oracle19CTTSOracle
- MySQL 8.0表空間新特性簡單實驗MySql
- MYSQL造資料佔用臨時表空間MySql
- mysql共享表空間擴容,收縮,遷移MySql
- MySQL 減少InnoDB系統表空間的大小MySql
- Oracle表空間Oracle
- oracle 表空間Oracle
- PostgreSQL 表空間SQL
- PostgreSQL:表空間SQL
- MySQL共享表空間各個版本之間的演變圖MySql
- 當使用者無限制使用表空間配額且表空間有足夠空間時出現超出表空間的空間限額
- 表空間利用率及表空間的補充