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

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

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

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

【问题讨论】:

    标签: mysql timeout


    【解决方案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 转储的位置并导入。
    猜你喜欢
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2022-11-09
    • 2016-02-17
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    相关资源
    最近更新 更多