如何在opensuse上连接到mysql本地主机?

4

首先,配置的详细信息如下:

  1. openSUSE 11.3 with Parallels Plesk Panel 10 (64-bit) Server
  2. 已安装并运行MySQL(没有“skip-networking”)
  3. java 1.6.0_24(Java HotSpot(TM) 64-Bit Server VM(build 19.1-b02, mixed mode))

MySQL服务器监听在0.0.0.0:3306上。

netstat -lnp | grep mysql
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      3499/mysqld         
unix  2      [ ACC ]     STREAM     LISTENING     10916  3499/mysqld         /var/run/mysql/mysql.sock

现在有一个问题,我无法使用这个类 (mysql-connector-java-5.1.17-bin.jar) 从本地主机连接到mysql数据库。
public class Connect {
    public static void main(String[] args) {
        Connection conn = null;

        try {
            String userName = "user";
            String password = "password";
            // This also doesn't work with "localhost" in the connect string.
            String url = "jdbc:mysql://127.0.0.1:3306/database";

            System.out.println("URL: " + url);

            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection(url, userName, password);
            System.out.println("Database connection established");
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("Cannot connect to database server");
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                    System.out.println("Database connection terminated");
                } catch (Exception e) { /* ignore close errors */
                }
            }
        }
    }
}

更多细节:
telnet 连接超时。
telnet localhost 3306
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection timed out

nmap显示本地主机的端口3306被过滤了

nmap -p 3306 localhost
Starting Nmap 5.00 ( http://nmap.org ) at 2011-08-30 19:21 CEST
Interesting ports on localhost (127.0.0.1):
PORT     STATE    SERVICE
3306/tcp filtered mysql

Nmap done: 1 IP address (1 host up) scanned in 2.31 seconds

如果我使用Connect类从外部连接到服务器的3306端口,一切都正常工作。
我认为这是防火墙的问题。这是来自Plesk配置中心的自动生成的防火墙。
iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
target     prot opt in     out     source               destination         
ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:!0x17/0x02 reject-with tcp-reset 
DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           state INVALID 
ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:10000 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:4306 
DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:12443 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:11443 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:11444 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8447 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8443 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8880 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:443 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:21 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:587 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:25 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:465 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:110 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:995 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:143 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:993 
DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:106 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:3306 
ACCEPT     tcp  --  *      *       127.0.0.1            0.0.0.0/0           tcp dpt:5432 
DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:5432 
ACCEPT     tcp  --  *      *       127.0.0.1            0.0.0.0/0           tcp dpt:9008 
ACCEPT     tcp  --  *      *       127.0.0.1            0.0.0.0/0           tcp dpt:9080 
DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:9008 
DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:9080 
DROP       udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:137 
DROP       udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:138 
DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:139 
DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:445 
DROP       udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:1194 
ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:53 
ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:53 
DROP       icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 8 code 0 
DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy DROP 0 packets, 0 bytes)
target     prot opt in     out     source               destination         
ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:!0x17/0x02 reject-with tcp-reset 
DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           state INVALID 
ACCEPT     all  --  lo     lo      0.0.0.0/0            0.0.0.0/0           
DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
target     prot opt in     out     source               destination         
ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:!0x17/0x02 reject-with tcp-reset 
DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           state INVALID 
ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0

此外,我可以使用 Perl 连接到本地的 MySQL。
$dsn = "dbi:mysql:$database:localhost:3306";
$connect = DBI->connect($dsn, $user, $pw);

如果有任何解决方案的提示,我会感到遗憾。 Martin


这可能是一个愚蠢的问题,但是...你的数据库真的叫做“database”吗? - Nate C-K
我不使用opensuse,所以我的回答可能完全不正确,但是你是否尝试在你的JDBC URL中使用localhost而不是127.0.0.1 - BalusC
不,它不叫做数据库。我改变了发布的参数。 - Martin
我尝试使用localhost代替127.0.0.1,即使是在nmap和telnet命令中也是如此。 - Martin
只是一个随机的评论:这可能是由于IPv6引起的吗?能否解释一下从外部(IPv4)和内部(可能是IPv6)连接之间的差异。 - Ishtar
为了从外部连接,我使用相同的Connect类,只需在连接字符串中使用服务器地址而不是localhost/127.0.0.1。 - Martin
2个回答

0

你的用户是否拥有访问本地数据库的特权?你是如何创建这个用户的?

grant all on database.* to 'user'@'localhost' identified by 'password';
grant all on database.* to 'user'@'%' identified by 'password';

两种方法都可以解决问题。我以前没有指定主机名就遇到过问题。


0

你能修改你的IPTables吗?如果可以,尝试添加这个规则:

iptables -I INPUT -s 127.0.0.1 -p tcp --dport 3306 -j ACCEPT

有一个规则允许tcp在0.0.0.0 dpt:3306上运行。而且我已经插入了这个额外的规则。 - Martin
@Martin 如果您再次对本地主机进行nmap扫描,是否仍然显示端口3306为“已过滤”?如果您实际插入了上述规则,则不应该如此。它应该被显示为开放状态(OPEN)。如果上述方法不起作用,请使用iptables -F清除iptables并尝试重新连接,以确保不是iptables阻止了连接。但我99.999%确定问题出在您的防火墙,因为telnet超时而nmap显示端口3306已过滤。底线是不应该出现这种情况。 - Icarus
@Nate C-K:好问题。我没有看到问题的那一部分(我猜Martin更新了它)。我不知道为什么Perl会连接,但如果中间没有任何东西,telnet到localhost 3306应该会有回应。 - Icarus
@Icarus 我已经尝试了刷新结果,但之后我无法连接服务器。我将进一步调查服务器供应商的可能性,也许我在那里错过了什么。 - Martin
Perl 可以连接到 Socket,但 JDBC 不能吗? - Martin
@Martin:rcSuSEfirewall2重启将恢复IP表到先前的状态。如果Perl也是这种情况,那么telnet也可以工作,因为telnet也会打开一个套接字连接。相反,Perl可能通过命名管道连接到MySQL(但这仅适用于Windows),这就是为什么它可能成功的原因;但在远程情况下,除非通过tcp/ip或udp进行连接,否则没有其他连接从一台计算机到另一台计算机的方式。 - Icarus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接