

# 任意のソースから Amazon RDS for MySQL DB インスタンスにデータをインポートする
<a name="mysql-importing-data-any-source"></a>

Amazon RDS を使用すると、既存の MySQL データを任意のソースから RDS for MySQL DB インスタンスに移行できます。オンプレミスデータベース、他のクラウドプロバイダー、または既存の RDS for MySQL DB インスタンスからターゲット RDS for MySQL DB インスタンスにデータを転送できます。この機能を使用すると、データベースの統合、ディザスタリカバリソリューションの実装、セルフマネージド型データベースからの移行を行うことができます。一般的なシナリオには、セルフホスト型 MySQL サーバーからフルマネージド型の Amazon RDS DB インスタンスへの移行、複数の MySQL データベースの 1 つの DB インスタンスへの統合、本番データを使用したテスト環境の作成などがあります。以下のセクションでは、`mysqldump`、バックアップファイル、レプリケーションなどのメソッドを使用して MySQL データをインポートする詳細な手順について説明します。

## ステップ 1: ロードするデータを含むフラットファイルを作成する
<a name="mysql-importing-data-any-source-create-flat-files"></a>

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

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

この手順の速度と効率は、ファイルのサイズを小さく保つかどうかによって決まります。個々のファイルの非圧縮サイズが 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_ 
```

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

フラットファイルはどこにでも保存できます。ただし、[ステップ 5](#mysql-importing-data-any-source-load-data) でデータをロードするときは、ファイルが存在するのと同じ場所から `mysql` シェルを呼び出すか、`LOAD DATA LOCAL INFILE` の実行時にファイルの絶対パスを使用する必要があります。

## ステップ 2: ターゲット DB インスタンスにアクセスしているすべてのアプリケーションを停止する
<a name="mysql-importing-data-any-source-stop-apps"></a>

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

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

## ステップ 3: DB スナップショットを作成する
<a name="mysql-importing-data-any-source-create-snapshot"></a>

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

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

次の例では、AWS CLI の [create-db-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-snapshot.html) コマンドを実行して、`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 インスタンスに接続します。詳細については、「[restore-db-instance-from-db-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html)」を参照してください。

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 インスタンスを削除してから、復元されたデータベースに同じ識別子を指定します。詳細については、「[delete-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/delete-db-instance.html)」を参照してください。

次の例でも、DB インスタンスを削除する前に最終的な 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
```

## ステップ 4 (オプション): Amazon RDS 自動バックアップをオフにする
<a name="mysql-importing-data-any-source-turn-off-automated-backups"></a>

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

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

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

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

AWS CLI の `modify-db-instance` コマンドを実行し、バックアップ保持期間を 0 に設定して変更をすぐに適用します。保持期間を 0 に設定するには DB インスタンスを再起動する必要があるため、続行前に再起動が完了するまで待っています。詳細については、「[modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html)」を参照してください。

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](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) コマンドで DB インスタンスのステータスを確認できます。次の例では、`AcmeRDS` DB インスタンスにおける DB インスタンスのステータスを表示します。

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

DB インスタンスのステータスが `available` になったら、次のステップに進む準備が整いました。

## ステップ 5: データをロードする
<a name="mysql-importing-data-any-source-load-data"></a>

フラットファイルから行を読み取ってデータベーステーブルにロードするには、MySQL の `LOAD DATA LOCAL INFILE` ステートメントを使用します。

**注記**  
フラットファイルが存在するのと同じ場所から `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 ドキュメント」の「[LOAD DATA Statement](https://dev.mysql.com/doc/refman/8.4/en/load-data.html)」を参照してください。

## ステップ 6: Amazon RDS 自動バックアップを再度オンにする
<a name="mysql-importing-data-any-source-turn-on-automated-backups"></a>

[ステップ 4](#mysql-importing-data-any-source-turn-off-automated-backups) で Amazon RDS 自動バックアップをオフにした場合は、ロードが完了したら、バックアップ保持期間をロード前の値に戻して、自動バックアップをオンにします。ステップ 4 で説明したように、Amazon RDS は DB インスタンスを再起動するため、短時間の停止に備えてください。

次の例では、AWS CLI の [modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html) コマンドを実行して、`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
```