任意のソースから MariaDB または MySQL DB インスタンスにデータをインポートする - Amazon Relational Database Service

任意のソースから MariaDB または MySQL DB インスタンスにデータをインポートする

ロードするデータが 1 GiB を超える場合、あるいは MariaDB または MySQL データベース以外の場所からのデータの場合、フラットファイルを作成し、mysqlimport を使用してロードすることをお勧めします。mysqlimport ユーティリティは、MySQL および MariaDB クライアントソフトウェアにバンドルされた別のコマンドラインユーティリティです。その目的は、MySQL または MariaDB にフラットファイルをロードすることです。mysqlimport については、MySQL ドキュメントの「mysqlimport - データインポートプログラム」を参照してください。

また、データロードの前後にターゲット Amazon RDS DB インスタンスの DB スナップショットを作成することもお勧めします。Amazon RDS DB スナップショットは DB インスタンスの完全なバックアップであり、DB インスタンスを既知の状態に復元するために使用できます。DB スナップショットをスタートすると、データベースのバックアップのため DB インスタンスに対する I/O 操作が一時停止されます。

ロード直前に DB スナップショットを作成すると、必要が生じた場合にデータベースをロード前の状態に復元できます。ロード直後に DB スナップショットを作成しておくと、何らかの事故のときにそのスナップショットを使用すれば、データを再ロードせずに済みます。また、そのスナップショットを使用して、新しいデータベースインスタンスをシードすることもできます。

このプロセスは以下のステップで構成されます。次に、各ステップについて詳しく説明します。

  1. ロードするデータを含むフラットファイルを作成します。

  2. ターゲット DB インスタンスにアクセスしているすべてのアプリケーションを停止します。

  3. DB スナップショットを作成します。

  4. Amazon RDS 自動バックアップを無効にすることを検討します。

  5. mysqlimport を使用してデータをロードします。

  6. 自動バックアップを再度有効にします。

ステップ 1: ロードするデータを含むフラットファイルを作成する

カンマ区切り値 (CSV) などの一般的な形式を使用して、ロードするデータを保存します。各テーブルには独自のファイルが必要です。複数のテーブルのデータを同じファイルに結合することはできません。各ファイルに、対応するテーブルと同じ名前を付けます。ファイル拡張子は何でもかまいません。例えば、テーブル名が sales の場合、ファイル名に sales.csv または sales.txt は使用できますが、sales_01.csv は使用できません。

可能であれば必ず、ロードされるテーブルのプライマリキーでデータをソートします。これにより、ロード時間が大幅に短縮され、ディスクストレージの要件が最小限に抑えられます。

この手順の速度と効率は、ファイルのサイズを小さく保つかどうかによって決まります。個々のファイルの非圧縮サイズが 1 GiB を超える場合、複数のファイルに分割して、1 つずつロードしてください。

Unix のようなシステム (Linux など) では、split コマンドを使用します。例えば、次のコマンドでは sales.csv ファイルが 1 GiB 未満の複数のファイルに分割されます。ただし、分割されるのは改行でのみです (-C 1024m)。新しいファイルには、sales.part_00sales.part_01 などの名前が付けられます。

split -C 1024m -d sales.csv sales.part_

他のオペレーティングシステムにも同様のユーティリティを使用できます。

ステップ 2: ターゲット DB インスタンスにアクセスしているすべてのアプリケーションを停止する

大きなロードをスタートする前に、ロード先のターゲット DB インスタンスにアクセスするすべてのアプリケーションアクティビティを停止します。特に、他のセッションでロード中のテーブルや参照するテーブルを変更する場合は、これをお勧めします。これにより、ロード中に発生する制約違反のリスクが軽減され、ロードパフォーマンスが向上します。また、ロードに関係しないプロセスによって行われた変更を失うことなく、DB インスタンスをロードの直前の時点に復元することもできます。

もちろん、これは可能でない場合や実用的ではない場合があります。アプリケーションによる DB インスタンスへのアクセスをロード前に停止できない場合は、データの可用性と整合性を確保するための手順を実行してください。必要となる具体的なステップは、実際のユースケースとサイト要件によって大きく異なります。

