MySQLデータベースを別のサーバーに移行することは、特にダウンタイムを最小限に抑え高速なパフォーマンスを目指す場合、難しい課題となります。
この作業に最も人気のあるツールの1つがmysqldumpで、これはMySQLが提供するデータベースのバックアップと復元のためのユーティリティです。この記事では、mysqldumpを使ってデータベースを移行する方法と、このプロセスを自動化するスクリプトの作成方法をご紹介します。

前提条件
- MySQLがインストールされたソースサーバーと宛先サーバー
- MySQLのrootクレデンシャル、または両サーバー上で十分な権限を持つアカウント
- 両サーバーへのSSHアクセス、またはDBサーバーが受信接続を許可していること(同一マシン上にない場合)
Contents
mysqldumpを使ってデータベースをエクスポートする
移行プロセスの最初のステップは、ソースデータベースのバックアップを作成することです。これにはmysqldumpを使用します。mysqldumpは、宛先サーバー上でデータベース構造とデータを再作成するために必要なすべてのコマンドを含むSQLスクリプトを作成します。
ソースサーバーにログインし、次のコマンドを実行してデータベースの圧縮バックアップを作成します:
mysqldump -u [username] -p --single-transaction --extended-insert --quick --lock-tables=false [database_name] | gzip > [backup_file].sql.gz[username]、[database_name]、[backup_file]を、それぞれあなたのMySQLユーザー名、移行したいデータベース名、希望するバックアップファイル名に置き換えてください。
このコマンドは、データの整合性を保証するために--single-transactionフラグを、メモリ使用量を削減するために--quickを、エクスポート中のテーブルロックを防ぐために–lock-tables=falseを使用します。
最も重要なパラメータは–extended-insertです。これにより、エクスポートしたSQLファイルのインポートが宛先サーバー上で10〜15倍速くなります。
バックアップファイルを宛先サーバーに転送する
バックアップを作成したら、もう一方のデータベースサーバーにインポートできます。
- 圧縮されたgzipファイルをサーバーにコピーしてインポートする
- ファイルを解凍し、SSH経由でMySQLを使ってDBサーバーにロードする
宛先サーバーへの転送には、SCP、SFTP、rsyncなどのツールを使用できます。たとえば、SCPを使用するには:
scp [backup_file].sql.gz [destination_user]@[destination_ip]:/path/to/destination[backup_file]、[destination_user]、[destination_ip]、/path/to/destinationを適切な値に置き換えてください。
宛先サーバー上でデータベースをインポートする
バックアップファイルを転送したら、宛先サーバーにログインし、次のコマンドを実行してデータベースをインポートします:
gunzip < [backup_file].sql.gz | mysql -u [username] -p [database_name][username]、[database_name]、[backup_file]を、それぞれあなたのMySQLユーザー名、移行したいデータベース名、バックアップファイル名に置き換えてください。
データベース移行スクリプトのダウンロード
MySQLデータベースの移行プロセスを自動化するには、私たちがここwp-staging.comでDigitalOceanにホスティングされたmanaged dbへのデータベース移行に使用したこのbashスクリプトを利用できます。(WP Stagingが現在データベース移行を実行できるため、もう使用していません):
#!/bin/sh
# migrate.sh
sourceUser=""
sourcePassword=""
sourceHostname=""
sourcePort=""
sourceDatabase=""
destinationUser=""
destinationPassword=""
destinationHostname=""
destinationPort=""
destinationDatabase=""
echo "Exporting $sourceDatabase database to ./wp-staging.com.sql"
start_export=`date +%s`
mysqldump -P $sourcePort -h $sourceHostname -u $sourceUser -p$sourcePassword --set-gtid-purged=OFF --extended-insert --single-transaction --skip-lock-tables --column-statistics=0 $sourceDatabase > ./wp-staging.com.sql
# Done creating a dump of wp-staging.com
end_export=`date +%s`
echo "Database exported in" $((end_export-start_export)) "seconds"
echo "Importing Database to... "
start_import=`date +%s`
mysql -u $destinationUser -p$destinationPassword -h $destinationHostname -P $destinationPort $destinationDatabase < ./wp-staging.com.sql
# Done importing the dump to managed db
end_import=`date +%s`
echo "Database imported in" $((end_import-start_import)) "seconds"
echo "Total runtime: " $((end_export-start_export+end_import-start_import)) "seconds"
ファイル上部にあるデータベースクレデンシャルの値を、ソースと宛先のデータベースに適した情報に置き換えてください。
スクリプトを実行する前に、ソースと宛先のデータベースがアクセス可能であることを確認してください。
次に、スクリプトに実行権限を付与します:
chmod +x migrate.shスクリプトを実行して移行を行います:
./migrate.shこのスクリプトは、mysqldumpを使ってソースデータベースをエクスポートし、mysqlコマンドを使って宛先サーバーにデータベースをインポートし、その後バックアップファイルを削除してクリーンアップします。