MySQL5.7表領域の移行-標準表


Mysql転送テーブルスペース--InnoDBテーブルを別のインスタンスにコピーします(一)
---1つのInnoDBテーブルを1つのインスタンスから別のインスタンスに移動またはコピーする作業でよく遭遇しますが、5.6以前は物理的または論理的バックアップによって実現される方法が多くありました.5.6.6+のバージョンでは、Oracle TTSのような表領域移行に基づく迅速な方法が使用されています.次のテストはMySQL 5で行います.7環境で標準テーブルを移行します.
  
実験環境:(いずれもmysql 5.7)
ソース:192.168.2.2.200 mysql 5.7.16 zhangdbの下のempテーブル
ターゲットライブラリ:192.168.2.1100 mysql 5.7.18 test下(zhangdbのempテーブルを、ターゲットライブラリのtest schema下にインポート)
--ソース・ライブラリ(192.168.2.2.200)にテスト・テーブルを作成します.
mysql> create database zhangdb;
mysql> use zhangdb
mysql> create table emp (id int,name varchar(9));
mysql> insert into emp values (1,'zhang');
mysql> insert into emp values (2,'zhang');
mysql> insert into emp values (3,'zhang');
mysql> insert into emp values (4,'zhang');
mysql> insert into emp values (5,'zhang');
mysql> select * from emp;
+------+-------+
| id   | name  |
+------+-------+
|    1 | zhang |
|    2 | zhang |
|    3 | zhang |
|    4 | zhang |
|    5 | zhang |
+------+-------+
5 rows in set (0.00 sec)

--:FLUSH TABLES…FOR EXPORTロックテーブルをソースライブラリ(192.168.2.2.200)上で実行して生成する.cfgメタデータファイル
mysql> flush tables emp for export;--(注意:このステップはテーブルをロックしているので、insert updateはできません)
Query OK, 0 rows affected (0.00 sec)
[root@localhost data]# cd zhangdb
[root@localhost zhangdb]# ls
db.opt  emp.cfg  emp.frm  emp.ibd
[root@localhost zhangdb]# ll
total 116
-rw-r----- 1 mysql mysql    67 May 25 15:36 db.opt
-rw-r----- 1 mysql mysql   430 May 25 15:40 emp.cfg---生成されたcfgファイル
-rw-r----- 1 mysql mysql  8586 May 25 15:37 emp.frm
-rw-r----- 1 mysql mysql 98304 May 25 15:37 emp.ibd
--宛先データベース(192.168.2.1100)にソース表構造を作成し、次のように既存の表領域を破棄します.
MySQL [(none)]> use test
Database changed
MySQL [test]> CREATE TABLE `emp` (
    ->   `id` int(11) DEFAULT NULL,
    ->   `name` varchar(9) DEFAULT NULL
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.41 sec)
MySQL [test]>alter table  emp DISCARD TABLESPACE; ---既存の表領域を破棄
注意:
※制約条件、文字セット等も一致しなければならないので、show create table t 1を使用することを推奨する.テーブルを作成するSQLを取得します.そうしないと、新しいサーバにテーブルスペースをインポートするときに1808エラーが表示されます.
--はい、そうです.ibdファイルと.cfgメタデータファイルソースインスタンスからターゲットインスタンスにコピー
[root@localhost zhangdb]# scp emp.ibd emp.cfg [email protected]:/mysql/data/test/---ターゲット・データベースに転送されるtest schemaディレクトリ
[root@localhost test]# chown mysql.mysql emp.cfg emp.ibd--ターゲット・データベースでの認可
--ソース・データベース(192.168.2.2.200)でempテーブルをロック解除
mysql> unlock table;
Query OK, 0 rows affected (0.01 sec)
--宛先データベース(192.168.2.1100)にemp表領域をインポートし、表が正しいかどうかを確認します.
MySQL [test]> alter table emp import tablespace;
Query OK, 0 rows affected (0.23 sec)
MySQL [test]> show tables;
+----------------+
| Tables_in_test |
+----------------+
| emp            |
+----------------+
1 row in set (0.06 sec)
MySQL [test]> select * from emp;
+------+-------+
| id   | name  |
+------+-------+
|    1 | zhang |
|    2 | zhang |
|    3 | zhang |
|    4 | zhang |
|    5 | zhang |
+------+-------+
5 rows in set (0.00 sec)

注意:
ALTER TABLE...IMPORT TABLESPACEプロパティは、インポートしたデータに外部キー制約を強制しません.テーブル間に外部キー制約がある場合は、すべてのテーブルを同じ(論理的)ポイントでエクスポートする必要があります.この場合、テーブルの更新を停止し、すべてのトランザクションをコミットし、テーブルに共有ロックを取得してエクスポート操作を実行します.