Python mysqldb错误关闭连接

8

我在关闭连接时遇到了问题,具体如下:

   database = 'sed_database'   
   conn = MySQLdb.Connect(host='remote_host', user='default',
                          passwd='pass', db=database)    
   try:
      try:
         cursor = conn.cursor()
         cursor.execute(sql_str)
         results = cursor.fetchall()
      except MySQLdb.Error, e:
         print "MySQL/Server Error using query: %s" % sql_str
         print "Using database: %s" % database
         raise e
   finally:
      if cursor:
         cursor.close()
      if conn:
         conn.close()

这将会得到:
 Traceback (most recent call last):
  File "trass.py", line 579, in ?
    main(sys.argv)
  File "trass.py", line 555, in main
    old_rows, changes_list = auto_analyse_test(f, args.build, args.quiet, args.debug)
  File "trass.py", line 352, in auto_analyse_test
    last_analysed_build = get_sed_baseline_ref(test_file_name, old_delivery_stream)
  File "trass.py", line 151, in get_sed_baseline_ref
    results = execute_sql_query(sql, delivery_stream)
  File "trass.py", line 197, in execute_sql_query
    passwd='pass', db=database)
  File "C:\Python24\Lib\site-packages\MySQLdb\__init__.py", line 75, in Connect
    return Connection(*args, **kwargs)
  File "C:\Python24\Lib\site-packages\MySQLdb\connections.py", line 164, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
_mysql_exceptions.InternalError: (3, "Error writing file 'D:\\MySQL_Datafiles\\Logfiles\\query.
log' (Errcode: 9)")

Python的MySQLDB库信息如下:

>>> print MySQLdb.get_client_info()
4.1.18
>>> print MySQLdb.__version__
1.2.1_p2
>>> print MySQLdb.__revision__
410

奇怪的是:
  • 我已经在服务器上检查了 query.log 并且它已存在,并由其他进程写入。
  • 这段代码可以运行多次,但在某个特定项目上会失败。
  • 通过 SQLyog 运行相同的查询正常并返回四条结果。

服务器 error.log 显示 "Aborted connection... (Got an error reading comminication packets)"。

虽然 Traceback 看起来显示错误与连接创建相关联,但直到关闭连接(或函数结束,默认关闭)才会出现此错误。我尝试在打开和关闭之间添加额外的输出或暂停。每次异常都会发生在关闭时。所以什么原因会导致关闭连接时出现此错误?


1
那个错误似乎出现在创建连接的代码中,而不是您展示的代码中。完整的堆栈跟踪是什么,显示了您的代码所做的调用? - mmmmmm
MySQL进程是否具有对query.log的写入权限? - gitaarik
@rednaw,我也这么认为。对于其他传入的查询似乎是有效的。 - James Bradbury
1
你能检查一下 MySQL 的错误日志吗?里面可能会有一些额外的信息。https://dev.mysql.com/doc/refman/5.1/en/error-log.html - gitaarik
1
请指定您正在使用的mysql库,确切的版本以及是否连接到本地或远程主机。 - Dima Tisnek
显示剩余20条评论
1个回答

3
这是我目前找到的内容。
看起来错误是在打开连接时触发的,即在粘贴代码的第二行MySQLdb.Connect(...)处,而不是关闭连接时触发。
完整的回溯如下:
  • ...
  • execute_sql_query [op]
  • MySQLdb Connect [op]
  • MySQLdb super(...) [op]
  • _mysql.c ConnectionObject_Initialize [较低级别的python模块,用C编写]
  • libmysql mysql_real_connect或mysql_options [可能是前者]
  • 失败,异常被设置
让我们解码这个异常。
InternalError:
    (3,
     "Error writing file 'D:\\MySQL_Datafiles\\Logfiles\\query.log'
                         (Errcode: 9)")
  • "3" 旧版mysql mysys_err.h EE_WRITE 3
  • "query.log",这是本地还是远程日志文件?看起来是windows路径。
  • "Errorcode: 9" 假设是windows(上述),那么就是ERROR_INVALID_BLOCK "存储控制块地址无效"。非常神秘,但是可以检查一下该文件是否存在,是否可写,并且是否可能受到日志轮换或类似操作的影响。检查磁盘空间,为了保险起见,也可以进行磁盘检查。

看起来是客户端错误。请检查您的客户端my.cnf[client]部分。

给定MySQLdb版本的源代码


感谢分析...query.log 存储在 Windows 服务器上,大小约为 4GB,没有只读状态或其他限制,并且最后一次写入是一个月前。在同一目录下,error.log 每天都会被写入。 - James Bradbury
最后一次写入是一个月前,这很可疑。也许文件系统限制文件大小为4GB(FAT32)。 - Dima Tisnek
请检查客户端是否尝试写入此名称的文件,但无法写入,例如因为给定的文件夹不存在。 - Dima Tisnek
我将query.log重命名并创建了一个新的空query.log,但是我仍然收到相同的错误。 - James Bradbury
我认为确定这个错误是在客户端还是服务器上发生非常关键。你可以使用wireshark/tcpdump检查数据传输,或者使用process monitor/windbg logger.exe/straceNT/xperf/usch-poc来确定客户端尝试访问哪些文件。 - Dima Tisnek
我很感激你的建议,但我不认为这解决了问题。 - James Bradbury

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接