任意のソースから MariaDB または MySQL DB インスタンスにデータをインポートする
データロードの前後にターゲットの Amazon RDS DB インスタンスの DB スナップショットを作成することをお勧めします。Amazon RDS DB スナップショットは DB インスタンスの完全なバックアップであり、DB インスタンスを既知の状態に復元するために使用できます。DB スナップショットをスタートすると、データベースのバックアップのため DB インスタンスに対する I/O 操作が一時停止されます。
ロード直前に DB スナップショットを作成すると、必要が生じた場合にデータベースをロード前の状態に復元できます。ロード直後に DB スナップショットを作成しておくと、何らかの事故のときにそのスナップショットを使用すれば、データを再ロードせずに済みます。また、そのスナップショットを使用して、新しいデータベースインスタンスをシードすることもできます。
このプロセスは以下のステップで構成されます。次に、各ステップについて詳しく説明します。
ロードするデータを含むフラットファイルを作成します。
ターゲット DB インスタンスにアクセスしているすべてのアプリケーションを停止します。
DB スナップショットを作成します。
Amazon RDS 自動バックアップを無効にすることを検討します。
データをロードします。
自動バックアップを再度有効にします。
ステップ 1: ロードするデータを含むフラットファイルを作成する
カンマ区切り値 (CSV) などの一般的な形式を使用して、ロードするデータを保存します。各テーブルには独自のファイルが必要です。複数のテーブルのデータを同じファイルに結合することはできません。各ファイルに、対応するテーブルと同じ名前を付けます。ファイル拡張子は何でもかまいません。例えば、テーブル名が sales
の場合、ファイル名に sales.csv
または sales.txt
は使用できますが、sales_01.csv
は使用できません。
可能であれば必ず、ロードされるテーブルのプライマリキーでデータをソートします。これにより、ロード時間が大幅に短縮され、ディスクストレージの要件が最小限に抑えられます。
この手順の速度と効率は、ファイルのサイズを小さく保つかどうかによって決まります。個々のファイルの非圧縮サイズが 1 GiB を超える場合、複数のファイルに分割して、1 つずつロードしてください。
Unix のようなシステム (Linux など) では、split
コマンドを使用します。例えば、次のコマンドでは sales.csv
ファイルが 1 GiB 未満の複数のファイルに分割されます。ただし、分割されるのは改行でのみです (-C 1024m)。新しいファイルには、sales.part_00
、sales.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-identifierpreload
Windows の場合:
aws rds create-db-snapshot ^ --db-instance-identifier
AcmeRDS
^ --db-snapshot-identifierpreload
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-identifierpreload
Windows の場合:
aws rds restore-db-instance-from-db-snapshot ^ --db-instance-identifier
AcmeRDS-2
^ --db-snapshot-identifierpreload
既存のエンドポイントを再利用するには、まず DB インスタンスを削除してから、復元されたデータベースに同じ識別子を指定します。
Linux、macOS、Unix の場合:
aws rds delete-db-instance \ --db-instance-identifier
AcmeRDS
\ --final-db-snapshot-identifierAcmeRDS-Final
aws rds restore-db-instance-from-db-snapshot \ --db-instance-identifierAcmeRDS
\ --db-snapshot-identifierpreload
Windows の場合:
aws rds delete-db-instance ^ --db-instance-identifier
AcmeRDS
^ --final-db-snapshot-identifierAcmeRDS-Final
aws rds restore-db-instance-from-db-snapshot ^ --db-instance-identifierAcmeRDS
^ --db-snapshot-identifierpreload
前述の例では、削除する前に 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-period0
Windows の場合:
aws rds modify-db-instance ^ --db-instance-identifier
AcmeRDS
^ --apply-immediately ^ --backup-retention-period0
AWS CLI の describe-db-instances
コマンドで DB インスタンスのステータスを確認できます。次の例では、AcmeRDS
DB インスタンスにおける DB インスタンスのステータスを表示します。
aws rds describe-db-instances --db-instance-identifier
AcmeRDS
--query "*[].{DBInstanceStatus:DBInstanceStatus}"
DB インスタンスのステータスが available
になったら、続行する準備ができています。
ステップ 5: データをロードする
MySQL の LOAD DATA LOCAL INFILE
ステートメントを使用して、フラットファイルから行を読み取って、データベーステーブルにロードします。
次の例は、sales.txt
という名前のファイルからデータベース内の Sales
という名前のテーブルにデータをロードする方法を示しています。
mysql> LOAD DATA LOCAL INFILE 'sales.txt' INTO TABLE Sales FIELDS TERMINATED BY ' ' ENCLOSED BY '' ESCAPED BY '\\'; Query OK, 1 row affected (0.01 sec) Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
LOAD DATA
ステートメントの詳細については、「MySQL ドキュメント
ステップ 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-period1
\ --apply-immediately
Windows の場合:
aws rds modify-db-instance ^ --db-instance-identifier
AcmeRDS
^ --backup-retention-period1
^ --apply-immediately