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_packet 变量来增加查询限制,该变量的默认值为 1MB。您可能还需要增加客户端的最大数据包大小。有关设置数据包大小的更多信息,请参见第 C.5.2.10 节“数据包太大”。
插入大量行的 INSERT 或 REPLACE 语句也可能导致此类错误。无论要插入的行数如何,这些语句中的任何一个都会向服务器发送单个请求;因此,您通常可以通过减少每次 INSERT 或 REPLACE 发送的行数来避免该错误。
至少,您必须确保您 mysqldump 来自的机器和您正在加载的机器的数据包大小相同。
您可以采取两(2)种方法:
方法 #1:使用 --skip-extended-insert 执行 mysqldump
这将确保 MySQL 数据包不会被多个 BLOB、TEXT 字段淹没。这样,一次执行一个 SQL INSERT。主要缺点是
方法 #2:增加max_allowed_packet
这可能是首选方法,因为实现这只是一个 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.cc和 sql/intem_strfunc.cc。
鉴于此解释,进行批量插入将相当快地加载/卸载 MySQL 数据包。当 max_allowed_packet 对于给定的数据负载来说太小时尤其如此。
结论
在大多数 MySQL 安装中,我通常将其设置为 256M 或 512M。当数据加载产生“MySQL 已消失”错误时,您应该尝试使用更大的值。
超时之前运行多长时间?第一步是检查wait_timeout和interactive_timeout设置以确保它们足够大以供您导入:
SHOW VARIABLES LIKE '%_timeout';
SET SESSION wait_timeout=28800;
Run Code Online (Sandbox Code Playgroud)
默认值为 8 小时 (28800),因此这可能不是问题。可以在此处找到此问题的其他迹象。其中最突出的是:
在不同主机上运行的客户端应用程序没有从该主机连接到 MySQL 服务器所需的权限。
首先验证权限,然后检查潜在问题列表。
| 归档时间: |
|
| 查看次数: |
45588 次 |
| 最近记录: |