Я использую PHP-скрипт из CLI для загрузки удаленных баз данных MySQL (gzip) и извлечения их непосредственно на сервер MySQL 5.7 (не MAMP) моего MacBook.
Он работает нормально, но, как побочный эффект, мои PHP-приложения (MAMP Pro) теряют соединение MySQL в середине скрипта CLI с предупреждением
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
или другие суммы, но это ничего не меняет.
Когда я вручную останавливаю и запускаю MySQL в Системных настройках после завершения сценария CLI, PHP снова продолжает работать нормально.
Есть идеи?
РЕДАКТИРОВАТЬ:
Пока спасибо, но это все еще не исправлено. Итак, вот основной сценарий:
$tmpPath = '/tmp/'
For each of 30 databases with different size:
$dbName = database name
exec('ssh [email protected] "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 дампов перестает работать из-за упомянутой ошибки.
У меня есть похожая проблема и исправлена, просто добавив max_connections = 1024 в mysql.conf
У нас была похожая проблема, и мы использовали эту, которая переподключается, если соединение исчезает:
<?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-класс с геттерами. & Установщики для драйвера, имени хоста, пользователя, пароля, имени БД, вы можете изменить его так, чтобы он просто принимал аргументы в виде строк, если хотите.
Вы также можете получить эти ошибки, если отправите запрос на сервер, который
неправильный или слишком большой. Если mysqld получает пакет, который слишком большой.
или не в порядке, предполагается, что что-то пошло не так с
клиент и закрывает соединение.
Чтобы избежать этой проблемы, вы должны убедиться, что max_allowed_packet установлен на сервере mysqld больше, чем на клиенте, и что все клиенты используют одинаковое значение для max_allowed_packet.
И не забудьте перезапустить ваш сервер после этого !!!!
Когда вы создаете 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.
Оригинальный ответ здесь:
И попробуйте пользователю немного «спать» между командами дампа.