首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >:一般错误:2006年Mysql服务器已经消失

问:一般错误:2006年Mysql服务器已经消失
EN

Stack Overflow用户
提问于 2016-12-14 00:48:56
回答 2查看 3.5K关注 0票数 1

我目前正在运行一个自定义php脚本,当在本地主机上运行时,这个脚本可以正常运行,但是在共享主机上运行时,我会收到以下错误:

致命错误:未命名的异常'PDOException‘与消息'SQLSTATEHY000: General error: 2006 MySQL服务器在.205堆栈跟踪: 0.PDO->准备(‘SELECT* FROM o.’) #1 {main}抛入.线路205

(我已将文件路径替换为.)

我尝试过的事情:

  1. 添加PDO::ATTR_TIMEOUT => "999999999999999999999",以扩展任何超时。
  2. 选中了max_allowed_packet (我找到的每一个答复都说这是原因),我的本地机器目前被设置为1048576 (1mb),但是我的主机当前被设置为268435456 (268 My )。

我会理解,如果我的本地机器是268兆b,我的主机是1mb,但这是没有任何意义的,这是问题的原因,因为事实并非如此。

我确实试图在我的主机上增加它,但是作为它的共享,我没有权限来更改这个全局变量。

还有其他我可以尝试的想法吗?

FYI这里是脚本:

代码语言:javascript
复制
//MYSQL PREPARE STATEMENTS
//check to see if a product is in database
$mysql['productcheck'] = $mysql['pdo']->prepare('SELECT * FROM oc_product WHERE sku = ?');
$newproductcount=0;
$x = 0;
while(($maintable[$x]['status']=="active") || ($maintable[$x]['status']=="new") || ($maintable[$x]['status']=="discontinued") || ($maintable[$x]['status']=="archive")) {
    if(($maintable[$x]['status']=="active") || ($maintable[$x]['status']=="new")){
        //check to see if product exsists
        $params[1]=$maintable[$x]['euid'];
        $mysql['productcheck']->execute([$params[1]]);
        if($mysql['productcheck']->rowCount()==0){
            //PRODUCT DOESN'T EXSIST
            echo "Product doesnt exsists!";
            $newproductcount++;
        }
    }
$x++;
}
EN

回答 2

Stack Overflow用户

发布于 2016-12-14 01:02:45

导致MySQL服务器消失的其他一些常见原因是:

  • 您(或db管理员)已经使用杀死语句或mysqladmin命令杀死了正在运行的线程。
  • 关闭到服务器的连接后,尝试运行查询。这表示应用程序中应该更正的逻辑错误。
  • 在不同主机上运行的客户端应用程序不具有从该主机连接到MySQL服务器所需的特权。
  • 您从客户端的TCP/IP连接中获得了超时。如果您一直在使用命令:mysql_options(.,MYSQL_OPT_READ_TIMEOUT,.),则可能会发生这种情况。Mysql_options(.,MYSQL_OPT_WRITE_TIMEOUT,.)在这种情况下,增加超时可能有助于解决问题。
  • 您在服务器端遇到超时,并且禁用了客户机中的自动重连接( MYSQL结构中的重新连接标志等于0)。
  • 您使用的是Windows,服务器在发出命令之前已经删除了连接(可能是因为wait_timeout过期了)。
  • Windows上的问题是,在某些情况下,MySQL在向服务器写入TCP/IP连接时不会从操作系统获得错误,而是在尝试从连接读取答案时获得错误。
  • 解决这一问题的方法是,如果上次查询已有很长时间( Connector/ODBC是这样做的),那么要么在连接上执行mysql_ping(),要么在mysqld服务器上设置wait_timeout,使其在实践中永远不会超时。
  • 如果向服务器发送不正确或过大的查询,也可以获得这些错误。如果mysqld接收到的数据包太大或出现故障,它会假设客户端出了问题并关闭了连接。如果需要大查询(例如,如果使用大BLOB列),可以通过设置服务器的max_allowed_packet变量(默认值为4MB )来增加查询限制。您还可能需要增加客户端的最大数据包大小。有关设置数据包大小的更多信息,请参见B.5.2.10节“数据包太大”。
  • 插入或替换插入大量行的语句也会导致这类错误。这些语句中的任何一条都会向服务器发送单个请求,而不考虑要插入的行数;因此,通常可以通过减少每次插入或替换发送的行数来避免错误。
  • 如果您发送的数据包是16 is或更大,如果您的客户端大于4.0.8,而您的服务器是4.0.8及以上,或者相反,您也会丢失连接。
  • 如果主机名查找失败,也可能看到此错误(例如,如果您的服务器或网络依赖的DNS服务器出现故障)。这是因为MySQL依赖主机系统进行名称解析,但无法知道它是否工作--从MySQL的角度来看,这个问题与任何其他网络超时都是无法区分的。
  • 如果使用--跳过网络选项启动MySQL,您可能还会看到MySQL服务器已经消失了。
  • 如果防火墙阻塞了MySQL端口(默认为3306),则会发生另一个可能导致此错误的网络问题,从而完全阻止与MySQL服务器的任何连接。
  • 您还可以在分叉子进程的应用程序中遇到此错误,所有这些应用程序都试图使用与MySQL服务器的相同连接。可以通过为每个子进程使用单独的连接来避免这种情况。
  • 在执行查询时,您遇到了服务器死掉的错误。

检查此链接:远去

票数 2
EN

Stack Overflow用户

发布于 2022-06-22 05:41:43

我认为您的代码中的问题是,您执行,为变量、$maintable、中的每个值选择,而您的代码在中执行中的查询。服务器可能无法处理代码发送的查询,因此,在执行 SELECT 查询的过程中,另一个查询将到达正在执行当前查询的同一个数据库连接,这使得您的新查询等待连接完成选择过程,但是MySQL不会执行新的查询,因为它不会重新连接/重新查询新的查询。

我的建议是您应该更改您的查询。不要使用SELECT * FROM oc_product WHERE sku = ?,您应该使用SELECT * FROM oc_product WHERE sku IN ?,这样单个连接就可以搜索任何您想要的变量,然后在查询完成后进行验证。

所以这段代码

代码语言:javascript
复制
while(($maintable[$x]['status']=="active") || ($maintable[$x]['status']=="new") || ($maintable[$x]['status']=="discontinued") || ($maintable[$x]['status']=="archive")) {
    if(($maintable[$x]['status']=="active") || ($maintable[$x]['status']=="new")){
        //check to see if product exsists
        $params[1]=$maintable[$x]['euid'];
        $mysql['productcheck']->execute([$params[1]]);
        if($mysql['productcheck']->rowCount()==0){
            //PRODUCT DOESN'T EXSIST
            echo "Product doesnt exsists!";
            $newproductcount++;
        }
    }
$x++;
}

不应执行查询,而应验证从新查询中获得的查询结果。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41133030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档