Whenever people search for a Python library for MySQL, they get directed to MySQL for Python. However, there are some nasties hidden in it. Searching for “mysql python memory leaks” results in a few links which suggest that using Unicode causes memory leaks with the library.
Today, however, I found another cause for MySQLdb memory leaks, while debugging a leaky Python daemon at work — database errors.
Use this script:
import MySQLdb
options = {
"user": "user",
"passwd": "p455",
"db": "somedb",
"connect_timeout": 1
}
while True:
try:
MySQLdb.connect(**options)
except MySQLdb.Error:
pass
Make sure MySQL is up and it’s possible to connect to it without failures using the above credentials. Then run this script and watch its memory usage. It’ll be rock steady for as long as you care to run it.
Now stop mysqld
or do anything that would cause errors during connection and rerun the script. Watch it gobble up meg after meg as the errors continue. Any MySQL error, like unreachable server, missing database or tables, malformed query, etc. would trigger the leak.
I need to check if the recently released (13 days ago) MySQLdb 1.2.3 does better in this regard. MySQLdb 1.2.3 does fix the memory leak in this case.