mysqldump は、データベースのスキーマとデータを CREATE TABLE 文と INSERT 文を含む SQL ファイルとしてエクスポートし、そのファイルをターゲットインスタンスで再生します。この方法は、データ量が少ない場合や、移行中の長時間のダウンタイムが許容できる場合に適しています。
サービスを中断せずに移行する場合は、代わりに Data Transmission Service (DTS) を使用してください。DTS は、継続的なレプリケーションと最小限のダウンタイムでの切り替えをサポートします。
前提条件
開始する前に、以下の準備が完了していることを確認してください:
-
RDS インスタンスの IP アドレスホワイトリストが設定されていること
-
RDS インスタンスのパブリックエンドポイントが取得されていること
-
RDS インスタンスにターゲットデータベースとアカウントが作成されていること
設定手順の詳細については、「ApsaraDB RDS for MySQL を使用するための一般的なワークフロー」をご参照ください。
利用シーン
mysqldump は、以下のような場合に適しています:
-
データ量が少ない — エクスポートとインポートがメンテナンスウィンドウ内に完了する場合
-
ダウンタイムが許容できる — 一貫性を保証するために、エクスポート中はソースデータベースへの書き込みを停止する必要がある場合
-
継続的なレプリケーションが不要 — 1 回限りの論理コピーで十分な場合
ゼロダウンタイムでの切り替えや継続的なレプリケーションが必要な場合は、代わりに DTS を使用してください。
注意事項
移行後、セルフマネージド MySQL インスタンスのすべてのテーブル名は、RDS インスタンス上で小文字で保存されます。大文字と小文字を区別するテーブル名を保持するには、以下のいずれかの方法を使用してください:
-
新規インスタンスの場合: ApsaraDB RDS for MySQL インスタンスを作成する際に、[テーブル名の大文字と小文字の区別] を [大文字と小文字を区別] に設定してください。
-
既存のインスタンスの場合: ApsaraDB RDS コンソールで
lower_case_table_namesを0に設定してください。詳細については、「ApsaraDB RDS for MySQL インスタンスのパラメーターの変更」をご参照ください。
lower_case_table_names を 0 に設定した後は、1 に戻さないでください。変更すると ERROR 1146 (42S02): Table doesn't exist エラーが発生し、ワークロードに深刻な影響を与える可能性があります。ご利用の RDS インスタンスが MySQL 8.0 を実行している場合、インスタンス作成後に lower_case_table_names を再設定することはできません。
mysqldump を使用したデータ移行
以下の手順では Linux 環境を使用します。同じコマンドは macOS ターミナルや Windows コマンドプロンプトでも動作します。
ステップ 1:セルフマネージド MySQL インスタンスからのデータのエクスポート
エクスポートを実行する前に、ソースデータベースへのすべての書き込みを停止してください。エクスポート中にデータを更新すると、ダンプファイルが破損する可能性があります。
エクスポートに使用するアカウントには、必須の権限が必要です。詳細については、MySQL 公式ドキュメントをご参照ください。
スキーマとデータのエクスポート (ストアドプロシージャ、トリガー、関数を除く):
mysqldump -h 127.0.0.1 -u user -p --opt --default-character-set=utf8 --hex-blob <db_name> --skip-triggers --skip-lock-tables > /tmp/<db_name>.sql
例:
mysqldump -h 127.0.0.1 -u user -p --opt --default-character-set=utf8 --hex-blob testdb --skip-triggers --skip-lock-tables > /tmp/testdb.sql
代わりに ApsaraDB RDS for MySQL インスタンスからデータをエクスポートするには、ホスト、ユーザー名、データベース名を対応する RDS の値に置き換えてください。
--default-character-set=utf8 フラグは、ダンプファイルの文字セットを設定します。ソースデータベースが異なる文字セットを使用している場合は、このフラグをそれに合わせて設定してください。ダンプファイルの文字セットとターゲットインスタンスの文字セットが一致しない場合、インポート後に文字化けが発生します。
ストアドプロシージャ、トリガー、関数のエクスポート:
mysqldump -h 127.0.0.1 -u user -p --opt --default-character-set=utf8 --hex-blob <db_name> -R | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/*/' > /tmp/<db_name>Trigger.sql
例:
mysqldump -h 127.0.0.1 -u user -p --opt --default-character-set=utf8 --hex-blob testdb -R | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > /tmp/testdbTrigger.sql
ソースデータベースにストアドプロシージャ、トリガー、または関数がない場合は、このコマンドをスキップしてください。
ステップ 2:エクスポートしたファイルの ECS インスタンスへのアップロード
ステップ 1 でエクスポートした .sql ファイルを、RDS インスタンスにアクセスできる Elastic Compute Service (ECS) インスタンスの /tmp ディレクトリにアップロードします。
セルフマネージド MySQL インスタンスが既に ECS インスタンス上で実行されている場合は、このステップをスキップしてください。
ステップ 3:RDS インスタンスへのファイルのインポート
ECS インスタンスで以下のコマンドを実行します。プレースホルダーをご利用の RDS 接続情報に置き換えてください。
mysql -h <RDS endpoint> -P <port> -u <account> -p <database> < /tmp/<db_name>.sql
mysql -h <RDS endpoint> -P <port> -u <account> -p <database> < /tmp/<db_name>Trigger.sql
例:
mysql -h rm-bpxxxxx.mysql.rds.aliyuncs.com -P 3306 -u testuser -p testdb < /tmp/testdb.sql
mysql -h rm-bpxxxxx.mysql.rds.aliyuncs.com -P 3306 -u testuser -p testdb < /tmp/testdbTrigger.sql
| プレースホルダー | 説明 | 例 |
|---|---|---|
<RDS endpoint> |
RDS インスタンスのパブリックエンドポイント | rm-bpxxxxx.mysql.rds.aliyuncs.com |
<port> |
RDS インスタンスのポート | 3306 |
<account> |
RDS アカウント (特権アカウント、または読み取りおよび書き込み権限を持つ標準アカウント) | testuser |
<database> |
ターゲットデータベース名 — RDS インスタンスに既に存在している必要があります | testdb |
ターゲットデータベースがまだ存在しない場合に作成するには、「データベースの管理」をご参照ください。
ステップ 4:移行の検証
DMS を使用して RDS インスタンスにログインし、テーブル、行数、およびデータが正しく表示されることを確認してください。
次のステップ
-
データ移行方法の概要 — mysqldump と DTS およびその他の移行アプローチを比較します
-
ApsaraDB RDS for MySQL インスタンスのパラメーターの変更 —
lower_case_table_namesやその他のインスタンスパラメーターを調整します