WordPressのお引越し
WrodPressを使っていると、いずれそのWrodPressの環境をごっそり別サーバーへお引越しさせなければならない状況にぶち当たる。それは開発環境で構築した環境を元に本番環境を作るためにごっそり開発環境のコピーを本番環境へ持っていくときであり、又はその逆で本番環境をごっそりコピーして新しいテスト環境を作るときであるかもしれない。VirtualBoxでローカルに検証Webサーバーを持っておくととても便利だ。(VirtualBoxで作る検証環境シリーズ)そんな時、WordPressではディレクトリをtarで固めてごっそり持っていき、バックアップしたMySQLのDB(ドラゴンボールではない)をリストアすることで簡単に環境のお引越しができる。最近のバージョンであればWebサーバーの公開ディレクトリに前の環境のtarを展開して、wp-config.phpを環境に合わせて書き換えればとりあえずはアクセスできるようになるだろう。しかしそれでは、DBのwp_optionsテーブルに格納された各種設定値や、投稿の本文で張ったサイト内リンクなどに旧ドメインが残ってしまっていたりする。思いがけずいろんなところにドメインがべた書きされているのである。そんな旧ドメインと新ドメインの一括変換の作業は幾度となく繰り返されるが、繰り返されるスパンが長いため前回やった作業を忘れてしまっており、覚えていれば一発なのにと思うことしきりなので、ここに記しておくことにした。サイトが軌道に乗りホスティングサービスのドメインから独自ドメインのサーバーへ移転する巣立ちのときや、単にもっと短くセンスのいいドメインに変更したいときにも役に立つ場面あるかもしれない。httpsに対応した時にも使えるだろう。このブログはそういう備忘録の役割もあったのだが最近こまめに書くのをさぼっていた。それで発生した冗長的作業によって失われた時間があれば、豚の角煮を何回煮ることができただろうか。豚の角煮はとてもうまい。しかしとても時間のかかる料理だ。隙あらば煮たい。そのための時間の確保は人生における重要課題の一つだ。備忘録を書く手間より書かなかったことによってかかる手間のほうが大きいのだ。よってこれからはしょうもないことでもちょくちょくブログに上げていこうと思う。
元サーバーでWordpressのバックアップ
WrodPressのDBは定期的にバックアップしておくと安心だ。容量の関係で泣く泣く削除しなければならない過去記事があったとしても、DBのバックアップとしてとっておけばいつでもリストアできるという安心感を以てバッサリと本番環境から削除してしまうことが可能だ。ホスティングサービス上のサーバー容量は有料で有限だが、ローカル環境ならば潤沢なストレージが安価にそろえられる。RaidでミラーリングされたNASを自宅に2台用意して冗長化しておけば、よほどのことが無ければデータが全て失われることはない。ということで個人のWordPressによるブログでもDBのバックアップを取るスクリプトを夜中にCronで回して3世代くらいとっとけばいいんじゃないだろうか。下のコマンドで移行元サーバー上のDBをバックアップする。
$
$ mysqldump -u DBユーザー名 -pパスワード -h DBサーバのIP DB名 | gzip > ./dbdump_DB名_`date +%Y%m%d-%H%M%S`.gz
$
$ tar -zcf ./wordpress.tar.gz ./wordpress
$
これで、dbdump_DB名_YYYYMMDD-HHMMSS.gzというファイル名でDBのバックアップが取れた。ついでにwordpressのインストールディレクトリをtar.gzで固めてみた。これを移行先のサーバーへ持って行って展開していく。ドメイン変更のみの場合はこの手順をすっ飛ばしてDBの中身をいじるところまで読み飛ばしてほしい。
移行先サーバーでのリストア
ここからは移行先サーバーでの作業となる。まずは、移行先サーバーでwordpressディレクトリをWebサーバーの公開ディレクトリに展開。その後、ここでは割愛するがwp-config.phpを編集する。
$
$ gzip -dc ./wordpress.tar.gz | tar xf -
$
次に、MySQLのコマンドラインに入ってリストアするための空っぽのDBを作る。
$
$ mysql -u ユーザー名 -p
Enter password:
mysql> create database DB名;
作ったDBに、持ってきたDBのバックアップをリストアしてみる。
$
$ gzip -d ./dbdump_DB名_YYYYmmDD-HHMMSS.gz
$
$ mysql -u DBユーザー -p DB名 < ./dbdump_DB名_YYYYmmDD-HHMMSS
これで、移転元サーバーと同じ環境が移転先サーバーで出来上がった。移転してもドメインに変更がない場合、これでうまく動くと思われる。移転元と移転先でURLに変更がある場合、次の手順へ進む。
DB値の置換対象の確認
移転元サーバーから持ってきたデータの展開が終わったので、wp-config.phpを編集してDBの中身をいじっていく。wp-config.phpの変更箇所はファイルの中を見ればわかると思うので割愛し、DBの中身を更新するのだが何を更新するかというと公開したサーバーのドメインを旧ドメインから新ドメインへ置換する。DBのすべてのテーブルに検索をかけるのは面倒だが、phpMyadminからDBを指定してすべてのテーブルを指定して検索すると、DB内のすべてのテーブルに一遍に検索をかけることができる。しかもGUIで検索結果を表にしてくれるのでとても見やすい。
“検索する単語”に旧ドメインを指定して、”検索するテーブル”で”全選択”をクリックしたのちに、実行ボタンをクリックする。これでDB内の全テーブルに一遍に検索がかかる。便利。
これで、どのテーブルに旧ドメインを含んだデータがあるかわかった。
テーブルはわかるが、どのカラムにあるかまではわからないので、表示をクリックして中身を確認してみるといい。
DB値の置換
そんなこんなで、置換すべきデータの位置が分かったのでMySQLのコマンドラインに入ってUPDATEをかけていく。だいたい、こんな感じになると思う。リプレイス関数を使うと、値の置換ができる。旧ドメインが”http://old-domain.unko”、新ドメインが”https://new_domain.chinko”であるとするとこんな感じ。
$
$ mysql -u ユーザー名 -p
Enter password:
mysql> use DB名;
Database changed
mysql>
mysql> update wp_options set option_value=replace(option_value,"http://old-domain.unko","https://new_domain.chinko");
mysql> update wp_posts set post_content=replace(post_content,"http://old-domain.unko","https://new_domain.chinko");
mysql> update wp_posts set guid=replace(guid,"http://old-domain.unko","https://new_domain.chinko");
mysql> update wp_posts set pinged=replace(pinged,"http://old-domain.unko","https://new_domain.chinko");
mysql> update wp_usermeta set meta_value=replace(meta_value,"http://old-domain.unko","https://new_domain.chinko");
mysql> update wp_yoast_seo_links set url=replace(url,"http://old-domain.unko","https://new_domain.chinko");
mysql> update wp_comments set comment_content=replace(comment_content,"http://old-domain.unko","https://new_domain.chinko");
mysql>
テーブル”wp_yoast_seo_links”は、Yoast SEOというお行儀の悪いプラグインが勝手に作ったテーブルなのでこのプラグインを入れていなければ無い。これでめでたく移行完了だ。再度phpmyadminから検索してみると旧ドメインではヒットがないことが確認できるだろう。
ちょちょいのちょい
やってることは単純だが、入れているプラグインやWordPressのバージョンによって更新すべきテーブルやカラムが変わってくるのでなかなかスクリプト書いて自動化とかやりにくいのでめんどくさい。自分でやるのめんどくさい!無理!という方はお問い合わせフォームからご依頼いただければ、お安く請け負っているのでお問い合わせいただきたい。これで次回からはこれを見ながらスムーズに作業できそうだ。WordPressのサーバー移行をなさる方の健闘を祈る。