Edgewall Software

MySQL and the MySQLdb Python bindings for MySQL

It is somewhat supported by Trac since 0.10, but there are some limitations (see #KnownIssues). Use this only if you don't have other choice, and be warned that there can be many issues, in particular related to the unicode support and the repository cache support. Some users are nevertheless using MySQL successfully, so it might work for you. The primary supported backends though are PostgreSQL and SQLite.

Starting with 0.10 Trac can use MySQL for its DatabaseBackend, but consider using at least 0.10.4, 0.10.5dev or 0.11dev.

Requirements

MySQL

In order to avoid several issues with unicode and international characters throughout Trac (e.g., international characters turning into question marks with mysterious "Incorrect string value" errors logged), we strongly advise MySQL users to only use databases having the utf8 character set and the utf8_general_ci collation type. However, changing collation to utf8 makes MySQL fail in 4.1.x and 5.0.x versions on MyISAM table type, because some Trac tables indexes become "too big". This will be (hopefully) addressed in 0.10.4. As a workaround it has been recommended to use InnoDB tables instead of MyISAM where this limitation is absent.

Such databases can be created with the MySQL monitor, like that:

CREATE DATABASE trac DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 

XXX: I think the above advice on collations is wrong - using a case-insensitive collation does not sound right, and when I used the above command, the indexing process failed when it came to insert a revision which included changes to files with names differing only in case. Recreating the db using the utf8_bin collation allowed things to work as expected.

See also: #4378, where someone stated the opposite (i.e. that setting the collation mode to utf8_bin was not enough... Maybe this depends on the type of tables used. Anyway, there's a patch on #4378 that should solve that issue in all cases.

utf8_general_ci is required because MySQL-Python uses the collation to figure out if it is being passed binary or text. See bug 1693363

To check character set settings for your database, issue command:

mysql> USE trac;
Database changed
mysql> SHOW VARIABLES LIKE '%character%';
+--------------------------+--------------------
| Variable_name            | Value
+--------------------------+--------------------
| character_set_client     | cp1251
| character_set_connection | cp1251
| character_set_database   | utf8
| character_set_filesystem | binary
| character_set_results    | cp1251
| character_set_server     | utf8
| character_set_system     | utf8
| character_sets_dir       | C:\DevServer\Instal
+--------------------------+--------------------
8 rows in set (0.00 sec)
mysql>

See also #3884.

Usually, you also want to create a user and give this user access to the database created above:

CREATE USER tracuser IDENTIFIED BY 'password';
GRANT ALL ON trac.* TO tracuser;

The connection string will then be:

mysql://tracuser:password@localhost/trac

MySQLdb

The recommended version is MySQL-python 1.2.2.

See http://cheeseshop.python.org/pypi/MySQL-python/1.2.2, which contains links to the .tar.gz source distribution as well as pre-built Windows eggs.

Older versions can be found at the mysql-python sourceforge project:

  • MySQL-python 1.2.1_p2 was the previously recommended version
  • MySQL-python 1.2.0-3.2.2, MySQL-python 1.2.2b2) were reported to have issues (see #3645).
  • MySQL-python-1.2.2b2 was reported to solve an AttributeError: 'array.array' object has no attribute 'startswith' error seen when viewing a changeset... These problems ought to be fixed in 1.2.2b3; if they are not, or if you have other issues, please file a bug in the MySQL-python Bug Tracker.

Known Issues

Still Opened

milestone 0.10.4

#3723
Problems with database encoding

milestone 0.10.5

#5120
mysql_backend should parse parameters

milestone 0.11.1

#4347
postgres connection limit exceeded

milestone 0.12

#4378
MySQL structure case insensitive causes collision with file names
#3676
MySQL: Primary keys are not well designed
#4990
release 0.10.4 with MySQL utf8 enforcement
#6823
trac crashing under mysql, w/ fix
#6986
MySQL schema changes for performance

milestone 1.0

#5556
server "crash", restart, then cannot view tickets

milestone 2.0

#5255
Trac resource leak?

milestone None

#6237
InterfaceError: (0, '') after idle period with mod_wsgi 1.1/Apache 2.2.3
#6554
trac-admin allows to init environment with errors

Typical Problems

milestone None

#3182
Error when adding or viewing a ticket using MySQL
#4437
install error (mysql)
#3857
Encoding problem with mysql
#4528
TypeError: unhashable type when installing trac-0.10.3 with mysql
#5012
'module' object has no attribute 'connect'

(corresponding custom query)

Conversion

While a more robust method may be created for 0.10.4 to allow easy conversion from SQLite to MySQL, users have reported success with the following method.