Python MySQL在优化表后暂停
当我运行Python MySQL在优化表后暂停,python,mysql,Python,Mysql,当我运行optimizetable fooMySQL时,该查询似乎会暂停 > show full processlist; | 798 | root | localhost | turbo | Query | 1 | Waiting for table metadata lock | optimize table foo | 没有其他正在运行的查询。服务器版本为5.5.54 复制: 创建如下表: 创建一个python脚本,如: 在MySQL shell中执行如下查询
optimizetable foo
MySQL时,该查询似乎会暂停
> show full processlist;
| 798 | root | localhost | turbo | Query | 1 | Waiting for table metadata lock | optimize table foo |
没有其他正在运行的查询。服务器版本为5.5.54
复制:
创建如下表:
创建一个python脚本,如:
在MySQL shell中执行如下查询:
另一个贝壳
此查询永远不会完成。在MySQL、Python、Debian等的旧版本上没有问题——所以这可能是某个地方的错误,或者我因为API的更改而错过了什么
编辑:
当执行带有联接的表的查询并且连接保持打开时,这似乎是一个错误。
此外,此错误并非每次都会发生-重新启动python脚本在大多数情况下可能会产生此行为
问候
Coyer从1.2.0开始,MySQLdb默认禁用自动提交 因此,通过在创建连接后添加
dbc.autocommit(True)
似乎可以解决这个问题-无论如何,提交select查询是没有意义的即使在MyISAM表上(根本不支持事务)
我假设这是MySQLdb中的一个错误,因为我无法在其他语言中复制类似的行为-而且这种行为不是每次都可以复制的。从1.2.0开始,MySQLdb默认禁用自动提交 因此,通过在创建连接后添加
dbc.autocommit(True)
似乎可以解决这个问题-无论如何,提交select查询是没有意义的即使在MyISAM表上(根本不支持事务)
我假设这是MySQLdb中的一个bug,因为我无法在其他语言中重现类似的行为-而且这种行为不是每次都可以重现的。刚刚发现,在获取数据后添加
dbc.commit()
,每次都可以正常工作。愚蠢的,因为没有必要做出选择。。。还有MyISAM和autocommit。刚刚发现在获取数据后添加dbc.commit()。愚蠢的,因为没有必要做出选择。。。还有MyISAM和自动提交。
CREATE TABLE `foo` (
`bar` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
CREATE TABLE `bar` (
`faz` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
# -*- coding: utf-8 -*-
import MySQLdb, time
dbc = MySQLdb.connect(db="turbo", host="localhost", user="", passwd="")
crsr = dbc.cursor(MySQLdb.cursors.DictCursor)
crsr.execute("select count(*) from foo left join bar on bar.faz=foo.bar")
print crsr.fetchall()
# keep connection open
while(1):
time.sleep(1)
mysql> optimize table foo;
mysql> show processlist;
+-----+------+-----------+-------+---------+------+---------------------------------+--------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------+-----------+-------+---------+------+---------------------------------+--------------------+
| 236 | root | localhost | turbo | Query | 230 | Waiting for table metadata lock | optimize table foo |
| 308 | root | localhost | turbo | Sleep | 232 | | NULL |
| 309 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+-----+------+-----------+-------+---------+------+---------------------------------+--------------------+
3 rows in set (0.00 sec)