とある理由でWordPressサイトの移行を試すことになったのでまとめ.
とある理由というのは,自分の運営しているサイトに不具合があったため.
とりあえず別環境に移行して動作確認してみるかということで移行するに至りました.
結論として別環境では正常に動きすぐにアクセスできるようになりました.その後なぜ不具合が起きていたかの原因もわかり一件落着.
せっかくなので,僭越ながら移行手順をまとめて見ました.
手順
手順が多く見えますが,細かく分けていたり必須でない事項も含まれていたり,どちらか一つで良いかもしれないところを両方やっていたりするだけです.
やることは簡単なので軽い気持ちでご覧ください.
-
今までWordPressを動かしていたディレクトリバックアップ(tarでアーカイブ化,gzipで圧縮)
-
今までWordPressで使っていたデータベースのバックアップ(mysqldumpコマンド)
-
新たに別環境用意
-
新環境のmysqlにデータベースをインポート
-
新環境のベースディレクトリに1.のWordPressディレクトリを配置
-
(MySQLのユーザ名やパスワード等が異なる場合,)wp-config.phpの修正
-
(IP or ドメインが変化する場合,)データベース内のIP・ドメインの変更
-
(IP or ドメインが変化する場合,)wp-cliを利用してその他のIP・ドメインも変更
-
(プラグインの更新で問題が発生する場合,)FTP関係の設定
-
(トップページにはアクセスできるが記事にアクセスできない場合,)その辺の設定←解決できず
1~5は必須です.6~9は必要がある場合に限ります.
1.WordPressディレクトリのバックアップ
まずは既存環境のWordPressのファイル群のバックアップを取ります.
WordPressがインストールされているディレクトリ(/xxx/yyy/wordpress/とかでしょうか.wp-*というファイルやディレクトリがあるところです)を全てコピーすれば良いです.今回はtarコマンドでwordpressディレクトリをアーカイブ化しつつgzipで圧縮します.要はファイル群まとめて圧縮!ってことですね.
1 |
$ tar cfvz ./blog.bak.dir.tar.gz /xxx/yyy/wordpress |
blog.bak.dir.tar.gzというファイルに圧縮します.もちろんファイル名は何でもよくて,hogehoge.tar.gzのように.tar.gzを末尾につければhogehogeの部分は何でもよいと思います.
追記) 上記のコマンドだと,tar: Exiting with failure status due to previous errors のようなエラーが出ることがあるようです.上記の誤りは,コマンドのオプションの組み合わせにあります.tarコマンドでfオプションは出力ファイル名の指定を意味します.すなわち,fの直後にはファイル名が来なければいけません.従って,gzipの圧縮コマンド等と組み合わせて使う際は以下の順番が正しい順番になります.
1 |
$ tar cvzf ./blog.bak.dir.tar.gz /xxx/yyy/wordpress |
2.データベースのバックアップ
次にデータベースのバックアップを取ります.WordPressは記事の文章やらプラグインの設定など全てデータベース内に保存しています.WordPressで使用しているデータベースはMySQLなのでそれを前提にバックアップを取ります.プラグインを用いる方法など様々あると思いますが,今回はコマンドで取ります.
1 2 |
$ mysqldump --add-drop-table -h ホスト名 -u ユーザ名 -p データベース名 | bzip2 -c > blog.bak.sql.bz2 Enter password: (パスワードを入力する) |
何をやってるかと言いますと,まずmysqldumpを行うと,指定したデータベース内の情報のcreate文及びinsert文が生成されます.つまり,
mysqldump -h ホスト名 -u ユーザ名 -p データベース名
とすることで,指定のホスト名(-h)の指定のユーザ名(-u)でパスワード入力して(-p)でログインして指定のデータベース名(文の最後に書いてるやつ)の全テーブルのデータを取ってきて,create文やinsert文を生成します.
ここで,–add-drop-tableというオプションを付けると,create文の前にdrop文を付与してくれます.つまり本来なら,wp_usermetaテーブルを作り直す部分では,CREATE TABLE wp_usermeta
… だけが作られるところを,DROP TABLE IF EXISTS wp_usermeta
; CREATE TABLE wp_usermeta
…と作ってくれるんですね.何が良いかと言いますと,移行先のデータベース内に同じ名前のテーブルが既に存在していたら,それを削除してテーブルを作ってくれます.つまり上書きできるのです.ですから,まず上記のコマンドを実行することで,移行先でデータベースを復元するためのバックアップを作ることができます.
上記のやつはファイルではなくターミナルに出力されてしまうので,リダイレクト(>でファイルに出力)する必要があります.しかしその前に圧縮をかけましょう.今回私はbzip2を使って圧縮しますが,もし大量のデータになることが見込まれるようでしたらgzipを使ったほうが良いと思います.参考にしたサイトでも容量が大きくなる場合はgzipを推奨していました(データ容量が大きい場合,bzipでは圧縮は比較的早いが解凍に時間がかかるとか).それがbzip2 -cの部分になります.
最後に > blog.bak.sql.bz2 とすることで,blog.bak.sql.bz2という名前のファイルに出力し,晴れてバックアップが取れたというわけです.もちろんこのファイル名も何でもよくて,hogehoge.bz2のhogehogeは何でも良いのです.
3.別環境の用意
私の場合は,既に別環境でsandbox的なWordPressを使っていたので,それを置き換えるような形になりました.
ちなみに以降はCentOS環境→Ubuntuでしたが特に問題なく移行できました.
4.MySQLにデータベースをインポート
新環境のMySQLでデータを復元します(インポートという表現が正しいのかよくわからない).バックアップはmysqldumpを使いましたが,復元する場合は普通にmysqlコマンドでできます.以下のようにします.
1 2 |
$ bzip2 -d blog.bak.sql.bz2 $ mysql -u root -p データベース名 < blog.bak.sql |
まず,bzip2コマンドでバックアップファイルを解凍します.その後,データベース名を指定して復元を行います.データベース名は旧環境で使っていたもの,あるいは新環境で使う予定のものにすれば良いと思います.
5.WordPressの配置
WordPressのディレクトリを配置します.1.でバックアップを取った,blog.bak.dir.tar.gzを解凍して,適切な位置に配置します.
1 2 |
$ tar xvzf blog.bak.dir.tar.gz $ sudo mv wordpress /xxx/yyy/ |
場所によってはsudoが無いとPermission的にエラーになります.mvコマンドのwordpressが,解凍して出てきたディレクトリ(つまり圧縮前のディレクトリの名前)で,/xxx/yyy/が配置したい場所になります.
以上で移行は終了で,問題が無ければ普通にアクセスできます.しかし,場合によっては以下の処理をしなければ正常に動作しないことがあります.
6.(MySQLのユーザ名やパスワード等が旧環境と新環境で異なる場合,)wp-config.phpの修正
MySQLのユーザ名やパスワード等が旧環境と新環境で異なる場合,wp-config.phpの設定は旧環境のものになっており正常に動作しません.
処置は簡単で,wp-config.php内のmysqlのユーザ名やらパスワードやら使用するデータベース名が書かれている部分を新環境のものに書き換えればOKです.
7.(IP or ドメインが旧環境と新環境で異なる場合,)データベース内のIP・ドメインを書き換える
この手順は8.をやれば一緒に行われる可能性があるため,先に8.を試すべきかもしれません.
8.wp-cliを利用してその他のIP・ドメインも変更
データベース内のIP・ドメインを新環境のものに変更します.具体的には,wp-cliという,WordPressをコマンドラインから操作できるツールを使います.
search-replaceを使うことで,文字列置換を行うことができるので,これを使って旧urlを新urlに書き換えます.
1 |
$ wp search-replace '旧url' '新url' --path=WordPressを配置しているところ --skip-columns=guid |
追記)
Search-Replace-DB-masterというツールを使う方法もあるみたい.これだとWebUIで操作できるのでGUIの方がよいという方には向いているかも.使い方はこちらのサイト参照.
9.(プラグイン更新でエラーが出る場合,)FTP関連の設定
FTPのホスト名やユーザ名やパスワードを確認する画面が出てくる場合があります.今回はwp-config.phpの末尾に,以下を書き込むことでFTPの情報の確認をスキップしました.
1 |
define('FS_METHOD','direct'); |
さらに,権限の問題でプラグインのディレクトリ生成や旧バージョンの削除が行えない場合があります.その場合はwordpressを配置したディレクトリに以下を適用します.
1 |
$ chown -R apache:apache ディレクトリ名 |
apache:apacheの部分は,apacheを起動しているユーザを指定してください.apacheという名前でない可能性もあります.名前は以下のコマンドで確認できます.
1 |
$ ps aux | grep apache |
ps auxでサーバ上で動いてるプロセスを全て表示してgrepでapacheに絞ってます.引っかからない場合はgrepする文字列を変えてみると良いと思います.
10.(トップページにはアクセスできるが記事にアクセスできない場合,)パーマリンク設定や.htaccessを見直す←未解決
お恥ずかしいですが解決できてません.
この問題が起きた場合,パーマリンク設定をデフォルトにしてしまうことで解決はできます.
パーマリンク設定をデフォルト以外で使いたい場合,パーマリンク設定を再度適用すれば(設定完了的なボタンを押せば)大抵の場合は直るようなのですが,私の環境では上手くいきませんでした..htaccessも正しく記述されていたようでしたので原因がわからず.取り急ぎローカルでは設定をデフォルトにして運用しています.
本問題においては個別に参考サイトを以下に示します.
- WordPress(ワードプレス) 移行での不具合事例:トップページ以外表示されない
- WordPressサイトのサーバ移行でつまづいた点まとめ
- 【WordPress】サーバー移転時に記事・アーカイブページが表示されないトラブル対処方法