Random thoughts on technology, cycling and the outdoors.

29 Aug 2019

Mysql to Sqlite3

This guide is for users wishing to migrate their WriteFreely instance from a SQL database to SQLite3. The steps involved can be used for any similar migration.


The reason I decided to move my database was that I run it as a single user instance for myself only. I don’t have thousands of posts, nor will I, and I am interested in running a few other services on the same little server. Most of them use or support PostgreSQL, while WriteFreely currently supports SQL or SQLite3. I don’t really want to run more than one database instance if I don’t have to.

Dump Your DB

We will start by dumping the existing SQL database. Then make a copy of that to work on, this way you have a backup if some issue comes up.

On the existing server run as root: mysqldump --complete-insert=TRUE --extended=insert=FALSE --all-databases > dump.sql.

Then copy that down to your local machine: scp hostname:/path/to/dump.sql ..

The copy on the server will remain as a backup, do not overwrite it.

Create the New DB

WriteFreely comes with schema files for both supported databases. The command syntax is sqlite3 new-database.extension < sqlite.sql.

On your local machine run: sqlite3 writefreely.sqlite3 < sqlite.sql.

Convert the Dump

MySQL and SQLite are not perfectly cross compatible, so a little script to convert the dump is required.

I tried to do this myself using sed, vim and even vscode with no luck.

I found an awesome script at https://github.com/dumblob/mysql2sqlite which worked perfect.

On your local machine, assuming a nix based system, curl https://raw.githubusercontent.com/dumblob/mysql2sqlite/master/mysql2sqlite. Then make it executable chmod +x mysql2sqlite.

Populate the Database

mysql2sqlite dump.sql | sqlite3 writefreely.sqlite3. You may get a few warnings, I did but they seemed not to affect the resulting database.

Change Your Server Over

Copy the new database file up scp writefreely.sqlite3 hostname:/path/to/writefreely/..

Then log in to your server and as root:

  • Edit your config file to use sqlite3
type     = sqlite3
filename = writefreely.sqlite3
  • You can leave the other database settings as a backup until you confirm it is working.
  • Restart your writefreely instance, i.e. systemctl restart writefreely.service.
  • Check for errors with journalctl -f -u writefreely

That’s it, if all went well you can stop and uninstall mysql. Also, fun fact, the first half of this post survived the migration.