WordPress:「SQLite Integration(ja)」からMySQLに乗り換える方法

WordPress、SQLiteからMySQLへ移行します

WordPressをlolipopエコノミープランで構築する方法
Wordpressをlolipopエコノミープランで構築する方法についてのページです。 前提 私は、LOLIPOP!でサーバを借りたのですが、エコノミープランにしてしまいました。 LOLIPOP!でWordpress簡単インストールが...

上の記事にて記載の通り、私はロリポップ!エコノミープラン(DBが使えないけど100円)
長らくこのサイトを運営してきました。
さほどの不満はなかったし(ま~、ちょっと表示が重いかな?くらい)、安くていいね~と思っていたんですが…
ですが、ついに、DBが欲しくなってしまい…ほしくなってしまい!

あと、なんか久しぶりに見てみたら上のプラグイン配布停止されてるし!!?

というわけで、意を決して「SQLite Integration」から「MySQL」へ乗り換えることにしたのでした。

この決断で、サイト運営はまた次のphaseへ!という気持ちです。
というわけで手順をメモしておきます。
あまり完璧じゃないので後々直したいところもあるのですが、まあ、どなたかのなんかのとっかかりにでもなれば。

※参考にされる際はいろいろと自己責任でお願いいたします!!

乗り換え先はXSERVER

選択した乗り換え先はXSERVERのX10プラン(月額900円)。

XSERVER




今の契約(月100円)と比べてしまうと、だいぶ高いです…ですが、ここ、この値段でSSDなんですよ!
SSDなら安いでしょこれは…!

SSDとは?…
SSDはSolid State Drive(ソリッドステートドライブ)のことで、
メリットはとにかく「HDDと比べて、読み書きがはやい!!」ってことです!

ちなみにエックスサーバーのX10プランなら、DB(MySQL)は50個まで使えます。そんな使うか?笑
まあ、ドメインとっとけば50個ワードプレスが管理できるってことだよ!

また、今ならサーバー契約でドメイン1個無料(サーバー契約中ずっと無料)のようです!

JETBOY

【JETBOYレンタルサーバー】も選択肢に入れていたんですが、僅差でXSERVERにしてみました。こちらは、SSDでも低いプランが安い(290~)のが魅力的ですね!



LOLIPOP!

もちろん、LOLIPOP!でプランアップグレードだけするという手もあります!!


実際の移行方法

さて、移行先が決まったら移行方法です。
基本的には、DBとして扱ってきた「SQLite」のファイルを、「MySQL」にinsertできるよう変換していく感じになります。
参考にしたのはこちら:
困ったらみんなgitが教えてくれる。

GitHub - vwbusguy/sqlite-to-mysql: Script to convert and add sqlite3 database into a mysql/mariadb database
Script to convert and add sqlite3 database into a mysql/mariadb database - vwbusguy/sqlite-to-mysql

上記gitのページは英語なので、やり方を以下記載します。

※あと、書くのが面倒な割に需要はなさそうだなあと思ったので取り急ぎめっちゃざっくり書きます…

0.移行先に空のDBを作成しておく

私の場合はXSERVERです。
新しい空っぽのMysqlDBを一つ作っておいてください。

そのDBを新しいWordpress用のDBとします。「管理ユーザ名」と「パスワード」をのちのち使用します。

1.SQLiteからデータをdump・変換

今までデータを扱ってきたSQLiteのファイルから、データをdumpします。
で、「SQLite Integration」がDBとして保存していっているファイルはここにあります。

WordPressのディレクトリ/wp-content/database/.ht.sqlite

この「.ht.sqlite」がDBファイルです。

こいつを「sqlite3」コマンドが使える環境でdumpして変換します。

ちなみに私はXSERVERの直下のディレクトリにおいてSSHでログインし、実施しました。

git↓に移動して、ファイルをダウンロードしてください。
https://github.com/vwbusguy/sqlite-to-mysql
上記URLのページで、右の方の緑のところをクリックし、「download as ZIP」を選択します。
ZIPは解凍しておいてください。

この「sqlite3-to-mysql.py」の中身は、SQLiteからdumpしたファイルをMySQLに大体は合うように書き換えてくれているありがたーいpythonコードです。

※XSERVERで使用する場合、insert時にエラーが出たので一か所書き換えました。

エラー:「ERROR 1044 (42000) at line 3: Access denied for user~略
cp -pi sqlite3-to-mysql.py sqlite3-to-mysql.py.org
vi sqlite3-to-mysql.py
68行目
grant all on {d}.* to {u}@’localhost’ identified by ‘{p}’;

grant all on {d}.* to {u}@'[あなたのSQLサーバ名].xserver.jp’ identified by ‘{p}’;

 

dumpして変換していきます。

ようやく、dump→変換のコマンド例:

