MySQL 服务器已消失,不一致的错误,由单个脚本引起

我有一个 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 mode

sql_mode=""


log-error=/var/lib/mysql/host.myhost.com.err

performance_schema=1


query_cache_type=0

query_cache_size=0

query_cache_limit=0


key_buffer_size=16M

max_connections=200

max_tmp_tables=1

table_open_cache=2000

local-infile=0

thread_cache_size=4

innodb_file_per_table=1

default-storage-engine=MyISAM

innodb_use_native_aio=0

max_allowed_packet=1024M

innodb_buffer_pool_size=800M

open_files_limit=10000

#wait_timeout=500

tmp_table_size=256M

max_heap_table_size=256M

innodb_buffer_pool_instances=1

#general_log=on

#general_log_file = /var/lib/mysql/all-queries.log


slow-query-log=0

slow-query-log-file=/var/lib/mysql/slow_queries.log

long_query_time=1.0

#log_queries_not_using_indexes=1

这是来自我的 PHP.INI(对于我正在使用的 PHP 7.2):


max_execution_time = 240


max_input_time = 60


max_input_vars = 1000


memory_limit = 512M


守着星空守着你
浏览 100回答 1
1回答

德玛西亚99

看起来像一个超时或失败的查询。请粘贴您正在使用的 sql 查询。您也可以尝试通过将查询粘贴到您的 mysql IDE(我最喜欢 Navicat)并在其前面加上“解释扩展”(不带引号)来查看查询可能导致此问题的位置。所以你的查询看起来像'解释扩展选择......(所有 300 行)' 寻找高于 4 的键,没有主键和查询的行对于初学者来说非常高。此外,您可能希望考虑创建一个存储过程而不是视图,在该存储过程中您可以将所有内容选择到临时表中,然后在下一个查询中执行即时计算值。当然,您需要配置 my.cnf 以识别临时表,以便在会话完成后将其销毁。此外,如果您有任何复制或服务器集群,如果您愿意,请粘贴您的 my.cnf(mysql 配置文件)以确保您的配置最适合大型查询。此外,出于故障排除的目的,您可能希望暂时增加 php.ini 中的最大执行时间。
打开App,查看更多内容
随时随地看视频慕课网APP