MySQL PHP: 导入 .SQL 数据文件时遇到的最大执行时间问题
在使用 MySQL 和 PHP 导入大型 .SQL 数据文件时,可能会遇到被服务器设置的最大执行时间限制而导致无法成功导入的问题。这是因为默认情况下,PHP 会有一个最大执行时间(max_execution_time)的限制,若超过该限制则会强制停止执行。这个限制对于大型数据库文件一般来说是有必要的,因为过长的执行时间可能会导致服务器负载过高而造成其它问题。但如果你的数据文件实在太大了,那么你可能需要调整最大执行时间的设置来解决问题。
阅读更多:MySQL 教程
增加最大执行时间
一种方法是增加最大执行时间的设置。在 PHP 脚本顶部可以使用以下代码进行设置:
ini_set('max_execution_time', 300); // 设定为 300 秒
其中,300 表示设定的最大执行时间,单位为秒。该设置只作用于当前脚本运行期间,并不影响服务器全局设置。
如果您的 Web 服务器的 HTTP 配置中包含了 PHP 环境变量(e.g. SetEnv),则还可以在 .htaccess 文件中进行以下设置:
php_value max_execution_time 300
上述代码意味着设定 PHP 最大执行时间为 300 秒。如果你无法修改 .htaccess 文件,你也可以直接在 php.ini 文件中进行设置:
max_execution_time = 300
这里的 “300” 代表了新的最大执行时间(以秒为单位)。需要注意的是,上述设置方法可能出现跨平台兼容性将不再赘述。
修改 MySQL 配置
还有一种方法是修改 MySQL 数据库服务器中的配置,来增大 MySQL 处理数据的能力,使得导入尽可能快速地完成,从而减少导入时的等待时间,以避免超时现象。值得注意的是,本方法仅适用于文件大小在几百兆以上的 .SQL 文件。
打开 MySQL 数据库服务器中的 my.cnf 文件,追加以下设置:
innodb_lock_wait_timeout = 120
max_allowed_packet = 512M
wait_timeout = 3600
这里的设置可以将等待时间设置得更长些,比如 innodb_lock_wait_timeout,该设置可自定义锁定等待的时间(默认为 50 秒),将其设置成 120 秒即可,max_allowed_packet 建议大家把其值直接设置成 你的SQL统计文件中最大的半个大小,即可避免由于导入数据量太大的文件而导致出现 “Packet too large” 的问题,wait_timeout 则是 MySQL 服务的最大等待时间,设置成 3600 秒相当于一个小时。
最后,对于一些较大的 SQL 文件,我们还可以将其拆分成多个更小的文件,然后依次导入多个小文件。
总结
通过上述一些方法,我们可以更好地解决导入较大 .SQL 数据文件时遇到的最大执行时间问题。其中每种方法都有其适用的场景和优缺点,具体使用,请结合自身需求进行选择。