我正在办公室运行一台服务器来处理一些文件,并将结果报告给远程MySQL服务器。

文件处理需要一段时间,进程中途死亡,并出现以下错误:

2006, MySQL server has gone away

我听说过MySQL的设置,wait_timeout,但是我需要在我办公室的服务器或远程MySQL服务器上更改它吗?


当前回答

发生这种错误主要有两个原因。

你的内存太小了。 尝试连接时,数据库连接将被关闭。

您可以尝试下面的代码。

# Simplification to execute an SQL string of getting a data from the database
def get(self, sql_string, sql_vars=(), debug_sql=0):
    try:            
        self.cursor.execute(sql_string, sql_vars)
        return self.cursor.fetchall()
    except (AttributeError, MySQLdb.OperationalError):
        self.__init__()
        self.cursor.execute(sql_string, sql_vars)
        return self.cursor.fetchall()

不管背后的原因是什么,它都能减轻错误,尤其是第二个原因。

如果是由低RAM引起的,则必须从代码或数据库配置提高数据库连接效率,或者仅仅提高RAM。

其他回答

错误:2006 (CR_SERVER_GONE_ERROR)

消息:MySQL服务器已经消失了

通常,您可以重试连接,然后再次执行查询来解决这个问题-在完全放弃之前尝试3-4次。

我假设您正在使用PDO。如果是这样,那么您将捕获PDO异常,增加一个计数器,然后在计数器低于阈值时再次尝试。

如果你有一个导致超时的查询,你可以执行以下命令来设置这个变量:

SET @@GLOBAL.wait_timeout=300;
SET @@LOCAL.wait_timeout=300;  -- OR current session only

其中300是您认为查询可能花费的最大时间的秒数。

关于如何处理Mysql连接问题的进一步信息。

编辑:您可能还想使用的另外两个设置是net_write_timeout和net_read_timeout。

我也有同样的问题,但改变my.ini/my.cnf文件下[mysqld]的max_allowed_packet。

添加一条线

max_allowed_packet = 500

现在重新启动MySQL服务,一旦你完成。

对我来说是内存问题。

我甚至在拥有12个CPU核心和32 GB RAM的服务器上也遇到了同样的问题。我做了更多的研究,试图释放RAM。下面是我在Ubuntu 14.04上使用的释放RAM的命令:

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

而且,它修复了一切。我把它设置在cron下,每小时运行一次。

crontab -e

0 * * * * bash /root/ram.sh;

并且,你可以使用这个命令来检查有多少可用的空闲RAM:

free -h

你会得到这样的结果:

             total       used       free     shared    buffers     cached
Mem:           31G        12G        18G        59M       1.9G       973M
-/+ buffers/cache:       9.9G        21G
Swap:         8.0G       368M       7.6G

在docker-compose.yml中添加以下设置时,我也遇到了同样的问题:

db:
    image: mysql:8.0
    command: --wait_timeout=800 --max_allowed_packet=256M --character-set-server=utf8 --collation-server=utf8_general_ci --default-authentication-plugin=mysql_native_password
    volumes:
      - ./docker/mysql/data:/var/lib/mysql
      - ./docker/mysql/dump:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

在我的情况下,它是低值的open_files_limit变量,这阻止了mysqld访问数据文件。

我用:

mysql> SHOW VARIABLES LIKE 'open%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 1185  |
+------------------+-------+
1 row in set (0.00 sec)

在我将变量改为大值后,我们的服务器再次活跃起来:

[mysqld]
open_files_limit = 100000