ステップ 3: DB スナップショットを作成する

データが含まれない新しい DB インスタンスにデータをロードする場合、このステップをスキップできます。それ以外の場合、DB インスタンスの DB スナップショットを作成すると、必要な場合に、ロード直前の時点まで DB インスタンスを復元できるようになります。前述のとおり、DB スナップショットをスタートすると、データベースのバックアップのため DB インスタンスに対する I/O 操作が数分間一時停止されます。

次の例では、AWS CLI の create-db-snapshot コマンドを実行して、AcmeRDS インスタンスの DB スナップショットを作成し、DB スナップショットに識別子 "preload" を指定します。

Linux、macOS、Unix の場合:

aws rds create-db-snapshot \ --db-instance-identifier AcmeRDS \ --db-snapshot-identifier preload

Windows の場合:

aws rds create-db-snapshot ^ --db-instance-identifier AcmeRDS ^ --db-snapshot-identifier preload

DB スナップショットからの復元機能を使用して、リハーサル用のテスト DB インスタンスを作成したり、ロード中に加えられた変更を元に戻すこともできます。

DB スナップショットからデータベースを復元すると、すべての DB インスタンスと同様に一意の識別子とエンドポイントを持つ新しい DB インスタンスが作成される点に留意してください。エンドポイントを変更せずに DB インスタンスを復元するには、エンドポイントを再利用できるように、まず DB インスタンスを削除します。

例えば、リハーサルや他のテスト用の DB インスタンスを作成するには、DB インスタンスに独自の識別子を指定します。この例での識別子は「AcmeRDS-2」です。この例では、AcmeRDS-2 に関連付けられたエンドポイントを使用して DB インスタンスに接続します。

Linux、macOS、Unix の場合:

aws rds restore-db-instance-from-db-snapshot \ --db-instance-identifier AcmeRDS-2 \ --db-snapshot-identifier preload

Windows の場合:

aws rds restore-db-instance-from-db-snapshot ^ --db-instance-identifier AcmeRDS-2 ^ --db-snapshot-identifier preload

既存のエンドポイントを再利用するには、まず DB インスタンスを削除してから、復元されたデータベースに同じ識別子を指定します。

Linux、macOS、Unix の場合:

aws rds delete-db-instance \ --db-instance-identifier AcmeRDS \ --final-db-snapshot-identifier AcmeRDS-Final aws rds restore-db-instance-from-db-snapshot \ --db-instance-identifier AcmeRDS \ --db-snapshot-identifier preload

Windows の場合:

aws rds delete-db-instance ^ --db-instance-identifier AcmeRDS ^ --final-db-snapshot-identifier AcmeRDS-Final aws rds restore-db-instance-from-db-snapshot ^ --db-instance-identifier AcmeRDS ^ --db-snapshot-identifier preload

前述の例では、削除する前に DB インスタンスの最終的な DB スナップショットを取得しています。これはオプションですが推奨されます。

ステップ 4: Amazon RDS 自動バックアップの無効化を検討する

警告

ポイントインタイムリカバリを実行する必要がある場合は、自動バックアップを無効にしないでください。

自動バックアップを無効にすると既存のバックアップがすべて削除されるため、ポイントインタイムリカバリが実行できなくなります。自動バックアップを無効にすると、パフォーマンスが最適化します。これはデータのロードに必須ではありません。自動バックアップを無効にしても、手動 DB スナップショットに影響が及ぶことはありません。既存のすべての手動 DB スナップショットは引き続き復元で使用可能です。

自動バックアップを無効にするとロード時間が約 25% 短縮し、ロード時に必要なストレージ容量が減少します。データが含まれない新しい DB インスタンスにデータをロードする場合、バックアップを無効にすると、ロードを簡単に高速化でき、バックアップに必要な追加のストレージを使用する必要がなくなります。しかし、状況によっては、既にデータが含まれている DB インスタンスにロードする場合もあります。その場合、バックアップを無効にするメリットと、ポイントインタイムリカバリを実行できなくなることの影響を比較検討する必要があります。

