MySQL服务器已经消失了(代码2006)



我在

如何启用MySQL客户端自动重新连接MySQL数据库?

我有同样的问题,我使用pythonanywhere.com,当我写p.s save()时,我有如下错误:

上面说要更新mysql来修复它,但是我不知道我需要写什么代码或shell命令。

你能帮我吗?

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/daro822/.virtualenvs/django16/local/lib/python2.7/site-packages/django/db/models/base.py", line 545, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/daro822/.virtualenvs/django16/local/lib/python2.7/site-packages/django/db/models/base.py", line 570, in save_base
    with transaction.commit_on_success_unless_managed(using=using, savepoint=False):
  File "/home/daro822/.virtualenvs/django16/local/lib/python2.7/site-packages/django/db/transaction.py", line 280, in __enter__
    connection.set_autocommit(False)
  File "/home/daro822/.virtualenvs/django16/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 340, in set_autocommit
    self._set_autocommit(autocommit)
  File "/home/daro822/.virtualenvs/django16/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 461, in _set_autocommit
    self.connection.autocommit(autocommit)
  File "/home/daro822/.virtualenvs/django16/local/lib/python2.7/site-packages/django/db/utils.py", line 99, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/home/daro822/.virtualenvs/django16/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 461, in _set_autocommit
    self.connection.autocommit(autocommit)
  File "/home/daro822/.virtualenvs/django16/local/lib/python2.7/site-packages/MySQLdb/connections.py", line 243, in autocommit
    _mysql.connection.autocommit(self, on)
OperationalError: (2006, 'MySQL server has gone away')

与数据库的连接因空闲时间过长而关闭。从回溯中可以看出,您是在交互式地执行查询。如果您知道您已经空闲超过5分钟,您应该这样做:

from django.db import connection; connection.close()

我解决了在需要恢复和刷新连接的地方插入以下代码的问题:

        try:
            cursor = connections['default'].cursor()
            db = cursor.db
            assert issubclass(db.__class__, BaseDatabaseWrapper)
            if db.connection is None or not db.is_usable():
                db.close_if_unusable_or_obsolete()
                with db.wrap_database_errors:
                    db.connect()
                logger.info('Restoring the Mysql Connection')
        except Exception as e:
            logger.exception('DB Connection error')

请注意,我使用connections['default'],因为我有多个数据库配置,所以你可以设置一个特定的连接,也请注意,我使用db.is_usable(),所以调用.ping()允许恢复连接时可能的,而不是总是关闭连接。

最新更新