PolarDB for MySQL が提供する Fast Import 機能を使用すると、データベースとテーブルの復元タスクを送信した後、復元タスクの完了を待つことなく、復元対象のデータサイズに関わらず約 5~10 分で、復元タスク内のデータベースとテーブルの全データをクエリできます。
シナリオの概要
高速インポート機能は 新しいデータベースおよびテーブルの復元プロセス と互換性があり、復元タスクと同時にクエリ操作を実行できます。
高速インポート機能は、次の 2 つのシナリオを高速化できます。
-
データまたはテーブルが誤って削除され、特定のポイントインタイムを特定できない場合、従来の復元タスクでは完了までに長時間かかることがあります。高速インポート機能を使用すると、復元タスクの完了を待たずにデータを迅速にクエリして検証できます。
-
テーブルが大きいにもかかわらず少量のデータが誤って削除された場合、高速インポート機能は
INSERT ... SELECT ...を使用して、リストアタスク内のテーブルから必要なデータを迅速に抽出し、データが誤って削除されたテーブルに挿入することで、運用効率を向上させます。
バージョン要件
適用可能なデータベースエンジンバージョンは MySQL 8.0.1 であり、マイナーバージョンは 8.0.1.1.49 以降である必要があります。バージョン番号のクエリ により、クラスターのバージョンを確認できます。
注意事項
この機能は現在、カナリアリリース段階です。この機能を使用するには、お問い合わせのうえ、ホワイトリストへの登録を申請してください。
-
非圧縮かつ非暗号化のテーブルでは、file-per-table 構成 (デフォルト構成) のみサポートされます。復元タスクの実行中にデータをクエリできます。
-
復元タスクのテーブル数が 1,000 未満の場合、システムはデフォルトで
Fast Import機能を有効にし、復元プロセス中に全データをクエリできます。説明復元タスクの数が 1,000 を超えると、システムは
Fast Import機能を有効にしません。 タスク管理フローは、お客様が送信したタスクに基づいてFast Import機能を有効にするかどうかを自動的に判断します。 -
クエリ操作は、読み取り/書き込み (RW) ノードおよび読み取り専用 (RO) ノードでのみサポートされます。列ストア読み取り専用 (RO) ノードが存在する場合は、HINT 構文 を使用して、クエリを読み取り/書き込み (RW) または行ストア読み取り専用 (RO) ノードに強制的にルーティングしてください。そうしないと、データが返されない場合があります。
-
buffer poolのリソースが十分な場合、復元状態のテーブルへのアクセスは、通常のテーブルへのアクセスと同等の効率を発揮します。しかし、クラスターが高負荷のシナリオでは、通常の業務への影響を軽減するため、復元状態のテーブルにアクセスする効率は制限されます。 -
復元タスクが完了する前は、復元対象のテーブルには読み取り専用モードでのみアクセスできます。
使用方法
データベースおよびテーブルの復元タスクの送信
データベースおよびテーブルの復元タスクを送信した後、ページ右上隅にある詳細リンクからタスクの詳細ページに移動できます。
データベースおよびテーブルの復元タスクは 6 つの手順で構成されます。
-
タスクの初期化
-
一時ノードでのフル復元
-
一時ノードでの増分復元 (必要に応じて)
-
データベースおよびテーブルの復元の前処理
-
データベースおよびテーブルの復元
-
タスクの完了とリソースの回収
タスク詳細ページでは、タスクのリアルタイムの進捗を表示できます。ステップ 4 が完了すると、show databases や show tables などのステートメントを実行して、復元タスクによってターゲットデータベースまたはテーブルが作成されたことを確認できます。この時点で、ターゲットデータベースまたはテーブルの完全なデータをクエリできます。
読み取り専用の高速アクセス
information_schema.fast_import_tablespaces テーブルをクエリして、現在の復元タスクで高速読み取り専用アクセスをサポートするすべてのテーブルに関する情報を取得できます。
現在インポート中のテーブルは高速読み取り専用モードでアクセスできますが、クエリ結果には特定のテーブル名は表示されません。SHOW PROCESSLIST コマンドを実行すると、dbms_rman.import を含む SQL ステートメントから、現在リストア中のテーブル名を取得できます。
SELECT * FROM information_schema.fast_import_tablespaces;
-
復元中のテーブルは、読み取り専用モードで全データにアクセスできます。
| 106 | root | 127.0.0.1:49055 | NULL | Sleep | 13 | | NULL | | 146 | xxx | xxx | NULL | Sleep | 43 | | NULL | | 366 | xxx | xxx | NULL | Polar Log Dump | 0 | Reading log from innodb | NULL | | 368 | xxx | xxx | NULL | Polar Log Ack | 0 | Receiving from client | NULL | | 788 | xxx | xxx | NULL | Sleep | 295 | | NULL | | xxx | xxx | xxx | NULL | Query | 332 | altering table | /* rds 内部マーク */ call dbms_rman.import('test', 'sbtest1_bk03211652' | | 216448 | xxx | xxx | information_schema | Sleep | 7 | | NULL | | 216915 | xxx | xxx | NULL | Sleep | 0 | | NULL | | 216916 | xxx | xxx | NULL | Sleep | 0 | | NULL | | 536879884 | xxx | | test | Query | 0 | starting | show processlist | 31 rows in set (0.00 sec) mysql> show tables; +----------------------+ | Tables_in_test | +----------------------+ | sbtest1 | | sbtest1_bk03211652 | | sbtest2 | | sbtest2_bk03211652 | +----------------------+ 4 rows in set (0.00 sec) mysql> select count(*) from sbtest1; +-----------+ | count(*) | +-----------+ | 100000000 | +-----------+ 1 row in set (4.64 sec) mysql> select count(*) from sbtest1_bk03211652; +-----------+ | count(*) | +-----------+ | 100000000 | +-----------+ 1 row in set (48.21 sec) -
高速アクセスが有効な他のテーブルも、読み取り専用モードで全データにアクセスできます。
mysql> select * from information_schema.fast_import_tablespaces; +----------------+-------------------------+------------------------------------------------------------------+ | LOCAL_SPACE_ID | SPACE_NAME | REMOTE_DATA_PATH | +----------------+-------------------------+------------------------------------------------------------------+ | 18 | test/sbtest2_bk03211652 | xxx/test/sbtest2_bk03211652.ibd | +----------------+-------------------------+------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> show tables; +------------------------+ | Tables_in_test | +------------------------+ | sbtest1 | | sbtest1_bk03211652 | | sbtest2 | | sbtest2_bk03211652 | +------------------------+ 4 rows in set (0.00 sec) mysql> select count(*) from sbtest2_bk03211652; +----------+ | count(*) | +----------+ | 1000 | +----------+ 1 row in set (0.00 sec) mysql> select count(*) from sbtest2; +----------+ | count(*) | +----------+ | 1000 | +----------+ 1 row in set (0.00 sec) mysql> select count(*) from sbtest1; +-----------+ | count(*) | +-----------+ | 100000000 | +-----------+ 1 row in set (19.39 sec) mysql> select count(*) from sbtest1_bk03211652; +-----------+ | count(*) | +-----------+ | 100000000 | +-----------+ 1 row in set (4.39 sec) mysql> show processlist;