Estoy trabajando en una aplicación acoplable que utiliza MySQL para almacenar grandes bases de datos (que es debido a razones de herencia). Éste se instala en el ordenador central.
Hoy en día yo estaba haciendo trabajos comunes que he estado haciendo durante 1 o 2 meses, y, de repente, no puedo comunicar más con mi base de datos.
El URI de la db ha sido la misma durante meses:jdbc:mysql://localhost:3306/dbname?verifyServerCertificate=false&useSSL=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Tan pronto como intento conectar a la base de datos de mi aplicación que se ejecuta en la máquina virtual que reciben:
java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.)
...
Caused by: java.net.ConnectException: Connection timed out
El código culpable es la siguiente:
private static boolean checkForExistence(String dbName) {
boolean exists = false;
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(JDBC_DRIVER); //com.mysql.cj.jdbc.Driver
dataSource.setUrl(this.url); //that's the uri provided before
dataSource.setUsername(USER);
dataSource.setPassword(PASS);
Connection conn = null;
Statement stmnt = null;
ResultSet dbs = null;
try {
conn = dataSource.getConnection(); //And this is the line that triggers the exception.
System.out.println(conn!=null);
dbs = conn.getMetaData().getCatalogs();
while(dbs.next() && !exists)
if(dbs.getString(1).equals(dbName))
exists = true;
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(conn != null)
conn.close();
if(stmnt != null)
stmnt.close();
if(dbs != null)
dbs.close();
if(dataSource != null)
dataSource.close();
} catch (SQLException e) {
logger.error(e.getMessage());
return exists;
}
}
return exists;
}
Probé las siguientes cosas:
- Desde mi máquina local:
telnet <public ip of the VM> 3306
-> Conexión Tiempo de espera agotado - Desde mi máquina local:
mysql -h<public ip of the VM> -u user -p
->ERROR 2003 (HY000): Can't connect to MySQL server on 'remoteHostname.com' (110)
- Desde el interior de la máquina virtual:
nc localhost 3306
-> puedo entrar. - Desde el interior de la máquina virtual:
mysql -h127.0.0.1 -u user -p
-> puedo entrar. - Desde el interior de la máquina virtual:
mysql -h<public ip address> -u user -p
-> puedo entrar.
Si me quedo netstat -tulpn | grep 3306
tengo:
tcp6 0 0 :::3306 :::* LISTEN -
tcp6 0 0 :::33060 :::* LISTEN -
Esto es my.cnf
:
[mysqld]
default_authentication_plugin=mysql_native_password
datadir=/local/user/mysql
socket=/var/lib/mysql/mysql.sock
general_log_file=/var/log/mysql.log
general_log=1
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Puedo conectar con la base de datos a través de phpMyAdmin , pero creo que esto es debido al hecho de que está utilizando una conexión de socket.
Si puedo comprobar tanto /var/log/mysql.log
y /var/log/mysqld.log
(esto es el de los errores) no hay pruebas de nada. Básicamente, cuando intento conectar los no muestran nada.
EDIT: Si yo uso la misma configuración para conectar a mi instancia de la máquina local del mysql todo lo bien que funciona. Así que podría estar relacionado con un redes problema? O instane de MySQL de VM Doe no acepta conexión TCP más por alguna razón?
RE-EDIT : El registro /var/log/messages
descubrí que la máquina anfitriona salió de espacio en disco. A partir de entonces, la interfaz docker0
fue en una blocked state
y luego disabled state
bucle.
Configuración:
- VM remota con RHEL7
- 32 núcleos CPU
- 64 GB de RAM
- MySQL 8.0.13 - MySQL Community Server - GPL
- phpMyAdmin 4.8.4
En la sección Re-edición de la cuestión que se especifica nuevos detalles. Todavía no puedo ejecutar la aplicación correctamente con la configuración antigua pero utilizando --network=host
parámetro en docker run
resolvieron el problema.
Eso es simplemente una solución. Voy a actualizar esta pregunta con más informaciones.