I got a MediaWiki instance up & running with MySQL as its database backend. Now, I wanted to play around with this wiki in a VM running Fedora 16. Let's prepare the VM for running MediaWiki:
$ yum install httpd php links mediawiki mediawiki-Cite
$ grep ^Alias /etc/httpd/conf.d/mediawiki.conf
Alias /wiki/skins /usr/share/mediawiki/skins
$ cp -a /var/www/wiki/ /var/www/html/
$ systemctl enable httpd.service
$ systemctl start httpd.service
Note that we did
not install a MySQL server here: I did not want to run yet another service in this small virtual machine.
After that, the MediaWiki instance can be accessed & setup via
http://fedora.local/wiki/
- be sure to choose
SQLite for the database backend.
Now MediaWiki is up & running with an
empty SQLite database. But how can I
convert my original MySQL database into SQLite?
There's
mysql2sqlite, a shell script using
mysqldump and
awk to do the job. And it
did the job pretty well so far:
mysql2sqlite.sh -u admin -p mw_wiki > wiki.sqlite.raw
I could pipe the whole thing through
sqlite
already but I had to alter the output a bit: my original database had
$wgDBprefix set to
"mw_"
but somehow this parameter seems to be ignored when an SQLite database is used. So let's cut out the prefix from our preliminary dump whenever a table is created, indexed or inserted
1) into:
sed -e '/[INDEX|INTO|TABLE] \"mw_/s/mw_//g' -i wiki.sqlite.raw
Now we can generate our SQLite database as simple as:
sqlite wiki.sqlite < wiki.sqlite.raw
Point
$wgDBname to this filename and off we go: the wiki should now be up & running with the original data visible. Yay ;-)
Great, but we could not update pages or create new articles
2):
INSERT INTO text (old_id,old_text,old_flags) VALUES (NULL,...
Database returned error "19: text.old_id may not be NULL".
Hm, shouldn't
old_id
be
set to
AUTOINCREMENT? Let's look at our
wiki.sqlite.raw
again:
CREATE TABLE "text" (
"old_id" int(10) NOT NULL ,
"old_text" mediumblob NOT NULL,
"old_flags" tinyblob NOT NULL,
PRIMARY KEY ("old_id")
);
Again: this is the output of
mysql2sqlite
and it looks pretty sane to me. But somehow
old_id
wasn't set to
PRIMARY KEY
(aka
"AUTOINCREMENT"
) when parsed by
sqlite
(v3.7.7.1). When the
"PRIMARY KEY"
is moved right before the
"NOT NULL"
statement for
old_id
, it still would not recognize it. We also had to replace the
"int(10)"
with
INTEGER
and remove the superfluous space on the same line. Now it reads:
CREATE TABLE "text" (
"old_id" INTEGER PRIMARY KEY NOT NULL,
"old_text" mediumblob NOT NULL,
"old_flags" tinyblob NOT NULL
);
We have to modify all (19) occurences of
PRIMARY KEY
in our
wiki.sqlite.raw
. Be sure to
omit the
INTEGER
keyword when the field is declared
varbinary
.
With all that in order now,
wiki.sqlite.raw
can be fed into
sqlite
again. FWIW, this is what
sqlite
makes of the statement above:
$ sqlite3 data/wikidb.sqlite
sqlite> .schema text
CREATE TABLE text (
old_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
old_text BLOB NOT NULL,
old_flags BLOB NOT NULL
);
Now we should be able to update pages and create articles. Phew, what a ride :-)
Update: Right after finishing this article, I came across
this knowledge base article on how to do this with scripts provided by the MediaWiki installation. In short:
$ php maintenance/dumpBackup.php --full --uploads --conf `pwd`/LocalSettings.php > wiki.xml
Then, in the VM again:
$ cd /var/www/html/wiki
$ php /usr/share/mediawiki/maintenance/importDump.php wiki.xml
$ php /usr/share/mediawiki/maintenance/rebuildrecentchanges.php
This takes quite a lot of time - around 7 minutes for a 13MB
.xml
dump. The resulting was written into the configured
$wgDBname
, or
data/wiki.sqlite
in our case. All pages were in place, only the
MainPage was overwritten with its initial version. Going back one version with the
page history revealed the most current version of the (imported) article.
1) Is this really the correct statement? It works, but I thought it should use () instead of [] for the OR statement.2) We had to set $wgShowExceptionDetails, $wgShowSQLErrors, $wgDebugDumpSql to true for this to be shown.