【问题标题】:mysql server gone away (error #2006)mysql 服务器消失(错误 #2006)
【发布时间】:2012-02-25 07:56:04
【问题描述】:

在 apache 2.2.9/Debian 上通过 wsgi 运行 Django 1.3,并使用 mysql 5.0.51a 我在部署的 django 安装和我们运行的两个开发服务器中都遇到了以下问题,使用 2 个数据库。

对于每个用户,某个函数会导致 2006: server has gone away 错误。 在事情开始出错之前调用的倒数第二个函数位于线程中,例如:

 t = threading.Thread(target = logic.report,
                     args = [proj_info, userdata]
                     )
 t.setDaemon(True)
 t.start()

这是在 GUI(django 网站)继续可用时在后台发生的事情。这是几十次顺利的事情,今天下午却失败了。

Django 返回的错误(通过浏览器,当然我忘了打开该选项卡以获取更多信息)指出在 14:15:18 发生了一些事情,所以这里是一些 mysql.log

120202 14:15:18    3449 Connect     beta@localhost on beta2db
           3449 Query       SET NAMES utf8
           3449 Query       set autocommit=0
           3449 Query       SELECT `auth_user`.`id`, `auth_user`.`username`, `auth_user`.`first_name`, `auth_user`.`last_name`, `auth_user`.`email`, `auth_user`.`password`, `auth_user`.`is_staff`, `auth_user`.`is_active`, `auth_user`.`is_superuser`, `auth_user`.`last_login`, `auth_user`.`date_joined` FROM `auth_user` WHERE `auth_user`.`id` = 3
           3449 Query       SELECT `insight_test_run`.`id`, `insight_test_run`.`rawfile`, `insight_test_run`.`koekfile`, `insight_test_run`.`measure_date`, `insight_test_run`.`test_id`, `insight_test_run`.`subject_id`, `insight_test_run`.`quality` FROM `insight_test_run` WHERE `insight_test_run`.`id` = 514
           3449 Query       SELECT `insight_project`.`id`, `insight_project`.`client`, `insight_project`.`description`, `insight_project`.`directory` FROM `insight_project` INNER JOIN `insight_project_test_run` ON (`insight_project`.`id` = `insight_project_test_run`.`project_id`) WHERE `insight_project_test_run`.`test_run_id` = 514
           3449 Query       SELECT `auth_user`.`id`, `auth_user`.`username`, `auth_user`.`first_name`, `auth_user`.`last_name`, `auth_user`.`email`, `auth_user`.`password`, `auth_user`.`is_staff`, `auth_user`.`is_active`, `auth_user`.`is_superuser`, `auth_user`.`last_login`, `auth_user`.`date_joined` FROM `auth_user` INNER JOIN `insight_project_user` ON (`auth_user`.`id` = `insight_project_user`.`user_id`) WHERE `insight_project_user`.`project_id` = 6
           3449 Query       SELECT `django_content_type`.`app_label`, `auth_permission`.`codename` FROM `auth_permission` INNER JOIN `auth_group_permissions` ON (`auth_permission`.`id` = `auth_group_permissions`.`permission_id`) INNER JOIN `auth_group` ON (`auth_group_permissions`.`group_id` = `auth_group`.`id`) INNER JOIN `auth_user_groups` ON (`auth_group`.`id` = `auth_user_groups`.`group_id`) INNER JOIN `django_content_type` ON (`auth_permission`.`content_type_id` = `django_content_type`.`id`) WHERE `auth_user_groups`.`user_id` = 3
           3449 Query       rollback
           3449 Query       SELECT `insight_subject`.`id`, `insight_subject`.`name`, `insight_subject`.`nice_name`, `insight_subject`.`handedness`, `insight_subject`.`birthday`, `insight_subject`.`gender`, `insight_subject`.`education`, `insight_subject`.`eyecorrection`, `insight_subject`.`extra` FROM `insight_subject` WHERE `insight_subject`.`id` = 10000456
           3449 Query       SELECT `insight_test`.`id`, `insight_test`.`description`, `insight_test`.`level_id`, `insight_test`.`name` FROM `insight_test` WHERE `insight_test`.`id` = 1
           3449 Query       SELECT `insight_test_level`.`id`, `insight_test_level`.`description`, `insight_test_level`.`official_name` FROM `insight_test_level` WHERE `insight_test_level`.`id` = 1
           3449 Quit     

这里有一点 apache 日志(/var/log/apache2/error.log):

[Thu Feb 02 14:17:00 2012] [error] Exception in thread Thread-2:
[Thu Feb 02 14:17:00 2012] [error] Traceback (most recent call last):
[Thu Feb 02 14:17:00 2012] [error]   File "/usr/local/lib/python2.7/threading.py", line 530, in __bootstrap_inner
[Thu Feb 02 14:17:00 2012] [error]     self.run()
[Thu Feb 02 14:17:00 2012] [error]   File "/usr/local/lib/python2.7/threading.py", line 483, in run
[Thu Feb 02 14:17:00 2012] [error]     self.__target(*self.__args, **self.__kwargs)
[Thu Feb 02 14:17:00 2012] [error]   File "/usr/local/www/wsgi-scripts/portal/ovl_webinterface/insight/logic.py", line 50, in report
[Thu Feb 02 14:17:00 2012] [error]     reportfile = ovl.report.make_report(django_test_run_id = j, img = trunfo['img'], text_style = trunfo['style'], anonymous = anon)
[Thu Feb 02 14:17:00 2012] [error]   File "/usr/local/lib/python2.7/site-packages/ovl_analystT/reporting.py", line 90, in make_report
[Thu Feb 02 14:17:00 2012] [error]     info = dbman.gather_all_test_run_info(django_test_run_id = django_test_run_id)
[Thu Feb 02 14:17:00 2012] [error]   File "/usr/local/lib/python2.7/site-packages/ovl_analystT/dbconnector.py", line 802, in gather_all_test_run_info
[Thu Feb 02 14:17:00 2012] [error]     test_run = self.get_table_rows2(table = 'test_run', convert_to_one = True, django_id = django_test_run_id)
[Thu Feb 02 14:17:00 2012] [error]   File "/usr/local/lib/python2.7/site-packages/warehouseT/manager.py", line 213, in get_table_rows2
[Thu Feb 02 14:17:00 2012] [error]     cols = kwargs.pop('columns',self.get_table_column_names(table))#if columns are specified (using keyword 'columns') it only loads those.
[Thu Feb 02 14:17:00 2012] [error]   File "/usr/local/lib/python2.7/site-packages/warehouseT/manager.py", line 116, in get_table_column_names
[Thu Feb 02 14:17:00 2012] [error]     res = self.execute('''DESCRIBE %s'''%(table))#this function is so basic.. it should present no trouble, so no debug stuff.
[Thu Feb 02 14:17:00 2012] [error]   File "/usr/local/lib/python2.7/site-packages/warehouseT/manager.py", line 91, in execute
[Thu Feb 02 14:17:00 2012] [error]     self.cursor.execute(cmd)#this may raise warnings which we need to catch
[Thu Feb 02 14:17:00 2012] [error]   File "build/bdist.linux-x86_64/egg/MySQLdb/cursors.py", line 174, in execute
[Thu Feb 02 14:17:00 2012] [error]     self.errorhandler(self, exc, value)
[Thu Feb 02 14:17:00 2012] [error]   File "build/bdist.linux-x86_64/egg/MySQLdb/connections.py", line 36, in defaulterrorhandler
[Thu Feb 02 14:17:00 2012] [error]     raise errorclass, errorvalue
[Thu Feb 02 14:17:00 2012] [error] OperationalError: (2006, 'MySQL server has gone away')

(查看这段日志的时间戳,我猜 django 错误站点指向的是请求完成的时间,而不是引发错误的时间)

所以基本上这是我自己的一段代码中的一个错误(同样,它已经工作了很多很多次而没有失败),它被 mysql 停止了。

我认为mysql日志看起来很正常。我确实在我发布的那些行之前查看了这些行,但我没有认出任何奇怪的东西,但我没有每天阅读它们。 使用 root 用户以及不同的用户在本地登录到 mysql-sever 没有任何问题。我希望能够做的所有事情我都能做到。我没有尝试任何作为用户 www-data 的东西,因为坦率地说我不知道​​如何登录。此外,django 使用另一个用户名登录到 mysql-server。

重启mysql-server,没有结果。重新启动 apache2 和 django 开发服务器以及 mysql-server,没有结果。半个小时后,一切都好了..

我意识到我几乎没有给你任何东西可以继续。我很想再发布一些,但正如我提到的,我关闭了 Django 错误页面。而且我无法重现这个错误,这有点可怕。此错误持续发生至少一刻钟,但可能持续三刻钟。然后一切都再次起作用,我不知道为什么。在我未经训练的眼里,没有任何线索知道那段时间发生了什么变化,无论是在 apache2 还是在数据库中......

哦,是的,我用谷歌搜索了这个,发现了一些关于 wait_timeout 的信息,发现它的值可能足够高(默认),并且只有关于 mysql 的东西在闲置之后才会消失,而不是在刷新页面后一切都很好。

谁能帮我解释为什么会发生这种情况以及如何防止这个 2006 年的错误?

【问题讨论】:

    标签: mysql django wsgi mysql-python


    【解决方案1】:

    所以在不同的站点上,我发现当连接长时间打开时会发生此错误。我忽略了这一点,因为我认为这不适用于我的情况。经过深思熟虑,我重写了代码以在发生此错误时自动重新连接,然后重试,但感觉不正确正确。然后我发现我的代码确实保持了很长时间的开放连接,而这本身并不是必需的。我用于数据库访问的对象是在不同的模块级别实例化的,所以我猜它们是在我重新启动 apache 时才创建的。难怪几天后连接成功了..

    所以现在我只在需要它们的函数内创建数据库对象,并且自 :D 以来没有出现错误 2006 的问题。问题一直在椅子和键盘之间..

    【讨论】:

      猜你喜欢
      • 2012-06-28
      • 2011-12-18
      • 2012-05-15
      • 2020-04-12
      • 2010-12-31
      相关资源
      最近更新 更多