mysqldump を使って MySQL データを移行します。 mysqldump のデメリットは、サービス停止時間が長いことです。 データ量が少ない場合、またはサービス停止時間が長くなっても許される場合には、mysqldump を使用します。

背景情報

RDS と MySQL に完全な互換性があるため、ローカルデータベースから RDS インスタンスへの移行手順は、MySQL サーバーから他の MySQL サーバーへデータを移行する場合と同じです。

前提条件

  • ホワイトリストを設定し、インターネット IP アドレスを適用し、RDS インスタンス用のデータベースとアカウントを作成しておきます。 詳細については、「 クイックスタート」を参照してください。
  • ECS インスタンスが作成されています。

手順

データの移行を始める前に、ローカルデータベースに移行アカウントを作成し、そのデータベースの読み取り書き込み権限をアカウントに付与します。

  1. ローカルデータベースに移行アカウントを作成します。
    CREATE USER 'username'@'host' IDENTIFIED BY 'password';

    パラメーターの説明:

    • "username": 作成するアカウントを示します。
    • "host": アカウントを使用してデータベースにログインするホストを示します。 ローカルユーザーとして localhost を使ってデータベースへログインすることができます。 その他のホストからログインする場合、ワイルドカード % を使用します。
    • ”password": アカウントのログインパスワードを示します。

    次の例では、ユーザー名 "William" とパスワード ”Changeme123" を使って説明します。どのホストからでもローカルデータベースへログインできます。

    CREATE USER 'William'@'%' IDENTIFIED BY 'Changme123';
  2. ローカルデータベースの移行アカウントに権限を付与します。
    GRANT SELECT ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;
    GRANT REPLICATION SLAVE ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;

    パラメーターの説明:

    • "privileges": アカウントの操作権限 (SELECTINSERTUPDATE) アカウントにすべての権限を付与する場合は、ALL を使用します。
    • "databasename": データベース名 アカウントにすべてのデータベース権限を付与する場合は、ワイルドカード "*" を使用します。
    • "tablename": テーブル名 アカウントにすべてのテーブル権限を付与する場合は、ワイルドカード "*" を使用します。
    • "username": 権限を付与するアカウント名を示します。
    • "host": データベースへログインを承認されているホストを示します。 ローカルユーザーとして local host を使ってデータベースへログインすることができます。 任意のホストからログインする場合は、ワイルドカード % を使用します。
    • "WITH GRANT OPTION": アカウントが GRANT コマンドを使用できるようにするオプションパラメータです。

    次の例では、すべてのデータベースおよびテーブル権限を付与されたアカウント William を使って説明します。

    GRANT ALL ON *.* TO 'William'@'%';
  3. mysqldump のデータエクスポートツールを使って、データベースにあるデータをデータファイルとしてエクスポートします。
    データのエクスポート中は、データを更新しないでください。 この手順では、ストアドプロシージャ、トリガー、および関数を除くデータのみをエクスポートします。
    mysqldump -h localIp -u userName -p --opt --default-character-set=utf8 --hex-blob dbName --skip-triggers > /tmp/dbName.sql

    パラメーターの説明:

    • "localIp": ローカルデータベースサーバーの IP アドレス
    • "userName": ローカルデータベースの移行アカウント
    • "dbName": 移行するデータベースの名前
    • "/tmp/dbName.sql": バックアップファイル名
  4. mysqldump を使ってストアドプロシージャ、トリガー、関数をエクスポートします。
    データベース内でストアドプロシージャ、トリガー、関数を使用していない場合は、この手順を省略できます。 RDS との互換性を保つために、ストアドプロシージャ、トリガー、関数をエクスポートする場合は、"definer" を削除する必要があります。
    mysqldump -h localIp -u userName -p --opt --default-character-set=utf8 --hex-blob dbName -R | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > /tmp/triggerProcedure.sql

    パラメーター の説明:

    • "localIp": ローカルデータベースサーバーの IP アドレス
    • "userName": ローカルデータベースの移行アカウント
    • "dbName": 移行するデータベースの名前
    • "/tmp/triggerProcedure.sql": バックアップファイル名
  5. ECS へデータファイルやストアドプロシージャをアップロードします。

    この文書の例では、次のパスへのファイルのアップロード方法について説明しています。

    /tmp/dbName.sql
    /tmp/triggerProcedure.sql
  6. ECS へログインし、対象 RDS へデータファイルとプロシージャファイルをインポートします。
    mysql -h intranet4example.mysql.rds.aliyuncs.com –u userName -p dbName < /tmp/dbName.sql
    mysql -h intranet4example.mysql.rds.aliyuncs.com -u userName -p dbName < /tmp/triggerProcedure.sql

    パラメーターの説明:

    • "intranet4example.mysql.rds.aliyuncs.com": RDS インスタンスの接続アドレス イントラネット IP アドレスを例として使用されます。
    • "userName": RDS データベースの移行アカウント
    • "dbName": インポートするデータベースの名前
    • "/tmp/dbName.sql": インポートするデータファイルの名前
    • "/tmp/triggerProcedure.sql": インポートするストアドプロシージャファイルの名前