Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python MySQL在优化表后暂停_Python_Mysql - Fatal编程技术网

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)