簡體   English   中英

PHP警告:在MySQL轉儲到macOS終端后,“MySQL服務器已經消失”

[英]PHP Warning: “MySQL server has gone away” after MySQL dump in macOS Terminal

我使用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應用程序顯然失去了連接。

我和my.cnf一起玩了

[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)

就像我說的,終端中的PHP CLI腳本根本不會抱怨! 這是我的PHP 應用程序 (Angular前端應用程序的后端),由於上述錯誤,30個轉儲中間某處停止工作。

我有類似的問題,並通過在mysql.conf中添加max_connections = 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;
    }
}

你可以調整一下。 DBCredentials類只是一個普通的PHP類,包含驅動程序,主機名,用戶,密碼,數據庫名稱的getter和setter,如果您願意,可以將其更改為僅將參數作為字符串。

如果向服務器發送不正確或太大的查詢,也可能會出現這些錯誤。 如果mysqld獲取的數據包太大 或者不按順序,它假定客戶端出現問題並關閉連接。

要避免此問題,必須確保mysqld服務器中的max_allowed_pa​​cket設置得比客戶端大,並且所有客戶端都使用相同的max_allowed_pa​​cket值。 並記得在那之后重新啟動服務器!!!!

創建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.

原來的答案在這里:

運行MySQLDump而不鎖定表

並嘗試用戶在轉儲命令之間“睡眠”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM