色々と右往左往してなかなか解決しなかったのですが、漸く解決しましたのでご報告を。
最初に回答を書いておきます。
1.SQLite2からSQLite3へデータベースを変換
>sqlite old.db .dump | sqlite3 new.db
これはgoogle検索で「sqlite2 sqlite3 変換」などと検索するとTOPに出てくる
colspan氏のblogにも出ていますね。参考にさせていただきました。感謝。
2.SQLite3のデータベースをdump
>sqlite3 new.db .dump > new.dump
3.dumpしたSQL文を整形
・TRANSACTION文、COMMIT文、CREATE TABLE文、CREATE INDEX文を削除
・INSERT文を微調整
→管理画面をカスタマイズしていたりすると微妙に列が増えていたりするので
増えた分を削ってMT上で作り直すなりテーブルを作り直すなりしてください。
また、INSERT文のテーブル名が二重引用符で囲まれているので
エディタなりsedなりでさくっと二重引用符なしに置き換えてください。
INSERT INTO "mt_entry" ... →INSERT INTO mt_entry ...
私はSQLite3が吐き出したCREATE TABLE文と
MySQLのshow create table (table_name)を突き合わせて、
SQLite3上のmt_categoryにのみcategory_order_numberが
あることを発見しました。
なのでINSERT文からこれに該当するフィールドを削除しちゃいました
(後で作り直お願いします)。
これでとりあえず移行完了です。
今回の罠 SQLite2であったこと
まあ古いサーバではそのまま入っていたりするのでしょうか。弊社が用意したわけじゃないんでなんともいえないところですが。
最早SQLiteのページでもtarballをダウンロードできないというのに。csvレポジトリからは取得できるようですが。
そしてこれは森本がTry&Errorしていましたが、SQLite2を使っているMT4をバックアップ→MySQLのMT4に復元というのもダメっぽいです。ブラウザが「Request URI is too Large」なるエラーを吐いて二進も三進も行かなくなります。どんなURIを吐いてるんだ。
というわけでMovableTypeで、ということに限定して言うとSQLite2→MySQLへの直接移行はできないと思った方がよさそうです。SQLite3を経由したほうが苦労もないでしょう。
あと、テスト用サーバにはSQLite3が入っていたのですが、上にも書いたようにSQLiteのページでもcsvからでしかSQLite2のソースが取得できないんですね。最初は「ああ、もうSQLite2は手に入らないのか」と早合点してました。
……いや、結局googleさんに聞いてSQLite2のtarballが落っこちてるところを探してもらったんですけどね。
これも森本が探してきたのですが、koichiro氏の「暮らしの業」
にあったsqlite2mysql.rb。対象はSQLite3ですが駄目元でSQLite2のdumpを食わせてみましたが、やっぱりダメでした。まあそれぞれが吐いたdumpを眺めてれば大分構造が違うなーと解るのでこれは当然ですね。あ、SQLite3で吐いたdumpはゴキゲンに食べてくれました。
そんなこんなで無事SQLite2からMySQLに移行したMT4は軽快に動作しております。
めでたしめでたし。
http://blog.flatbit.co.jp/btlog/mt-tb.cgi/109
Comments
まだコメントはありません。よろしければコメントをどうぞ。
Post Your Comment