我有一个 PHP 脚本正在启动一个 SQL 查询,在根据我服务器上名为table.获得结果后,应该将这些记录插入(使用替换)到我服务器上的另一个数据库表中。当table是一个简单的核心表时,该脚本可以完美地工作。我后来修改了 SQL 查询以使用 VIEW 表中的数据,我们可以称之为 VIEW 表,它view_table基于table但有一个额外的列,它是动态计算的。这使得脚本开始崩溃我的整个 SQL 服务器,每隔一段时间,抛出这个错误:PHP 警告:mysqli::query(): MySQL server has gone away in /home/user/script.php on line 109下面是第 109 行:function getRecordsFromDB(){ logMemoryUtilizationDetails(); file_put_contents(LOG_DIRECTORY.'service.log', date("d/m:H:i").':'."getRecordsFromDB::Entry".PHP_EOL, FILE_APPEND); global $sourceConn; $selectQuery = file_get_contents(__DIR__.'/my-query.sql'); $items = array(); $result = $sourceConn->query($selectQuery); // LINE 109 if ($result){ if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { $item = new Item(); $item->id = $row['id']; $item->itemId = $row['itemid'];我尝试记录创建以查看脚本在启动和退出时使用了多少内存,当它成功时,它在峰值时只使用了大约 37MB 的 RAM。我的服务器在 4 个内核上有 6GB 的 RAM。我的服务器上没有运行其他脚本会导致 SQL 服务器像这样崩溃,所以我确信这个脚本会导致崩溃。这是我的服务器的 MY.CNF:[mysqld]# disable mysql strict modesql_mode=""log-error=/var/lib/mysql/host.myhost.com.errperformance_schema=1query_cache_type=0query_cache_size=0query_cache_limit=0key_buffer_size=16Mmax_connections=200max_tmp_tables=1table_open_cache=2000local-infile=0thread_cache_size=4innodb_file_per_table=1default-storage-engine=MyISAMinnodb_use_native_aio=0max_allowed_packet=1024Minnodb_buffer_pool_size=800Mopen_files_limit=10000#wait_timeout=500tmp_table_size=256Mmax_heap_table_size=256Minnodb_buffer_pool_instances=1#general_log=on#general_log_file = /var/lib/mysql/all-queries.logslow-query-log=0slow-query-log-file=/var/lib/mysql/slow_queries.loglong_query_time=1.0#log_queries_not_using_indexes=1这是来自我的 PHP.INI(对于我正在使用的 PHP 7.2):max_execution_time = 240max_input_time = 60max_input_vars = 1000memory_limit = 512M
1 回答
德玛西亚99
TA贡献1770条经验 获得超3个赞
看起来像一个超时或失败的查询。请粘贴您正在使用的 sql 查询。您也可以尝试通过将查询粘贴到您的 mysql IDE(我最喜欢 Navicat)并在其前面加上“解释扩展”(不带引号)来查看查询可能导致此问题的位置。所以你的查询看起来像'解释扩展选择......(所有 300 行)' 寻找高于 4 的键,没有主键和查询的行对于初学者来说非常高。此外,您可能希望考虑创建一个存储过程而不是视图,在该存储过程中您可以将所有内容选择到临时表中,然后在下一个查询中执行即时计算值。当然,您需要配置 my.cnf 以识别临时表,以便在会话完成后将其销毁。此外,如果您有任何复制或服务器集群,
如果您愿意,请粘贴您的 my.cnf(mysql 配置文件)以确保您的配置最适合大型查询。
此外,出于故障排除的目的,您可能希望暂时增加 php.ini 中的最大执行时间。
- 1 回答
- 0 关注
- 99 浏览
添加回答
举报
0/150
提交
取消