sierra mojave mac instalar high php mysql macos mysqli dump

mojave - Advertencia de PHP: "El servidor MySQL se ha ido" después del volcado de MySQL en el terminal de macOS



php mojave (4)

Cuando creas un mysqldump, bloqueas las tablas. Creo que ese es el problema principal y es por eso que sus aplicaciones están obteniendo ese error. Utiliza esta opción:

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

La respuesta original aquí:

Ejecute MySQLDump sin bloquear tablas

Y pruebe el usuario a "dormir" entre los comandos de volcado.

Estoy usando un script PHP de CLI para descargar bases de datos remotas de MySQL (gzip) y extraerlas directamente al servidor MySQL 5.7 (no MAMP) de mi MacBook. Funciona bien, pero como efecto secundario, mis aplicaciones PHP (MAMP Pro) pierden la conexión MySQL en el medio del script CLI con la advertencia

PHP Warning: mysqli::__construct(): MySQL server has gone away in ...

Esto sucede después de la rotonda de una docena de bases de datos (no se puede reproducir la cantidad exacta). Mientras se ejecuta el script CLI, el panel de MySQL en Preferencias del Sistema va de verde / corriendo a rojo / detenido a nuevamente verde / corriendo después de cada volcado CLI, que primero no entra en conflicto con las aplicaciones PHP en el navegador. Pero en algún momento las aplicaciones PHP obviamente pierden la conexión.

Jugué con mi.cnf y establecí

[mysqld] max_allowed_packet=128M max_connections=1024

u otras cantidades, pero no parece cambiar nada.

Cuando detengo manualmente e inicio MySQL en las Preferencias del sistema después de que la secuencia de comandos CLI ha terminado, el PHP continúa funcionando de manera normal nuevamente.

¿Algunas ideas?

EDITAR:

Gracias hasta ahora, pero todavía no está arreglado. Así que aquí está el guión en principio:

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

Como dije, la secuencia de comandos CLI de PHP en Terminal no se queja en absoluto. Son mis aplicaciones PHP (backend para aplicaciones frontales Angulares) que en algún lugar en medio de los 30 volcados dejan de funcionar debido al error mencionado.


Tengo un problema similar y lo soluciono simplemente agregando max_connections = 1024 en mysql.conf


También puede obtener estos errores si envía una consulta al servidor que es incorrecta o demasiado grande. Si mysqld obtiene un paquete que es demasiado grande . o fuera de servicio, asume que algo ha ido mal con el cliente y cierra la conexión.

Para evitar este problema, debe asegurarse de que max_allowed_packet sea mayor en el servidor mysqld que en el cliente y que todos los clientes usen el mismo valor para max_allowed_packet. ¡¡Y recuerda reiniciar tu servidor después de eso !!


Tuvimos un problema similar y usamos esto que se vuelve a conectar si la conexión desaparece:

<?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; } }

Puedes ajustar esto. La clase DBCredentials es solo una clase simple de PHP con getters & setters para el controlador, nombre de host, usuario, contraseña, nombre de db, puede cambiarla para que solo tome argumentos como cadenas si lo desea.