DB インスタンスでは、デフォルトで自動バックアップが有効になっています (保持期間は 1 日です)。自動バックアップを無効にするには、バックアップ保持期間を 0 に設定します。ロード後、バックアップ保持期間を 0 以外の値に設定することでバックアップを再度有効にすることができます。バックアップを有効または無効にするには、Amazon RDS で DB インスタンスをシャットダウンおよび再起動して、MariaDB または MySQL のログ記録を有効または無効にします。

AWS CLI の modify-db-instance コマンドを使用し、バックアップ保持期間を 0 に設定して変更をすぐに適用します。保持期間を 0 に設定するには DB インスタンスを再起動する必要があるため、続行前に再起動が完了するまで待っています。

Linux、macOS、Unix の場合:

aws rds modify-db-instance \ --db-instance-identifier AcmeRDS \ --apply-immediately \ --backup-retention-period 0

Windows の場合:

aws rds modify-db-instance ^ --db-instance-identifier AcmeRDS ^ --apply-immediately ^ --backup-retention-period 0

AWS CLI の describe-db-instances コマンドで DB インスタンスのステータスを確認できます。次の例では、AcmeRDS DB インスタンスにおける DB インスタンスのステータスを表示します。

aws rds describe-db-instances --db-instance-identifier AcmeRDS --query "*[].{DBInstanceStatus:DBInstanceStatus}"

DB インスタンスのステータスが available になったら、続行する準備ができています。

ステップ 5: データをロードする

mysqlimport ユーティリティを使用して Amazon RDS にフラットファイルをロードします。次の例では、名前が「sales」で、拡張子が「part_」で始まるすべてのファイルをロードするように mysqlimport に指示しています。これは、「split」の例で作成されたすべてのファイルをロードする便利な方法です。

--compress オプションを使用してネットワークトラフィックを最小限に抑えます。--fields-terminated-by=',' オプションは CSV ファイルに使用され、--local オプションは受信データがクライアントにあることを指定します。--local オプションがない場合、Amazon RDS DB インスタンスはデータベースホストでデータを検索するため、必ず --local オプションを指定してください。— ホストオプションには、RDS for MySQL DB インスタンスの DB インスタンスエンドポイントを指定します。

RDS for MySQL バージョン 8.0.15 以降の場合、mysqlimport ユーティリティを使用する前に次のステートメントを実行します。

GRANT SESSION_VARIABLES_ADMIN ON *.* TO master_user;

master_user を DB インスタンスのマスターユーザー名に置き換えます。

Linux、macOS、Unix の場合:

mysqlimport --local \ --compress \ --user=username \ --password \ --host=hostname \ --fields-terminated-by=',' Acme sales.part_*

Windows の場合:

mysqlimport --local ^ --compress ^ --user=username ^ --password ^ --host=hostname ^ --fields-terminated-by="," Acme sales.part_*

データロードがかなり大きい場合、ファイルのロード中に定期的に追加の DB スナップショットを取得し、ロード済みのファイルを書き留めます。問題が発生した場合、最後の DB スナップショットのポイントから簡単に再開できるため、時間のかかる再ロードを回避できます。

ステップ 6: Amazon RDS 自動バックアップを有効にする

ロードが完了したら、バックアップ保持期間をロード前の値に戻すことで、Amazon RDS 自動バックアップを有効にします。前述のように、Amazon RDS により DB インスタンスが再起動されるため、短時間の停止に備えてください。

次の例では、AWS CLI の modify-db-instance コマンドを使用して、AcmeRDS DB インスタンスの自動バックアップを有効にします。保持期間は 1 日に設定します。

Linux、macOS、Unix の場合:

aws rds modify-db-instance \ --db-instance-identifier AcmeRDS \ --backup-retention-period 1 \ --apply-immediately

Windows の場合:

aws rds modify-db-instance ^ --db-instance-identifier AcmeRDS ^ --backup-retention-period 1 ^ --apply-immediately