PHP警告:“;MySQL服务器已经消失了”;macOS终端中MySQL转储后

PHP警告:“;MySQL服务器已经消失了”;macOS终端中MySQL转储后,php,mysql,macos,mysqli,dump,Php,Mysql,Macos,Mysqli,Dump,我正在使用CLI中的PHP脚本下载远程MySQL数据库(gzip),并将它们直接解压缩到MacBook的MySQL 5.7(不是MAMP)服务器。 它工作得很好,但是作为副作用,我的PHP应用程序(MAMP PRO)在CLI脚本的中间丢失了MySQL连接,警告为 PHP Warning: mysqli::__construct(): MySQL server has gone away in ... 这是在绕过十几个数据库之后发生的(无法复制确切数量)。当CLI脚本运行时,系统首选项中的My

我正在使用CLI中的PHP脚本下载远程MySQL数据库(gzip),并将它们直接解压缩到MacBook的MySQL 5.7(不是MAMP)服务器。 它工作得很好,但是作为副作用,我的PHP应用程序(MAMP PRO)在CLI脚本的中间丢失了MySQL连接,警告为

PHP Warning:  mysqli::__construct(): MySQL server has gone away in ...
这是在绕过十几个数据库之后发生的(无法复制确切数量)。当CLI脚本运行时,系统首选项中的MySQL窗格在每次CLI转储后从绿色/运行变为红色/停止,再次变为绿色/运行,这首先和浏览器中的PHP应用程序不冲突。但在某些时候,PHP应用程序显然会失去连接

我玩了我的.cnf和set

[mysqld]
max_allowed_packet=128M
max_connections=1024
或其他数量,但似乎没有任何改变

在CLI脚本完成后,当我在系统首选项中手动停止和启动MySQL时,PHP将继续正常工作

有什么想法吗

编辑:

到目前为止谢谢你,但它还没有修好。下面是主要的脚本:

$tmpPath = '/tmp/'

For each of 30 databases with different size:

$dbName = database name

exec('ssh user@server.com "mysqldump --login-path=local --lock-tables=false '.$dbName.' | gzip" > '.$tmpPath.$dbName.'.sql.gz');
exec('gzip -q -dc '.$tmpPath.$dbName.'.sql.gz | mysql -u root -proot '.$dbName)
正如我所说,终端中的PHPCLI脚本根本没有问题!
这是我的PHP<强> Apps<强>(后端前端应用程序的后端),在30个转储中间的某个地方因为上述错误而停止工作。

< P>我在MySQL中只添加了Max连接=1024,就有类似的问题。
<?php

use Exception;
use PDO;
use Our\Package\Common\Config\DbCredentials;

class DbConnectionManager
{
    private $credentials;

    /** @var PDO $connection */
    private $connection;

    /**
     * DbConnectionManager constructor.
     * @param DbCredentials $credentials
     */
    public function __construct(DbCredentials $credentials)
    {
        $this->credentials = $credentials;
        $this->reconnect();
    }

    /**
     * @return PDO
     */
    public function getConnection()
    {
        if (!$this->isConnected()) {
            $this->reconnect();
        }
        return $this->connection;
    }

    /**
     * @return bool
     */
    private function isConnected()
    {
        try {
            return $this->connection->query('SELECT 1 + 1;');
        } catch (Exception $e) {
            return false;
        }
    }

    /**
     *  Reinitialise the connection to MySQL
     */
    private function reconnect()
    {
        $dsn = $this->credentials->getDriver()
            .':host='.$this->credentials->getHost()
            .';port='.$this->credentials->getPort()
            .';dbname='.$this->credentials->getDbName()
        ;
        $connection = new PDO($dsn, $this->credentials->getUser(), $this->credentials->getPassword(), array(
            PDO::ATTR_TIMEOUT => 28800,
            PDO::ATTR_EMULATE_PREPARES => false,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        ));
        $this->connection = $connection;
    }
}

如果将查询发送到
不正确或太大。如果mysqld获取的数据包太大。
或者是不正常的,它假设机器出了问题
客户端并关闭连接

为了避免这个问题,您必须确保在mysqld服务器中设置的max_allowed_数据包比在客户端中设置的大,并且所有客户端对max_allowed_数据包使用相同的值。
然后记得重新启动你的服务器

创建mysqldump时,会锁定表。我认为这是主要的问题,这就是为什么您的应用程序会出现这种错误。使用以下选项:

--lock-tables, -l

Lock all tables before dumping them. The tables are locked with READ
LOCAL to allow concurrent inserts in the case of MyISAM tables. For
transactional tables such as InnoDB and BDB, --single-transaction is
a much better option, because it does not need to lock the tables at
all.
原来的答案是:


并尝试在转储命令之间让用户“睡眠”。

显示全局变量,如“%timeout%”
显示会话变量,如“%timeout%”与此同时,我发现系统首选项中的MySQL变为红色,因此每次数据库转储后都会停止半秒钟,然后立即重新启动。@RickJames你能给我另一个提示吗?你的评论是什么意思?我已经使用了可变超时设置,但没有任何帮助。请偶尔尝试使用mysqli_ping()@rndus2r ping mysql服务器。我一直在运行PHP mysql脚本,直到连接断开且脚本失败。因此,无论如何都要检查与MySQL服务器的连接。请添加指向报价/引用源的链接(黄色blockquote文本是从某处复制的吗?)。据我所知,
--锁定表
仅防止在转储时未锁定实时(源)数据库。但是在本地,我不使用
mysqldump
而是使用
gzip-q-dc'.$tmpPath.$dbName'..sql.gz | mysql-u root-proot'.$dbName
Aww直接解压到mysql。很抱歉本地数据库崩溃。我以为服务器崩溃了。在这种情况下,请尝试“sleep”选项,以便在导入时在本地完成索引,然后尝试wait_timeout=30000