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 に戻さないでください。`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およびその他のインスタンスパラメーターを調整します