通过python连接时,如何更改默认的Mysql连接超时?


70

我使用python连接到mysql数据库con = _mysql.connect('localhost', 'dell-pc', '', 'test') 。我编写的程序需要大量时间才能完全执行,即大约需要10个小时。实际上,我正在尝试从语料库中读取不同的词。读取完成后,出现超时错误。

我检查了Mysql默认超时是:

+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| connect_timeout            | 10       |
| delayed_insert_timeout     | 300      |
| innodb_lock_wait_timeout   | 50       |
| innodb_rollback_on_timeout | OFF      |
| interactive_timeout        | 28800    |
| lock_wait_timeout          | 31536000 |
| net_read_timeout           | 30       |
| net_write_timeout          | 60       |
| slave_net_timeout          | 3600     |
| wait_timeout               | 28800    |
+----------------------------+----------+

如何更改默认超时?


25
顺便说一句,对于那些想知道如何创建上表的人,请执行以下查询-SHOW VARIABLES LIKE'%timeout';
阿伦·桑迪

Answers:


72

做:

con.query('SET GLOBAL connect_timeout=28800')
con.query('SET GLOBAL interactive_timeout=28800')
con.query('SET GLOBAL wait_timeout=28800')

参数含义(取自Navigator中的MySQL Workbench:实例>选项文件>选项卡“网络”>“超时设置”部分)

  • connect_timeout:mysqld服务器等待连接数据包的秒数,然后以“错误的握手”响应
  • Interactive_timeout服务器在关闭交互式连接之前等待其活动的秒数
  • wait_timeout服务器在关闭连接之前等待连接活动的秒数

顺便说一句:28800秒是8个小时,因此对于10个小时的执行时间,这些值实际上应该更高。


3
是否gobal会影响除当前连接外所有连接到db的连接?
zhkzyth

3
很高兴知道这三个之间的区别,或者至少有一个指向文档的链接。
jlh

1
@zhkzyth我有一个类似的问题。这可能会有所帮助:stackoverflow.com/questions/4440336/mysql-wait-timeout看起来SET GLOBAL会将变量设置为所有活动的连接和将来的连接,直到下一台服务器重新启动为止。但是SET SESSION,似乎有一个设置特定于当前会话的变量。还有dev.mysql.com/doc/refman/5.6/en/set-variable.html以获得更多信息。
诺曼·布鲁

@jlh这可能有助于了解这三个设置之间的区别。dev.mysql.com/doc/refman/5.6/en/server-system-variables.html
Norman Breau

我将删除global,所以它只会影响当前会话,通常您没有特权使用global
David Lemon

57

你在MySQL配置文件(选项更改默认值connect_timeoutmysqld的部分) -

[mysqld]
connect_timeout=100

如果您无法访问此文件,则可以使用以下语句设置此值-

SET GLOBAL connect_timeout=100;

请注意,如果您使用config file方法,则mysql客户端可能无法反映更改,但是您的脚本会!看到我的帖子:stackoverflow.com/questions/9004400/…–
BuvinJ

2
@dfrankow所有值均以秒为单位。
simonwo

16

我知道这是一个古老的问题,但仅作记录,也可以通过将适当的连接选项作为_mysql.connect调用的参数传递来完成。例如,

con = _mysql.connect(host='localhost', user='dell-pc', passwd='', db='test',
          connect_timeout=1000)

注意关键字参数的使用(主机,密码等)。它们提高了代码的可读性。

有关可以传递给的不同参数的详细信息_mysql.connect,请参见MySQLdb API文档。


5

对于长时间运行的查询,MAX_EXECUTION_TIME也是一个重要参数。它将在MySQL 5.7或更高版本中使用。

检查当前值

SELECT @@GLOBAL.MAX_EXECUTION_TIME, @@SESSION.MAX_EXECUTION_TIME;

然后根据您的需要进行设置。

SET SESSION MAX_EXECUTION_TIME=2000;
SET GLOBAL MAX_EXECUTION_TIME=2000;

当您有另一个查询要运行时如何处理?con.execute(SELECT @@SESSION.MAX_EXECUTION_TIME; SET SESSION MAX_EXECUTION_TIME=2000; SELECT * FROM test)?
CutePoison

3
请注意,如果该值0那么这是指没有启用超时:dev.mysql.com/doc/refman/8.0/en/...
约书亚品特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.