MySQL 服务器已经消失,阻碍了大型转储的导入

nax*_*xoc 14 mysql innodb dump mac-os-x

我正在尝试将大型 sql 转储 (2GB) 导入到我的 mac 上的本地 mysql。过去我已经能够做到这一点(我使用的是 MAMP),但现在我在第 7758 行收到 ERROR 2006 (HY000):每次我尝试导入转储时,MySQL 服务器都已消失。数据库包含 innodb 表。

我尝试将 my-innodb-heavy-4G.cnf 文件复制到 my.cnf 以查看这些设置是否有帮助,但没有运气。

关于调整什么的任何想法?

我正在使用“Mac OS X ver. 10.6 (x86, 64-bit), DMG Archive”从这里:http : //dev.mysql.com/downloads/mysql/

Rol*_*DBA 16

MySQL 连接的无声杀手之一是 MySQL 数据包。甚至 MySQL 复制的 I/O 线程也可能成为受害者。

根据MySQL 文档

  • 如果向服务器发送不正确或过大的查询,也会出现这些错误。如果 mysqld 收到一个太大或乱序的数据包,它会假设客户端出现问题并关闭连接。如果您需要大查询(例如,如果您正在处理大 BLOB 列),您可以通过设置服务器的 max_allowed_pa​​cket 变量来增加查询限制,该变量的默认值为 1MB。您可能还需要增加客户端的最大数据包大小。有关设置数据包大小的更多信息,请参见第 C.5.2.10 节“数据包太大”。

  • 插入大量行的 INSERT 或 REPLACE 语句也可能导致此类错误。无论要插入的行数如何,这些语句中的任何一个都会向服务器发送单个请求;因此,您通常可以通过减少每次 INSERT 或 REPLACE 发送的行数来避免该错误。

至少,您必须确保您 mysqldump 来自的机器和您正在加载的机器的数据包大小相同。

您可以采取两(2)种方法:

方法 #1:使用 --skip-extended-insert 执行 mysqldump

这将确保 MySQL 数据包不会被多个 BLOB、TEXT 字段淹没。这样,一次执行一个 SQL INSERT。主要缺点是

  1. mysqldump 更大
  2. 重新加载这样的转储需要更长的时间。

方法 #2:增加max_allowed_pa​​cket

这可能是首选方法,因为实现这只是一个 mysql 重启。了解 MySQL 数据包是什么可能会澄清这一点。

根据“了解 MySQL 内部结构”(ISBN 0-596-00957-7)第 99 页,这里是第 1-3 段的解释:

MySQL 网络通信代码是在查询总是相当短的假设下编写的,因此可以在一个块中发送到服务器并由服务器处理,这在 MySQL 术语中称为数据包。服务器为临时缓冲区分配内存来存储数据包,并请求足够的内存来完全容纳它。这种架构需要采取预防措施以避免服务器内存不足——数据包大小的上限,此选项可实现这一点。

与此选项相关的代码可在sql/net_serv.cc 中找到 。查看my_net_read(),然后按照对my_real_read()的调用并特别注意 net_realloc()

此变量还限制了许多字符串函数的结果的长度。有关详细信息,请参阅sql/field.ccsql/intem_strfunc.cc

鉴于此解释,进行批量插入将相当快地加载/卸载 MySQL 数据包。当 max_allowed_pa​​cket 对于给定的数据负载来说太小时尤其如此。

结论

在大多数 MySQL 安装中,我通常将其设置为 256M 或 512M。当数据加载产生“MySQL 已消失”错误时,您应该尝试使用更大的值。


Der*_*ney 2

超时之前运行多长时间?第一步是检查wait_timeoutinteractive_timeout设置以确保它们足够大以供您导入:

SHOW VARIABLES LIKE '%_timeout';
SET SESSION wait_timeout=28800;
Run Code Online (Sandbox Code Playgroud)

默认值为 8 小时 (28800),因此这可能不是问题。可以在此处找到此问题的其他迹象。其中最突出的是:

在不同主机上运行的客户端应用程序没有从该主机连接到 MySQL 服务器所需的权限。

首先验证权限,然后检查潜在问题列表。