WordPressサーバをCPIからクラウド環境へ移設

##CPIからのサーバデータ移設
CPIからサーバデータを移設するうえで、クラウドサーバと違う大きな特徴は**SSH接続でコマンド実行できない**ことでしょう。※SSH接続に対応しているプランもあります。
SSH接続できないレンタルプランの場合、以下のような制約が発生します。

 - ファイルを移行するのにFTPでしか接続できない
 - DBデータへのアクセスはphpMyAdminに限られる

WordPressのサーバデータ移設時に必要な、ファイルデータとDBデータの移行の方法と注意点について記述します。

###ファイルデータ
SSH接続ができないレンタルプランでも、FTPによる接続が許可されています。
移行先がクラウドサーバーの場合、移行方法として**lftp コマンド**を使うことができます。

WordPressのファイルデータの移行をするためには、レンタルサーバ上のドキュメントルートを移行先のドキュメントルートと同期すれば良いです。
例えばCPIのGシリーズ,2007シリーズ、Xシリーズの場合、httpのドキュメントルートは `/http`、httpsのドキュメントルートは `/secure` です。移行元のレンタルサーバのドキュメントルートを確認しておきましょう。

では、lftp による移行の方法を以下にご紹介します。


####lftp による移行方法
#####インタラクティブモードの場合
移行先のサーバから、インタラクティブモードでlftpを起動して移行元に接続します。

```
# lftp
lftp :~> open username@***.***.***.***
Password:
```
隠しファイルも含めて同期するように設定

```
:~> set ftp:list-options -a
```
例えば移行元のドキュメントルートが`/html`、移行先のドキュメントルートが`/var/www/html`の場合は
以下のように実行します。

```
:/html> mirror -a -n /html/ /var/www/html/
```

mirror に`-a`のオプションを付けると、owner, group, パーミッション を保存したまま同期します（ --allow-chown --allow-suid --no-umask と同じ）。

`-n`(--only-newer) は新しいファイル・ディレクトリだけを対象に同期するオプションです。
初めて実行する際は不要ですが、再実行する際に新しいものだけを持っていくことができます。
なお（CPIに限った話ではありませんが）、移行先で wp_config.php を更新している場合、
**同期を再実行する際に wp_config.php を上書きしてしまわないように** 注意してください。
`-n` オプションはその防止策にもなりますが、移行先のwp_config.phpの方が新しい場合にしか有効でないので、
必要に応じて退避するか、`-x(--exclude)` オプションで明示的に除外を指定しておいてもよいでしょう。

#####一気に実行する場合
以下のコマンドで、上記のインタラクティブモードで行ったことを一気に実行することができます。

```
lftp -u username,password ***.***.***.*** -e 'set ftp:list-options -a; mirror -a -n /html/ /var/www/html/'
```

####所有者の変更
CPI側の所有者がftpになっていることがあるので、ownerとgroupを移行先の環境に合わせて変更します。ドキュメントルートが`/var/www/html`の場合は以下のように実行します。

```
# chown -R apache.apache /var/www/html/
```

###DBデータ
CPIの共用レンタルサーバ上のDBデータにアクセスするには、ウェブのコントロールパネルからphpMyAdminを起動します。

CPIは複数のMySQLバージョンに対応していることがありますが、
それぞれに複数のDBが設置可能です。移行対象のデータベースを確認しておきましょう。
例えばあるプランではMySQL4.0と5.0に対応しており、管理画面を開くとそれぞれ別のphpMyAdminが表示されます。

<img width="226" alt="Screenshot-2017-11-16 コントロールパネル.png" src="https://qiita-image-store.s3.amazonaws.com/0/105824/a647357b-527d-777a-71d8-a91fb44b8802.png">

####エクスポート
phpMyAdminを開いたら、WordPressのデータベースを開いてテーブルをエクスポートをします。（データベースのエクスポートでもOK。）
<img width="588" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/105824/a287fbe7-1e33-aba3-26d5-69b202e79f2e.png">

エクスポートする時は、サイトデータの大きさによって**全データエクスポートされないことがある**ので、注意してください。（CPIの注意点というよりphpMyAdminの注意点ですが…）
エクスポートに失敗したとエラーメッセージが出る場合はまだいいのですが、エラーメッセージが出ないこともあるので、全件が移行できたかどうか必ず確認する必要があります。
確認方法は、
　①出力されたSQLが全テーブル分出力されているか確認する
　②レコード数を控えておいて移行先の件数と比較する
などが考えられます。
<img width="526" alt="キャプチャ4.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/105824/d94f2c21-801c-c7ac-64b1-9fc6164cd8a6.png">

全件エクスポートできていない場合の対応策としては、
　①圧縮形式を変えてみる
　②テーブル毎に小分けにしてエクスポートする
など、工夫してみてください。
ちなみに、私は「gzip形式」でエクスポートした時はテーブル4つ分しか出力できなかったのですが、
「bzip形式」にしてみたところ全件無事に出力することができました。

####インポート
次は、ローカルにダウンロードされたDBデータを移行先でインポートします。
移行先にphpMyAdminがインストールされている場合は、もちろんphpMyAdminでインポートすることも可能ですが、ファイルサイズによってはうまくインポートされない場合もあるので、直接サーバにファイルを送ってmysqlコマンドで取り込んだ方が無難かもしれません。
phpMyAdminでエクスポートしたデータは、MySQLでエクスポートしたデータと同じように取り込むことができます。

ローカルPC（Windows）からLinuxサーバにファイルを転送する方法は、例えばTeraTermを使って、こんな感じで送れます。↓
 [参考：TeraTermで効率良くファイル転送](https://qiita.com/go-to/items/409e32116213bdf4b1ce)

#####移行先サーバのDBを準備
WordPress用のデータベースとユーザー作成します。移行元と同じにする場合は、あらかじめ移行元のwp_config.phpファイルなどで確認しておきましょう。

```
# mysql -u root -p
Enter password: 

mysql> create database wp_db;
Query OK, 1 row affected (0.04 sec)

mysql> grant all privileges on wp_db.* to wp_user@localhost identified by 'wp_password';
Query OK, 0 rows affected (0.06 sec)
```
#####転送したデータをインポート

```
# mysql -u root -p wp_db < ??????.sql
```
#####wp_config.phpを修正
上記で設定したWordPress用のデータベース・ユーザー、パスワードなどが移行元と異なる場合は変更します。
また、移行元のCPIサーバは **代替ポート番号が指定されている** 事が多いため、移行先のMySQL のポート番号に合わせてDB_HOST 値を変更します。 
デフォルトの3306 番ポートを使う場合は、DB_HOST 値の `:3307`などと指定されている部分を`:3306`とするか、削除すれば大丈夫です。

```
/** WordPress のためのデータベース名 */
define('DB_NAME', 'wp_db');

/** MySQL データベースのユーザー名 */
define('DB_USER', 'wp_user');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'wp_password');

/** MySQL のホスト名 */
define('DB_HOST', '127.0.0.1');
```