About 3 years ago, I introduced Review Board into our team with a great help from RB group and replaced CodeStrike. We deployed RB on a WinXP VM and the backend database is sqlite. I can’t remember the reason. Maybe I just wanted to save some time. Actually, it has spent a lot of time of our team.
Why? Because sqlite is a lightweight DB and it have bad performace in concurrency scenario. For our team, we have about 20 developers and RB is the most popular daily tools. Now we have to say, we highly depend it to control the quality of team’s code.
Recently, the dababase issue was getting worse. RB pages can’t be created well and there are many warnings/errors on it. And yesterday, the database was dead finally-“The database is locked!”. That’s a message from Django. I googled and the best solution is to use better database to avoid such issues in future.
I took about 3 hours to migrate database to MySQL 5.1. Maybe my experience can help you to save some time.
Step 1. sqlite bump
Go to sqlite.com and download a command line. For window version, you can find it here.
Unzip it and use command to dump sqlite database.
c:\sqlite3.exe reviewboard.db .dump > reviewboard_sqlite_dump
reviewboard.db is the database file of sqlite.
Step 2. Convert to MySQL dump
Now we have the sqlite dump file. But you can’t import it into a MySQL database directly. Because some syntax is not supported by MySQL.
I googled and got a free converter to do that. You can find it here and download sqlite3_mysql.zip.
In the deep of the zip , you can find a executable file – sqlite_mysql.exe. Run it and convert the sqlite dump file to a MySQL one.
Step 3. Import MySQL dump
Before that, please create a database in your MySQL database.
mysql -uroot -p reviewboard < mysql_dump
In my case, the dump is about 180M and I waited very long time. (And there may be some warning messages. I don’t know why but for now the migrated server works well. So maybe we can’t ignore them.)
Step 3.1 Alter database structure
Actually, this issue was found when I finished Step 4 and restarted RB. At the beginning, RB worked well. But a minute later, a guy said he could’t submit any comments.
The root cause was the “id” field of some tables lost the property of “AUTO_INCREMENT”. I didn’t know why and SQL in dump file was right. Then I write a very simple .py script to fix this issue.
sql="alter table %s change id id int not null auto_increment"
tables = """
tableNames = tables.splitlines()
for name in tableNames:
print 'Change table %s...' % name
command = 'mysql -uroot -proot reviewboard -e "%s"' % (sql % name)
I just went through all tables and alter the property of “id” field if the table has one.
Step 4. Change RB configuration file
Change rb_site_root/conf/settings_local.py to:
DATABASE_ENGINE = 'mysql'
DATABASE_NAME = 'reviewboard'
DATABASE_USER = 'root'
DATABASE_PASSWORD = 'xxxxxxxxx'
# comment the former setting
#DATABASE_ENGINE = 'sqlite3'
#DATABASE_NAME = 'C:\\review-board\\rbsite2\\db\\reviewboard.db'
Make sure MySQLdb is installed or there will be error when restart RB.
The best moment came finally! RB restarted successfully and all review request/comment/diff were there. And the performance was improved. You can feel the page is loaded fast. Cheers!
If you have the same problem with me, I hope this post can help and save some time.