Eu estou trabalhando em um aplicativo Docker que usa MySQL para armazenar grandes bancos de dados (que é devido a razões de legado). Este é instalado na máquina host.
Hoje eu estava fazendo trabalhos comuns que eu tenho feito para 1 ou 2 meses, e de repente eu não pode se comunicar mais com o meu banco de dados.
O uri do db tem sido a mesma há meses:jdbc:mysql://localhost:3306/dbname?verifyServerCertificate=false&useSSL=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Assim que eu tento conectar ao banco de dados do meu aplicativo que é executado no Virtual Machine recebo:
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
O código culpado é o seguinte:
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;
}
Eu tentei as seguintes coisas:
- Da minha máquina local:
telnet <public ip of the VM> 3306
-> Conexão expirou - Da minha 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)
- De dentro da VM:
nc localhost 3306
-> posso entrar. - De dentro da VM:
mysql -h127.0.0.1 -u user -p
-> posso entrar. - De dentro da VM:
mysql -h<public ip address> -u user -p
-> posso entrar.
Se eu corro netstat -tulpn | grep 3306
eu tenho:
tcp6 0 0 :::3306 :::* LISTEN -
tcp6 0 0 :::33060 :::* LISTEN -
Isto é 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
I podem se conectar ao db através phpMyAdmin , mas acho que isso é devido ao fato de que está usando uma conexão Socket.
Se eu verificar tanto /var/log/mysql.log
e /var/log/mysqld.log
(esta é a única sobre os erros) não há nenhuma evidência de qualquer coisa. Basicamente, quando eu tento conectar aqueles não exibe nada.
EDIT: Se eu usar as mesmas configurações para conectar ao meu exemplo máquina local de tudo mysql fina funciona. Então, isso pode estar relacionado com uma rede problema? Ou instane de mysql do VM doe não aceitar conexão mais tcp por algum motivo?
RE-EDIT : Verificação dentro /var/log/messages
eu descobri que a máquina host saiu do espaço em disco. A partir desse momento, a interface docker0
foi em uma blocked state
e depois disabled state
loop.
Configuração:
- VM remoto com RHEL7
- 32 núcleos de CPU
- 64GB RAM
- MySQL 8.0.13 - MySQL Community Server - GPL
- O phpMyAdmin 4.8.4
Na seção Re-edição de questão i especificado novos detalhes. Eu não posso ainda executar o aplicativo corretamente com a configuração antiga, mas usando --network=host
parâmetro docker run
fez o truque.
Isso é simplesmente uma solução alternativa. Vou atualizar essa questão com mais informações.