説明: MySQL (5.6.6 以降)、innodb_file_per_table がオンになっています。
1.1. 操作手順:
0. ターゲット サーバーは同じテーブル構造を作成します
1. ターゲット サーバー: ALTER TABLE t DISCARD TABLESPACE;
2. ソース サーバー: FLUSHエクスポート用のテーブル;
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 行 (0.01 秒)
-- ターゲット サーバー [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;
クエリ OK、影響を受ける行は 0 行 (0.16 秒)
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 を削除することを意味します。ibd ファイルを削除するには、discard を使用します
--ターゲット サーバー
mysql> alter table test_purge destroy tablespace;
クエリ OK、影響を受ける行は 0 (0.04 秒)
mysql> show tables;
-------------- ----- ----
| Tables_in_burn_test_2 |
-----------------------
| test_backup1 |
| test_purge |
----------------------- セット内の
2 行 (0.00 秒)
mysql> select * from test_purge;
エラー 1814 (HY000): テーブル 'test_purge' のテーブルスペースが破棄されました
[root@MyServer burn_test_2]> ll | grep test_purge
-rw-r-----. 1 mysql mysql 8578 3 月 21 日 10:31 test_purge.frm
1.2.2. テーブル スペースのエクスポート
1. ソース サーバーで、export コマンドを使用してテーブル スペースをエクスポートします (同時に読み取りロックを追加します)。
--ソース サーバー
mysql> エクスポート用のテーブル test_purge をフラッシュします; -- 実際にこのテーブルに読み取りロックを追加します
クエリ OK、影響を受ける行は 0 です (0.00 秒)
2. cfg ファイルと ibd ファイルをエクスポートし、ターゲット サーバー
## ソース サーバー
[root@MyServer burn_test]> ll | grep test_purge
のデータベースにコピーします。 -rw-r-----. 1 mysql mysql 462 Mar 21 10:58 test_purge.cfg # エクスポート後の追加ファイルにはメタデータ情報が含まれています
-rw-r-----. 1 mysql mysql 8578 3 月 4 日 15:41 test_purge.frm
-rw-r-----. 1 mysql mysql 57344 3 月 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> テーブルのロックを解除; -- できるだけ早くロックを解除してください
クエリ OK、影響を受ける行は 0 行 (0.00 秒)
注: 必ず最初に cfg ファイルと ibd ファイルをコピーしてからロックを解除してください。ロックを解除すると cfg ファイルが削除されるためです
# ソース サーバー上のログ
[注] InnoDB: パージの停止 #実際には、パージを停止するには、エクスポート用のテスト テーブルを見つけるだけです。
[Note] InnoDB: テーブル メタデータを './burn_test/test_purge.cfg' に書き込みます。
[Note] InnoDB: テーブル `burn_test`.`test_purge` がフラッシュされます。ディスク
[メモ] InnoDB: メタデータ ファイル ' ./burn_test/test_purge.cfg' を削除します # テーブルのロックを解除すると、ファイルは自動的に削除されます
[メモ] InnoDB: パージを再開します # ロックを解除した後、復元しますパージ スレッド
4. ターゲット サーバー上の cfg ファイルと ibd ファイルを変更する 権限
## ターゲット サーバー
#[root@MyServer burn_test_2]> chown mysql.mysql test_purge .cfg test_purge.ibd
5. ターゲット サーバーでインポート コマンドを実行します Import tablespace
-- Target server
--
mysql> alter table test_purge import tablespace; -- Import tablespace
クエリ OK、影響を受ける行は 0 (0.24 秒)
mysql> select * from test_purge; -- ソース サーバーからコピーされたデータを読み取ることができます
---- ------
| a | b |
---- ----- -
| 1 | 10 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
| 6 | 60 |
| 7 | 70 |
| 8 | 80 |
| 10 | 100 |
---- ------ セット内の
8 行(0.00 秒)
# error.log 表示されるメッセージ
InnoDB: ホスト 'MyServer' からエクスポートされたテーブル 'burn_test/test_purge' のテーブルスペースをインポートしています
注:
テーブルの名前は同じである必要があります。上記のテストの後、ライブラリ名は異なっていてもかまいません
この方法はパーティション テーブルのバックアップとリカバリにも使用できます
以上がmysqlでのテーブルスペース転送の分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。