wordpressで、SQLite3からMySQLへ移行

シェアする

phpソースコード一式をコピーし、データベース移行すれば終わる予定でしたが、結構時間かかりハマりました。

(特に問題なくWebAppsで動作していたブログですが、実験用にIaaS VMへ引越させました)

引越前(PaaS)

Webサーバー Microsoft Azure WebApps

データベース sqlite3(wordpress sqlite integrationを利用)

引越後(IaaS)

OS Cent OS 7

Webサーバー Apache httpd、php5.6

データベースサーバー MySQL 5.6

1.新環境の準備

IaaSで準備した新環境に、移行先となるWordpressサイトおよびデータベースを作成します

1-1.通常の導入作業を実施

MySQLに、wordpressで利用するデータベース・ユーザーの作成と権限付与

日本語版Wordpress本体を導入し、初期インストールを実行

以前と同じプラグインを導入

以上で必要なテーブルが作成済みの状態となります

1-2.データベースのデータをすべて削除
$ mysql -uroot -p
mysql> use [wordpress用db名];
mysql> show tables;
mysql> delete from [wp_xxxxxx];
mysql> quit;

後で必要になるので、テーブルの一覧は控えておく

2.WebAppsから、新サーバーへサイトデータを移行

WebAppsのサーバーは、Windows IISベースの環境ですが、こちらからソース一式とSQLite3 データベースファイルをダウンロードします。そのまま、SFTPでコピーしてもいいのですがファイル数が多くて時間がかかるので1個のファイルへ固めてからダウンロードすることにしました。

2-1 Microsoft Azure Potal で、WebApps のコンソールを開く

2-2 コンソールを使い、tar.gz形式でまとめる
              _    _____   _ ___ ___ 
             /_\  |_  / | | | _ \ __| 
       _ ___/ _ \__/ /| |_| |   / _|___ _ _ 
     (___  /_/ \_\/___|\___/|_|_\___| _____) 
        (_______ _ _)         _ ______ _)_ _ 
               (______________ _ )   (___ _ _) 

Manage your web app environment by running common
commands ('mkdir', 'cd' to change directories, etc.)
This is a sandbox environment, so any commands
that require elevated privileges won't work.

D:\home\site\wwwroot

> cd ..

> tar zcvf wwwroot.tar.gz wwwroot/
2-3 サイトデータを、ローカルPCへダウンロードします

SFTPに対応したソフト(FileZilla等)で、先ほどのファイルをダウンロードします。

SFTPサーバー名、ログインするユーザー名、パスワードは、Azure Portalにて設定します

2-4.アップロード

IaaSで用意した新環境へ、SFTPでアップロードします。

ファイルを解凍し、適切なオーナーへ変更します。

# tar zxvf wwwroot.tar.gz
# chown -R apache.apache wwwroot/

3.データ移行

3-1.既存データベース(SQLLite3)ファイルをダンプ
# cd wwwroot/wp-content/database/
# sqlite3 .ht.sqlite .dump > sqlite3-dump.sql
3-2.ダンプファイルから、移行対象データのみを抽出

sqlite3-dump.sqlをエディタ等で開き、insert into 文以外(以下で始まる行)を削除。

また、新環境で作成されたテーブル以外へのINSERT INTO文も、削除。

PRAGMA
BEGIN TRANSACTION
COMMIT
CREATE
3-3. INSERT INTO文を、mysql用に変換

テーブル名をダブルクォーテーションではなく、バッククォートで括るように置換

変更前

INSERT INTO "wp_xxxxxxxx" VALUES('xxx','1234');

変更後

INSERT INTO `wp_xxxxxxxx` VALUES('xxx','1234');
 3-4. スクリプトの最初と最後におまじないを追加
SET sql_mode=`NO_BACKSLASH_ESCAPES';
SET FOREIGN_KEY_CHECKS = 0;
INSERT INTO `wp_xxxxxxxx` VALUES('xxx','1234');
SET FOREIGN_KEY_CHECKS = 1;
3-5. mysqlへデータ書き込み
 mysql -uroot -p [wordpress用db名] < sqlite3-dump-insertonly.sql

4.サービスイン

動作確認が終わったら、DNSのAレコード書き換えて終了

補足

MySQL Workbench に、SQLLiteからMySQLへインポートするウィザードがあり、利用してみたのですが失敗。

その他にもWeb上でいくつかdumpファイルを書き換えるスクリプトを見かけて試してみましたが、失敗。

結局、データベース作成に関するSQL文(DDL)周りを、SQLiteダンプから持ってくることを諦めた方が早いという話になってしまいました。残念