ESC

Start typing to search across invoices, services, domains, tickets, and more...

Search... Ctrl+K
Linuxサーバー

rsyncとmysqldumpでサーバー移行:ダウンタイムをほぼゼロにするサイト引っ越し手順

5 ステップ 11 分で読めます 4 回閲覧 0
目次

データセンターの変更、構成のアップグレード、他社からの乗り換えの際に最も心配なのは、データの消失と長時間のダウンタイムです。このガイドでは、実践で実績のある移行手順を紹介します。rsyncによるファイルの差分同期、mysqldumpによるデータベース移行、そして事前にDNSのTTLを下げておくことでスムーズに切り替える方法です。ほとんどのウェブサイトでは、これによりダウンタイムをわずか数分に抑えられます。

要点まとめ

  • ウェブサイトやサーバーをスムーズに移行するカギは、DNSのTTLを早めに下げること、フル同期の後に差分同期を行うこと、そしてDNSを切り替える前に新サーバーでテストすることです。
  • 移行の少なくとも24時間前に、サイトのAレコードのDNS TTLを300秒、場合によっては60秒まで下げ、切り替え前に各地のDNSキャッシュが期限切れになるようにします。
  • rsyncによる最初のフル同期はウェブサイトを稼働させたまま実行でき、最後の差分同期は変更されたファイルだけを転送するため高速です。
  • InnoDBテーブルの場合、mysqldumpの--single-transactionオプションを使うと、テーブルをロックせずに一貫性のあるスナップショットをエクスポートできます。
  • IMIDCは、香港、日本、シンガポール、米国などでクラウドサーバーまたは専用サーバーを契約したお客様に、無料の移行サポートサービスを提供しています。

対象読者と前提条件

  • 移行元と移行先のサーバーがどちらもLinux(Ubuntu、Debian、Rocky Linux、AlmaLinuxなど)であること
  • 両方のサーバーにrootまたはsudoユーザーでSSHログインでき、rsyncがインストールされていること
  • 移行先サーバーに、移行元と同じまたは互換性のある実行環境(Nginx/Apache、PHP、MySQL/MariaDB)が用意されていること

rsyncのインストール:

# Debian / Ubuntu
apt install -y rsync
# RHEL / Rocky / AlmaLinux
dnf install -y rsync

移行前チェックリスト

項目 内容
フルバックアップ 移行前に移行元サーバーのフルバックアップまたはスナップショットを取得する
ディスク容量 df -h と du -sh で移行先ディスクの容量が十分か確認する
ソフトウェアのバージョン PHP、MySQL、Nginxのバージョンを比較し、新しいバージョンとの非互換を避ける
設定ファイル バーチャルホストの設定、cronジョブ(crontab -l)、SSL証明書の場所を記録する
ハードコードされたIP アプリケーションや設定に旧サーバーのIPが直接書き込まれていないか確認する
メールと外部サービス MXレコード、APIの許可リスト、決済のコールバックURLなどが旧IPに依存していないか確認する
DNS TTL 少なくとも24時間前にTTLを下げておく

手順

1. 事前にDNSのTTLを下げる

ドメインのDNS管理画面にログインし、サイトのAレコードのTTLをデフォルト値(一般的に3600秒以上)から300秒、場合によっては60秒に変更します。実際の切り替えまでに少なくとも元のTTL 1周期分待ち、各地のリゾルバーのDNSキャッシュが期限切れになるようにします。現在のTTLは次のコマンドで確認できます。

dig example.com A +noall +answer

出力のドメイン名の後ろにある数値が、残りのTTL(秒)です。

2. パスワード不要で転送できるようSSH鍵を設定する

移行先サーバーで鍵を生成し、移行元サーバーに登録します(新しいマシン側から作業できるよう「プル」方式を採用します)。

ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
ssh-copy-id -p 22 root@SOURCE_SERVER_IP

コマンド中の SOURCE_SERVER_IP は、移行元サーバーのIPアドレスに置き換えてください。

3. rsyncで最初のフル同期を実行する

移行先サーバーで実行します(ウェブサイトのディレクトリを同期する例)。

rsync -avzP -e "ssh -p 22" root@SOURCE_SERVER_IP:/var/www/ /var/www/

オプションの意味:-a はアーカイブモードで、パーミッション、所有者、タイムスタンプを保持します。-v は詳細表示、-z は転送時の圧縮、-P は進捗表示と中断した転送の再開を可能にします。移行元パスの末尾の / は「ディレクトリの中身を同期する」という意味で、付け忘れるとディレクトリが1階層余分にネストされるので注意してください。

本番実行の前に -n(--dry-run)を付けると、転送されるファイルをプレビューできます。キャッシュやログのディレクトリを除外するには --exclude を使います。

rsync -avzPn --exclude 'cache/' --exclude '*.log' -e "ssh -p 22" root@SOURCE_SERVER_IP:/var/www/ /var/www/

最初のフル同期は、ウェブサイトを稼働させたままでも業務に影響を与えずに実行できます。

4. mysqldumpでデータベースを移行する

移行元サーバーでデータベースをエクスポートします。InnoDBテーブルの場合、--single-transaction を使うとテーブルをロックせずに一貫性のあるスナップショットを取得できます。

mysqldump -u root -p --single-transaction --routines --triggers --events --default-character-set=utf8mb4 dbname | gzip > /root/dbname.sql.gz

移行先サーバーに転送します。

rsync -avP -e "ssh -p 22" root@SOURCE_SERVER_IP:/root/dbname.sql.gz /root/

移行先サーバーでデータベースとユーザーを作成し、インポートします。

mysql -u root -p -e "CREATE DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -u root -p -e "CREATE USER 'dbuser'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD'; GRANT ALL PRIVILEGES ON dbname.* TO 'dbuser'@'localhost'; FLUSH PRIVILEGES;"
gunzip < /root/dbname.sql.gz | mysql -u root -p dbname

STRONG_PASSWORD はご自身で決めた強力なパスワードに置き換えてください。

インポート後、テーブル数が一致しているかを抜き取りで確認します。

mysql -u root -p -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='dbname';"

5. 新しいサーバーでテストする

DNSは変更せず、ローカルPCのhostsファイルで一時的にドメインを新しいIPに向けます(Windowsは C:\Windows\System32\drivers\etc\hosts、macOS/Linuxは /etc/hosts)。

203.0.113.20  example.com www.example.com

トップページ、ログイン、アップロード、決済のコールバックなど、重要な機能を一つずつ確認します。問題がなければ、hostsのエントリを削除します。

6. 最終的な差分同期とDNSの切り替え

  1. 移行元サイトをメンテナンスモードにするか書き込みを停止し、切り替え中に新しいデータが発生しないようにします。
  2. もう一度rsyncを実行します。今回は変更されたファイルだけが転送されるため高速です。移行先ディレクトリを移行元と完全に一致させたい場合は --delete を付けます(移行先にある余分なファイルが削除されるため、慎重に使ってください)。
  3. データベースをもう一度エクスポートしてインポートします。
  4. DNSのAレコードを新しいサーバーのIPに変更します。TTLをすでに下げてあるため、ほとんどの訪問者は数分以内に新しいサーバーにアクセスするようになります。
  5. 新しいサーバーのアクセスログを監視し、トラフィックが切り替わったことを確認したら、TTLを通常の値に戻します。

必要に応じてロールバックできるよう、移行元サーバーは解約前に少なくとも3〜7日間残しておくことをおすすめします。

よくある質問

rsyncの転送が途中で中断したらどうすればよいですか?

同じコマンドをもう一度実行するだけです。rsyncは転送済みのファイルをスキップし、-P オプションにより大きなファイルの転送も途中から再開できます。

データベースが巨大でエクスポートが遅すぎる場合はどうすればよいですか?

--quick を付けてメモリ使用量を減らし、パイプで圧縮しながらエクスポートと転送を同時に行います。数十GB以上のデータベースの場合は、物理バックアップツール(Percona XtraBackupやmariabackupなど)や、プライマリ/レプリカのレプリケーションによる移行を検討してください。

移行後にサイトの文字(日本語や中国語など)が文字化けするのはなぜですか?

通常は、エクスポート時とインポート時の文字セットの不一致が原因です。エクスポート時に --default-character-set=utf8mb4 を指定し、移行先のデータベースもutf8mb4を使用していることを確認してください。

DNSを切り替えた後も、一部のユーザーが旧サーバーにアクセスしてしまうのはなぜですか?

一部のISPのDNSキャッシュがまだ期限切れになっていないためで、通常は元のTTLの期間内に自然に解消されます。旧サーバーを数日間残しておくべき理由もここにあります。

まとめ

スムーズな移行のポイントは、「TTLを早めに下げる、フル同期の後に差分同期を行う、テストしてから切り替える」ことです。ウェブサイトやビジネスをIMIDCに移行する予定の方には、無料の移行サポートサービスをご用意しています。香港、日本、シンガポール、米国などでクラウドサーバーまたは専用サーバーを契約した後、移行元の環境と移行の要件を記載したチケットを送信していただければ、技術スタッフが具体的なプランと作業時間帯をご相談します。移行中に疑問点があれば、24時間365日対応のチケットシステムでいつでもサポートを受けられます。

関連記事

この回答はお役に立ちましたか?

関連チュートリアル