WordPressサイト間のデータ移管について

WordPressのサイトリニューアルなどで、サーバ環境ごと旧サイトから新サイトへ移行するケースがある。よくあるのが、サーバが老朽化したので新しいサーバに環境を移管する時とかだ。ほかに局地限定になるが、クラウド大手のAWSの例で、旧来型のParavirtual系インスタンスからモダンなHVM系インスタンスへ移管する場合に、PV2HVM変換とか面倒過ぎてHVMで環境作り直した方が早くね?とか思った時だ(リアル過ぎ…w)。

まぁ、移管理由は色々あれど、今回、私が経験したのが、旧サイトが1ホスト(サーバ)=1サイト(WordPress)という環境だったのに対して、新サイトはサブディレクトリ型の構造で、そのサブディレクトリの一つへサイト(WordPress)全体を移すという要件だった。サブディレクトリ内にWordPressをインストールするところまでは、何の問題もなかったのだが、いざデータ移行となって問題が発生した。今までさんざんやって来たDBデータをフルダンプした後に、新環境のDBへインポートするという手順が上手くいかなかったのだ。

──そんなわけで、WordPressのインポートツールを利用しながら、データ移管を行ってみた次第。

一般的なDBダンプファイルによるデータ移管

まず、今回上手くいかなかったが、通常WordPressサイト間のデータ移管であれば、この方法で行うのがもっぱらなのではないだろうか。実際、私もこの方法でしかやったことがなかったし、環境を複製する場合は確実で早い。

やり方は至ってシンプルで、まず、移管元DBからデータをエクスポートする。

次に、移管先DBへエクスポートデータをインポートする。

そして、もしサイトのDNS(ドメイン)やWordPressインストールパスが変わる場合は、移管先DBのオプション定義値を更新する。

これだけで、移管元と全く同じデータを持った環境ができる。

しかし、今回はこの方法では上手くいかなかったので、WordPressの管理メニュー「ツール」に昔からある「エクスポート」「インポート」のツールを使ってデータ移管をしてみた。

WordPressのバンドルツールによるデータ移管

手順としては、下記のようになる。

1. 移管元のWordPressでデータをエクスポートする

管理画面から 「ツール」->「エクスポート」を選択して、「すべてのコンテンツ」を選んで「エクスポートファイルをダウンロード」をクリック。

WordPress エクスポート

XMLファイルがダウンロードされれば、エクスポート完了だ。

2. ユーザーデータの移管

WordPressのエクスポート/インポートのツールでは、ユーザーデータの移管ができない。移管先に該当するユーザーが存在しない場合、新規にユーザーが作成されるか関連付けるユーザーを選択するという仕様になっている。もし移管先にユーザーデータを移動する必要がないのであれば、このステップはスキップしてしまって構わない。ただし、ユーザデータも併せて移管したい場合は、それ系のプラグインを探して利用するか、その部分のみDBダンプで移管する必要がある。

WordPressの公式インポートツールでは、データインポート時にインポート先のWordPressに同じユーザ(ユーザーIDと投稿名、メールアドレスが同じユーザー)がいれば、そのユーザーにデータを紐付け、いなければ新たにユーザーを作成しながらデータを移動する。複数ユーザがいるデータに対して、もし先にユーザーデータを移管せずに新規作成方式でデータインポートを行ってしまうと、移管先に作成されたユーザーのパスワードやプロフィールについて、また登録し直す運用が発生してしまう。特にパスワードは不可逆暗号化されてDBに保管されているため、再度個々のユーザに再設定してもらわないといけないため、コンシューマー・ユーザーを抱えているサイトでは、およそ現実的ではない。

──ということで、ユーザーデータはDBダンプ形式で移管を行うことになる。

まず、移管先のDBから、ユーザーテーブルとユーザーメタテーブルをダンプしておく(切り戻し用にCREATE TABLE文も含める)。これは、移管先にWordPressをインストールした時に作成されたルート管理者とテーブルそのものを補完するための作業だ。

これで、移管先DBのユーザーデータがバックアップされた。もしこの後、ユーザーデータ移管などに失敗した場合でも、状況を切り戻したい時には、このデータをインポートすればよい。

