Estou executando o Ubuntu e estou tentando conectar o Tomcat ao meu banco de dados MySQL usando JDBC.
Já funcionou anteriormentemas após uma reinicialização, a instância não consegue se conectar.
- Tanto o Tomcat 6 quanto o MySQL 5.0.75 estão na mesma máquina
- Cadeia de conexão: jdbc:mysql:///localhost:3306
- Posso me conectar ao MySQL na linha de comando usando o
mysql
comando - O arquivo my.cnf é bastante padrão (disponível mediante solicitação) e possui endereço de ligação: 127.0.0.1
- Não consigo fazer Telnet para a porta do MySQL, apesar do netstat dizer que o MySQL está escutando
- Eu tenho uma regra IpTables para encaminhar 80 -> 8080 e nenhum firewall que eu conheça.
Sou muito novo nisso e não tenho certeza do que mais testar. Não sei se deveria procurar em etc/interfaces e se fiz o que procurar. É estranho porque funcionava, mas depois de reiniciar ele caiu, então devo ter mudado alguma coisa... :).
Percebo que o tempo limite indica que o servidor não está respondendo e presumo que seja porque a solicitação não está sendo processada. Instalei o MySQL via apt-get e Tomcat manualmente.
Processos MySQL
root@88:/var/log/mysql# ps -ef | grep mysqld
root 21753 1 0 May27 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe
mysql 21792 21753 0 May27 ? 00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --port=3306 --socket=/var/run/mysqld/mysqld.sock
root 21793 21753 0 May27 ? 00:00:00 logger -p daemon.err -t mysqld_safe -i -t mysqld
root 21888 13676 0 11:23 pts/1 00:00:00 grep mysqld
Netstat
root@88:/var/log/mysql# netstat -lnp | grep mysql
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 21792/mysqld
unix 2 [ ACC ] STREAM LISTENING 1926205077 21792/mysqld /var/run/mysqld/mysqld.sock
Aula de conexão de brinquedos
root@88:~# cat TestConnect/TestConnection.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class TestConnection {
public static void main(String args[]) throws Exception {
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
System.out.println("Got driver");
con = DriverManager.getConnection(
"jdbc:mysql:///localhost:3306",
"uname", "pass");
System.out.println("Got connection");
if(!con.isClosed())
System.out.println("Successfully connected to " +
"MySQL server using TCP/IP...");
} finally {
if(con != null)
con.close();
}
}
}
Saída de classe de conexão de brinquedo
Nota: Este é o mesmo erro que recebo do Tomcat.
root@88:~/TestConnect# java -cp mysql-connector-java-5.1.12-bin.jar:. TestConnection
Got driver
Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 1 milliseconds ago. The driver has not received any packets from the server.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
at TestConnection.main(TestConnection.java:14)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 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.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2181)
... 12 more
Caused by: java.net.ConnectException: Connection timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
... 13 more
Saída Telnet
root@88:~/TestConnect# telnet localhost 3306
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection timed out
Iptables
NOTA: Eu tinha uma regra configurada para NAT, mas a removi e o problema persiste.
root@88:~# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
root@88:~# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Comando usado para configurar o iptables
iptables -t nat -I PREROUTING --src 0/0 --dst 88.198.31.14 -p tcp --dport 80 -j REDIRECT --to-ports 8080
Desde então, removi a regra desta configuração para o NAT, portanto, a menos que haja um efeito colateral neste comando, ele não é relevante.
ATUALIZAÇÃO -Não consigo executar ping no host local
ip um
root@88:~/TestConnect# ip a
1: lo: <LOOPBACK> mtu 16436 qdisc noop state DOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/void
inet 127.0.0.1/32 scope host venet0
inet 88.198.31.14/32 scope global venet0:0
ip r
root@88:~/TestConnect# ip r
192.0.2.1 dev venet0 scope link
default via 192.0.2.1 dev venet0
regra de ip
root@88:~/TestConnect# ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
ping -c 1 localhost
root@88:~/TestConnect# ping -c 1 localhost
PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.
--- localhost.localdomain ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
gato /etc/hosts
root@88:~/TestConnect# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
# Auto-generated hostname. Please do not remove this comment.
88.198.31.14 88.198.31.14 88 88
ifconfig
root@88:/var/log/mysql# ifconfig
venet0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:127.0.0.1 P-t-P:127.0.0.1 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
RX packets:144432 errors:0 dropped:0 overruns:0 frame:0
TX packets:153825 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:37896766 (37.8 MB) TX bytes:28722595 (28.7 MB)
venet0:0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:88.198.31.14 P-t-P:88.198.31.14 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
Graças ao pQd, acho que reduzimos o erro, preciso ler sobre o que tudo isso significa e por que o localhost não é capaz de executar ping.
Responder1
você tem certeza absoluta de que não existe uma regra de iptables que impeça o tráfego tcp/3306? tente isso como uma solução temporária:
iptables -I INPUT -p tcp --dport 3306 -i lo -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3306 -o lo -j ACCEPT
ou talvez suas regras de NAT sejam um pouco mais do que você espera?
ok - seu loopback não está apenas inativo, mas não tem 127.0.0.1 vinculado a ele. adicione em /etc/network/interfaces:
auto lo
iface lo inet loopback
e .. por que diabos você o vinculou a vnet0? remova-o de lá.
correção rápida e única da linha cmd:
ip a d 127.0.0.1/32 dev venet0
ip a a 127.0.0.1/32 dev lo
ip link set dev lo up