Python MySQLdb MyIsam等待表元数据锁定

时间:2013-04-10 10:55:59

标签: python mysql mariadb

我在Debian Squeezy上使用1.2.2 MySQLdb和Python 2.6.6以及MariaDB 5.5.30。 所有表都使用MyIsam引擎。

我的代码是将一些数据写入临时表,然后将其插入永久表中并在此之后截断temp。所以,临时表是某种缓冲区。

有时(经常,但并非总是)它会在截断时冻结。 MySQL命令行客户端显示它正在等待表元数据锁定。没有其他进程可能会锁定表。

MariaDB [torgi]> show processlist;
+-----+------+-----------+-------+---------+------+---------------------------------+------------------------------+----------+
| Id  | User | Host      | db    | Command | Time | State                           | Info                         | Progress |
+-----+------+-----------+-------+---------+------+---------------------------------+------------------------------+----------+
| 194 | root | localhost | torgi | Sleep   |   29 |                                 | NULL                         |    0.000 |
| 195 | root | localhost | torgi | Query   |   29 | Waiting for table metadata lock | TRUNCATE `notifications_new` |    0.000 |
| 196 | root | localhost | torgi | Query   |    0 | NULL                            | show processlist             |    0.000 |
+-----+------+-----------+-------+---------+------+---------------------------------+------------------------------+----------+
3 rows in set (0.00 sec)

我试图打开自动提交,手动提交或刷新表(请参阅注释行)。都没有帮助。

以下是代码:

def upt(table, con) :
    #con.autocommit(True)
    cur = con.cursor()
    cur.execute('REPLACE INTO `'+table+suffix+'` select * from `'+table+tmp_suffix+'`;')
    #cur.execute('FLUSH tables;')
    #con.commit()
    cur.execute('TRUNCATE `'+table+tmp_suffix+'`;') # Freeze here!

那么,为什么它会被锁定以及如何修复它?

0 个答案:

没有答案