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服務器實例復制到另一個正在運行的實例。可以使用相同的過程在相同的實例上執行全表恢復,只是做了一些小小的調整。
在源實例上,如果不存在表,則創建一個表:
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從一個實例遷移到另一個實例上。
MySQL
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。