次に、移管元のDBからユーザーテーブルとユーザーメタテーブルをデータのみ、かつinsert-ignoreオプション付きでダンプする。insert-ignoreオプションがないと、インポート先に重複するユーザ(ルート管理者)がいるためにエラーになってしまうので、それを回避させる。

-t オプションはテーブルに含まれるデータのみをダンプするオプションだ。
mysqldump のすべてのオプションについては、下記のページにくわしくまとめられているので、ご参考まで。

mysqldumpの使い方 オプション編

そして、移管先のDBへ移管元DBのユーザーデータをインポートする。

これで、移管元のルート管理者以外のユーザーデータがインポートされる。もし、移管先にルートユーザー以外に重複ユーザー(ユーザーIDが同じユーザー)がいた場合は、上書きされないので、あぶれたユーザーについては別途手動で移管するか、インポートするダンプデータを開いて該当するユーザーのユーザーIDを重複しない値に変更してからインポートする等で対応できる。

3. 移管先のWordPressにインポートツールをインストール

WordPressにはインポートツールはバンドルされていないので、管理画面の「ツール」->「インポート」より「WordPress」のインポートプラグインをインストールする必要がある。

WordPress インポートツールインストール

一覧から「WordPress」をクリックするとプラグインダウンロード用のダイアログがポップアップするので、そこからダウンロードする。

4. インポートプラグインを有効化して、エクスポートファイルをアップロードする

インストールされたプラグインを有効化して、再度「ツール」->「インポート」より「WordPress」を選べばインポートツールが起動する。

WordPress インポート

ここから 1. の手順でエクスポートしたXMLファイルをアップロードするのだが、環境によってはアップロード最大サイズがXMLファイルより小さくてアップロードできないケースがある。というのも、PHPのデフォルト設定ではファイルアップロードに対して2MBまでというキャップが付いているので、その場合2MB以上のXMLファイルはアップロードできないのだ。

そんな場合は、PHPの設定を修正して2MB以上のファイルアップロードができるようにする。ついでにインポート処理には結構時間がかかるので、時間がかかり過ぎて処理がタイムアウトしないようにもしておけば不安がなくなる。
/etc/php.iniで修正してもよいのだが、そちらでやってしまうと設定の反映にOS再起動が必要だったり、実際にはインポートの時だけ一時的にキャップが外れればよいのに、継続的に有効化されてしまって後々不都合が出てきたりするので、.htaccessに設定を入れるのが実用的だ。

──ということで、.htaccessに下記のローカル設定を追加する。

インポートが終わったらコメントアウトしておくなりして、必要な時以外は無効化しておくと良いかと。

5. インポートの実行

エクスポートファイルがアップロードされると、各データに関連付けられているユーザーに対して、移管先のWordPressのどのユーザーにそれを割り当てるかという設定画面が表示されるので、ここで投稿者の割り当てを変更したり、必要であればユーザーを作成する等のカスタマイズが可能だ。

WordPress インポート実行

ユーザーが多いと、選択していくのも一苦労なのだが、すでに同名ユーザーが移管先に登録されていれば、ユーザー割り振りはしなくても、プラグインの方で自動で同一ユーザーにデータを割り振ってくれる。今回はすでにユーザーデータは移管済みなので、ユーザーの割り振りは何もすることなく、投稿に添付されている添付ファイルをインポートするかどうかだけを選んで、「実行」を押すだけでよい。

インポートデータの数にもよるが、インポートが完了するまでは結構時間がかかるので、完了メッセージが出力されるまで気長に待とう。

WordPress インポート結果

何気にメディアのインポートはすべて成功しないことがあるので、失敗したメディアについては後で手動で再登録するなり、移管元のアップロードディレクトリごと移管先に持ってくるのが確実である。

もし.htaccessを追記していた場合、最後に追加設定を無効化しておくことを忘れないように。

まとめ

WordPress間のデータ移管は公式のインポートツールを使うより、やはりDBダンプ型の方が簡単で確実性が高い。

もし、公式インポートツールプラグイン「WordPress Importer」でユーザーデータも同時に移管できれば、かなり使い勝手のよいツールになると思う。他に公式SVNに登録されているWordPressのコアデータをユーザーデータ含めてエクスポート/インポートするようなプラグインを探してみたが、どうも目ぼしいのが見つからなかった(たぶんあるとは思うのだが…)。

Leave a Reply

Your email address will not be published.