sqlite3 .ht.sqlite .dump |./sqlite3-to-mysql.py -u [空のDBの管理ユーザ名] -p [空のDBのパスワード] -d [空のDB名] > sqlite3tomysql2.dump

sqlite3tomysql2.dumpという変換後のダンプファイルができるかと思います。別の名前でも構いません。

ちなみに「sqlite3tomysql2.dump」はこのままでは使いません。

2.変換したデータをMySQLへinsertする

変換したデータを、用意したMySQLへinsertしていきます。
※ここで注意なのですが、そのままぶち込むと色々と問題というか、制約上のエラーが出てしまい…。

そのため、ざっくり以下のように対応しました。
さほど正攻法ではない気がする…。

①xserverの簡単Wordpressインストールで、空っぽのWordpressを作成し、使っているプラグインを入れていく。

②そのWordpressが作成したMySQLのdumpを作成する。

コマンド例:

mysqldump -h [サーバ名] -p [DB名] -u[管理ユーザ] -p[DBパスワード] > testdb.dump
※ややこしいのですが、-uの後はスペース等無しで管理ユーザ。二個目の-pの後はスペース等無しでパスワードです。
特に「-p」、スペースありだとDB名だと解釈され、スペースなしだとパスワードだと解釈されるらしい。ややこしくない??
③testdb.dumpからCREATE文を引っこ抜いて、sqlite3tomysql2.dumpを書き換える。
※SQLiteからdumpして作成したCREATE文だと、テーブル型などが大きく違ってしまっていたため。
シンプルに作った空っぽのWordpressからCREATE文を拝借することにしました。もっとうまいやり方があるかもしれぬ…
どのような差分かというと?
「wp_posts」テーブルの例
SQLiteから作ったやつ:
CREATE TABLE wp_posts (
ID integer NOT NULL PRIMARY KEY AUTO_INCREMENT ,
post_author integer NOT NULL default ‘0’,
post_date text NOT NULL default ‘0000-00-00 00:00:00’,
post_date_gmt text NOT NULL default ‘0000-00-00 00:00:00’,
post_content text NOT NULL,
post_title text NOT NULL,
post_excerpt text NOT NULL,
post_status text NOT NULL default ‘publish’,
comment_status text NOT NULL default ‘open’,
ping_status text NOT NULL default ‘open’,
post_password text NOT NULL default ”,
post_name text NOT NULL default ”,
to_ping text NOT NULL,
pinged text NOT NULL,
post_modified text NOT NULL default ‘0000-00-00 00:00:00’,
post_modified_gmt text NOT NULL default ‘0000-00-00 00:00:00’,
post_content_filtered text NOT NULL,
post_parent integer NOT NULL default ‘0’,
guid text NOT NULL default ”,
menu_order integer NOT NULL default ‘0’,
post_type text NOT NULL default ‘post’,
post_mime_type text NOT NULL default ”,
comment_count integer NOT NULL default ‘0’
);
MySQLで空のDBから参照したやつ:
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `wp_posts` (
`ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`post_author` bigint(20) unsigned NOT NULL DEFAULT ‘0’,
`post_date` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00’,
`post_date_gmt` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00’,
`post_content` longtext NOT NULL,
`post_title` text NOT NULL,
`post_excerpt` text NOT NULL,
`post_status` varchar(20) NOT NULL DEFAULT ‘publish’,
`comment_status` varchar(20) NOT NULL DEFAULT ‘open’,
`ping_status` varchar(20) NOT NULL DEFAULT ‘open’,
`post_password` varchar(255) NOT NULL DEFAULT ”,
`post_name` varchar(200) NOT NULL DEFAULT ”,
`to_ping` text NOT NULL,
`pinged` text NOT NULL,
`post_modified` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00’,
`post_modified_gmt` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00’,
`post_content_filtered` longtext NOT NULL,
`post_parent` bigint(20) unsigned NOT NULL DEFAULT ‘0’,
`guid` varchar(255) NOT NULL DEFAULT ”,
`menu_order` int(11) NOT NULL DEFAULT ‘0’,
`post_type` varchar(20) NOT NULL DEFAULT ‘post’,
`post_mime_type` varchar(100) NOT NULL DEFAULT ”,
`comment_count` bigint(20) NOT NULL DEFAULT ‘0’,
PRIMARY KEY (`ID`),
KEY `post_name` (`post_name`(191)),
KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),
KEY `post_parent` (`post_parent`),
KEY `post_author` (`post_author`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
まずいろいろな差分が見て取れると思うのですが(post_date がSQLiteだとTEXTで、MYSQLだとdatetimeであるとか)、これSQLiteからそのまま出したやつを使うと「TEXTにはdefault値は入らないよ」というエラーを吐きます。例ですが↓こういうの
ERROR 1101 (42000) at line 3: BLOB, TEXT, GEOMETRY or JSON column ‘user_registered’ can’t have a default value
まあ仕方ないですね。元はSQLiteなのですから…。MySQLのルールに沿わないテーブルもあったりするわけです。
色々。
ERROR 1170 (42000) at line 314678: BLOB/TEXT column ‘user_login’ used in key specification without a key length
なので、CREATE文はごっそりMySQLから拝借することにしたわけです。insert部分は直さなくて済んだので、まあwordpressの書き込み方はルールにのっとっていたのでしょう。MySQLで定義されたテーブルの型に合わない本文とかはなかった、ということです。
CREATE文は「/*!40101 SET @saved_cs_client = @@character_set_client */;」~「/*!40101 SET character_set_client = @saved_cs_client */;」までをワンセットとして拝借しました。
あと、SQLiteのdumpの最後の「CREATE INDEX ~~」は全部削除しました。
こーゆーのがたくさん出たからです。Duplicate(重複)ってことだから、多分テーブルのCREATE時にすでにインデックス作成してんじゃないか?(適当
ERROR 1061 (42000) at line 314828: Duplicate key name ‘user_login_key’
後なんかあった気がするけど、忘れてしまった…
さて上記変更を加えたら、いよいよインサートします。※XSERVERにsshログインした状態で実施しています。
インサート先は新しい空のDBなので、何も怖くないです。壊れたら削除して作り直せばいいし、ドーンと行きましょう。
mysql -h [sqlサーバ名] -p [DB名] -u[DB管理ユーザ名] -p[DBパスワード] –default-character-set=utf8 < sqlite3tomysql.dump
エラーが出たら、読み解いて直していってください…。

WordPressのファイルを全部持ってくる

サーバを引っ越す場合は全部持ってきてください。
私の場合は、XSERVERに「ワードプレス用に作ってあったディレクトリ」配下全部を持ってきました。
引っ越さない場合は、次の参照先の変更のみでOK

※この時点で独自ドメインの設定を直していない場合、XSERVERのURLを参照しても、元のサイトに飛んで行ってしまいます。ので、以下のカラムを仮URLにupdateすると仮環境で確認できます。最後はもちろん、元のURLに戻して運用します。

UPDATE wp_options SET option_value = ‘http://仮URL/wptest’ where option_name IN (‘home’,’siteurl’);

 

WordPressの参照先を変更する

「SQLite Integration」用に変更していた設定を、MySQL向けに変更します。

1.設定ファイルを書く

「SQLite Integration」を使っていた人は「wp-config.php」設定をしていないと思います。
以下の赤字を、新しくできたMySQLのそれぞれの設定に書き換えてください。

// ** MySQL settings – You can get this info from your web host ** //
/** The name of the database for WordPress */
define(‘DB_NAME’, ‘database_name_here‘);
/** MySQL database username */
define(‘DB_USER’, ‘username_here‘);
/** MySQL database password */
define(‘DB_PASSWORD’, ‘password_here‘);
/** MySQL hostname */
define(‘DB_HOST’, ‘localhost‘);
ちなみに、XSERVERは外部サーバからのDB接続を許可しておりません。残念ですね。

2.db.phpを退避しておく

ワードプレスのディレクトリに置いた「db.php」を退避します。これがあると読み込んじゃうかも。

ワードプレスのディレクトリ/wp-content/db.php → huyo_db.php

適当に名前変えればいいです。

 

これで、多分全部です。MySQLのDBに接続してうまくいってるか、手っ取り早く確認するには一つ記事を作成してみて、「/wp-content/database/.ht.sqlite」が更新されていないことを見るのがいいと思います。これが更新されてると、まだSQLiteを使っていますね…

まとめ

これで完了です!多分!
取り急ぎ見えてない記事は無い…と思う…多分…。
しかしこれ、伝わる人いるのか?もし需要がありそうならもちょっとブラッシュアップします;
しかし、引っ越してDBを変えて、表示が速くなった…!うれしい。
あと、この表示が速い環境でwordpressが増やし放題なのもうれしい。
まあそんな増やす予定はないですがw

というわけで、SQLiteをMySQLにしたし、さらにXSERVERに引っ越しました!

XSERVER

現在使用しているXSERVERです。
10日間の無料お試しがついて、月額900円(税抜)からフルSSDのサーバがレンタルできます!
WordPress最大10倍高速化&さらなるアクセス耐性強化と、大変お強いサーバです。
また、キャンペーン中なら独自ドメインが無料で一つついてくる♪

ヘテムル

有名な「ロリポップ!」の会社のオールSSDレンタルサーバー。
15日間の無料お試しがついて、月額800円(税抜)から契約できます!

mixhost

こちらもオールSSDのサーバ、mixhost。
10日間の無料お試しがついて、月額880円(税抜)からの契約です!

コメント

タイトルとURLをコピーしました