如何防止大型 MySQL 导入的连接超时

Posted

技术标签:

【中文标题】如何防止大型 MySQL 导入的连接超时【英文标题】:How to Prevent Connection Timeouts for Large MySQL Imports 【发布时间】:2013-07-03 03:12:39 【问题描述】:

在开发过程中,我们的本地 WAMP 服务器如何从测试服务器获取最新数据是进行数据库转储,然后我们使用 source 命令上传该转储以加载 .sql 文件。

最近,在导入的最后,我们收到了关于 @old 变量的错误,这些变量在更改之前存储了诸如外键约束之类的原始设置(因此关闭外键约束以便导入不会重新创建表时抛出错误,并在其中一个表尚未创建时尝试创建外键)。我发现原因是产品表正在获取越来越多的数据,并且在导入期间会话已超时。

我想知道我可以设置什么设置(作为 my.ini 文件中的 SQL 查询的一部分)来停止所有超时,从而在我们登录时使会话永远持续。

【问题讨论】:

【参考方案1】:

导入大型 mysql 数据库的策略

phpMyAdmin 导入

如果您正在阅读本文,PHPMyAdmin 可能不是您大型 MySQL 数据库导入的选项。尽管如此,它总是值得一试,对吧? PHPMyAdmin 导入失败的最常见原因是超出导入限制。如果您在本地工作或拥有自己的服务器,您可以尝试更改通常在 MySQL 安装文件夹中的 my.ini 文件中找到的 MySQL ini 设置。如果您在 Windows 上使用 WAMP,则可以使用 MySQL > my.ini 下的 WAMP 控制面板访问该文件。请记住重新启动 WAMP,以便使用您的新设置。您可能希望在此处增加的设置包括:

max_allowed_packet
read_buffer_size

即使使用增强的 MySQL 导入设置,您仍然可能会发现由于 PHP 设置导致导入超时。如果您有权访问 PHP.ini,则可以对最长执行时间和相关设置进行编辑。在 WAMP 中,通过 PHP > php.ini 访问 WAMP 控制面板下的 PHP.ini 文件。在尝试大型 MySQL 导入时,请考虑提高以下设置的限制:

max_execution_time
max_input_time
memory_limit

使用 Big Dump 交错 MySQL 转储导入器

如果基本的 PHPMyAdmin 导入不起作用,您可能需要尝试使用 Ozerov.de 的 Big Dump 脚本来进行交错的 MySQL 导入。这个有用的脚本所做的是在更小的块中运行您的导入,这正是成功导入大型 MySQL 转储经常需要的。可通过http://www.ozerov.de/bigdump/免费下载。

使用 Big Dump 的过程相当简单:你基本上将 SQL 导入文件和 Big Dump 脚本一起放在服务器上,在 Big Dump 脚本中设置一些配置,然后运行该脚本。 Big Dump 处理剩下的事情!

关于这个非常棒的选项的一个关键点是,它根本不适用于包含扩展插入的 MySQL 导出。因此,如果您可以选择阻止扩展插入,请尝试一下。否则,您将不得不使用另一种方法来导入您的大型 MySQL 文件。

使用 MySQL 控制台转到命令行

如果您正在运行 WAMP(即使您没有运行),也始终可以选择直接使用 MySQL 控制台导入大型 MySQL 数据库。在写这篇文章时,我正在以这种方式导入一个 4GB 的数据库。这实际上是我有时间花时间写作的原因,因为当你有一个 4GB 的 SQL 文件要导入时,即使是这种方法也需要时间!

一些开发人员(通常是我)被打开一个黑屏并在其中输入神秘的命令吓坏了。但它可以解放,当涉及到 MySQL 数据库时,它通常是最好的选择。在 WAMP 中,我们从 WAMP 控制面板的 MySQL > MySQL 控制台访问 MySQL 控制台。现在让我们学习导入 MySQL 数据库所需的 2 个简单的 MySQL 控制台命令,命令行样式:

use `db_name`

命令use 后跟数据库名称将告诉 MySQL 控制台您要使用哪个数据库。如果您已经设置了要导入的数据库,那么您首先发出use 命令。假设您的数据库名为my_great_database。在这种情况下,请在 MySQL 控制台中发出以下命令。请注意,命令必须以分号结尾。

mysql-> use my_great_database;

mysql-> source sql_import_file.sql

命令source 后跟SQL 文件的位置会将SQL 文件导入您之前使用use 命令指定的数据库。您必须提供路径,因此如果您在本地服务器上使用 WAMP,首先将 SQL 文件放在容易获取的位置,例如 C:\sql\my_import.sql。此示例路径的完整命令为:

mysql-> source C:\sql\my_import.sql;

运行该命令后,应开始导入 SQL 文件。在关闭 MySQL 控制台之前,让查询运行并允许导入完成。

可以在此处找到有关 MySQL 命令行的更多文档:http://dev.mysql.com/doc/refman/5.5/en/mysql.html

另一种解决方案是使用MySQL Workbench。

【讨论】:

max_execution_time = 1200 和 upload_max_filesize = 1000M... 它仍然崩溃! 我知道这已经晚了一年,但请尝试提高 memory_limit。 我不得不更改以下内容,不确定哪个有效,但更改的组合确实有效! // MySQL.ini // max_allowed_pa​​cket 从 1M 到 100M // read_buffer_size 从 256K 到 2048M // PHP.ini // max_execution_time 从 120 到 12000 // max_input_time 从 60 到 6000 // memory_limit 从 128M 到 512M // default_socket_timeout 从 60到 6000 而不是使用mysql-> source C:\sql\my_import.sql;请使用(正斜杠)mysql-> source C:/sql/my_import.sql;【参考方案2】:

这个解决方案对我有用:

max_allowed_packet  <-- --> upped size to 8M
read_buffer_size  <-- -->  upped from 256 to 512

在本地主机上使用 Xampp 控制面板。在对 MySQL 配置中的 my.ini 文件进行更改后,不要忘记退出 Xampp(或 Wamp)并重新启动它以使更改生效。

(头疼了四天,我终于把它修好了!)

导入时出现症状:#2006 MySql 服务器消失了。 但是,在 87 个表行中只有 10 个表行被导入。

【讨论】:

谢谢!节省我很多时间弄清楚这一点。对于 300+MB 的 sql 文件,我必须将 max_allowed_pa​​cket 增加到 32M,将 read_buffer_size 增加到 2048M。 谢谢!我添加它并工作:max_allowed_pa​​cket = 8M, read_buffer_size = 512【参考方案3】:

考虑使用MySQL Workbench,它是免费的并且可以很好地处理非常大的脚本(从菜单中选择:文件 -> 打开 SQL 脚本 - 如果它很大,它会问你是否要运行它)。多年来,在处理大型 SQL 转储时为我提供了很好的帮助。

【讨论】:

这仍然给我带来了问题 - 它在 30 秒后超时。对我来说,数据导入工作 - 转到主菜单中的 服务器 » 数据导入。然后您可以选择 SQL 转储的位置并导入。

以上是关于如何防止大型 MySQL 导入的连接超时的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 Advantage Database 连接超时?

如何防止 Google Colab 断开连接?

如何调试/解决 MySQL JDBC 连接超时

mysql连接数,缓存区大小,连接超时时间如何设置呢?

mysql连接超时怎么处理

mysql连接超时的问题