20 March 2009

MediaWikiでMySQL4から5に切り替えと、データの移行

MediaWikiで利用しているMySQLが、Version 4系からVersion 5系に上がったため、一旦データベースをクリアした後に、再構築することとなった。

なお、MediaWikiのインストールパスは、~/mw と仮定する。

事前準備
MediaWiki 1.14.0 および MySQL 4.0で正常に運用している状態で

MediaWiki付属のdumpBackup.phpを用いてデータベースのバックアップを行う。(MediaWikiルートディレクトリにDBサーバのユーザ名、パスワードを記したAdminSettings.phpを一時的に作成して作業すること)


[user@ ~] php ~/mw/maintenance/dumpBackup.php --full > ~/backup.xml

移行作業
MediaWiki 1.14.0 および MySQL 5.1で新たに運用開始する前提とする。
なお、別のサーバに新規でMediaWikiをセットアップして、データのみを移行してくる場合も、ここで説明する手法がそのまま使える。

MediaWikiで用いるデータベース構造の作成をまず行う必要があるため、設定ファイルを退避する。


[user@ ~] mv ~/mw/LocalSettings.php ~/LocalSettings.php.org

ブラウザよりMediaWikiを読み込ませると、セットアップのためのリンクが表示される。もしくは、~/config/ フォルダをブラウザより直接アクセスして、再セットアップを行う。

セットアップを行うことで、必要なテーブルが全て作成される

退避しておいたLocalSettings.phpの内容を、新たに作られた LocalSettings.phpに(必要箇所を)マージする。(拡張機能など)

MetaWikiで配布されているXml2sqlを用いて、dumpBackup.phpで作成されたXMLデータを、SQLコマンドスクリプトに変換する。

まず、ツールのコンパイル。なお、パッチファイルの適用でエラーが出る場合は、741行目辺りに手動で2行パッチを当ててやれば良い。


[user@ ~] wget ftp://ftp.tietew.jp/pub/wikipedia/xml2sql-0.5.tar.gz
[user@ ~] tar xvf xml2sql-0.5.tar.gz
[user@ ~] cd xml2sql-0.5
[user@xml2sql-0.5] patch < patchfile.txt ← 配布されているパッチを適用すること
[user@xml2sql-0.5] ./configure
[user@xml2sql-0.5] make

XMLをSQLに変換する。(page.sql, text.sql, revision.sql の3つのファイルが作成される)


[user@ ~] xml2sql-0.5/xml2sql -m backup.xml

バイナリを破壊せずに編集できるテキストエディタで (私はemacsを使用した) 、テーブル名をプレフィックスが付いたものに書き換える。例えば、

page.sql

-- xml2sql - MediaWiki XML to SQL converter
-- Table page for MySQL

/*!40000 ALTER TABLE `pfix_page` DISABLE KEYS */;
LOCK TABLES `pfix_page` WRITE;
INSERT INTO `pfix_page` VALUES (1,0,'メインページ','',0,0,0,0.34359867591410875,'20090224140516',110,1440),
(2,12,'目次','',0,0,0,0.83194796973839402,'20090224140558',111,802),

~ 途中略 ~

(49,0,'サンドボックス','',0,0,1,0.57942601107060909,'20090317112322',138,70);
UNLOCK TABLES;
/*!40000 ALTER TABLE `pfix_page` ENABLE KEYS */;

このように、赤で示したところだけを書き換える。

MySQLで、該当テーブルを空にする。(-pパスワード は間にスペースを挟まないで入力)


[user@ ~] mysql -h サーバ名 -u ユーザ名 -pパスワード DB名

mysql> truncate table pfix_page;
mysql> truncate table pfix_text;
mysql> truncate table pfix_revision;

mysql> quit;

データを全て読み込ませる


[user@ ~] mysql -h サーバ名 -u ユーザ名 -pパスワード DB名 < page.sql
[user@ ~] mysql -h サーバ名 -u ユーザ名 -pパスワード DB名 < text.sql
[user@ ~] mysql -h サーバ名 -u ユーザ名 -pパスワード DB名 < revision.sql

さらに、interwikiのキーワードを追加したり変更したりしている場合、pfix_interwiki テーブルのデータを移行する必要がある。MediaWikiのバージョンでテーブル構造が若干違うので、手動でコピーする必要がある場合もある。


[user@ ~] mysql -h サーバ名 -u ユーザ名 -pパスワード DB名

mysql> insert into mw_interwiki (iw_prefix,iw_url,iw_local,iw_trans) values ('w','http://ja.wikipedia.org/wiki/$1',0,0);

Query OK, 1 row affected, 2 warnings (0.17 sec)

ここまでで一通りの作業が終了する。


MediaWikiデータのバックアップとリストア
MySQLのバージョンや、テーブル構造(文字コードも含めて)が同一の場合は、次の方法でも移行できる。(平素のバックアップも、この方法で行っておけば良いと思われる)

MediaWiki 1.14 および MySQL 5.1 が正常に稼働しているシステムで

バックアップを行う


[user@ ~] mysqldump -Q --host=サーバ名 --user=ユーザ名 --password=パスワード --default-character-set=binary DB名 > backup.sql

端末とサーバの間の文字コード不一致によって、MySQLの文字コード自動変換が働き、UTF-8の文字列が7ビットで切り落とされてしまう不具合に対処するため、『 --default-character-set=binary 』 オプションを付けている。

リストアを行う


[user@ ~] mysql -h サーバ名 -u ユーザ名 -pパスワード DB名 < backup.sql

エラーが出る例 1 : mysqldump で xml ダンプした場合

mysqldumpで作成したXMLファイルをインポートするときに、次のようなエラーが発生して読み込み不可能になる。(バックアップとリストアを続けて書いているが、その間にDBを全削除しないとエラーになるのはお分かりの通り)


[user@ ~] mysqldump -Q --host=サーバ名 --user=ユーザ名 --password=パスワード --default-character-set=binary --xml DB名 > backup.sql

[user@ ~] mysql -h サーバ名 -u ユーザ名 -pパスワード DB名 < backup.xml

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '

めんどくさいので、原因追及していない。

エラーが出る例 2 : importDump.php を利用してインポートする場合

Xml2sqlではなく、MediaWiki付属の importDump.php を用いると、記事中の不等号記号 『 < や > 』 が削除されることがある。特に、 <pre> や <source> や <includeonly> などが軒並み不等号記号(>や<)の削除で、ページの体裁が崩れまくることになる。

また、importDump.php はものすごく遅いので、全然お薦めできない。