我没有得到访问外部的MySQL。 我认为这是MySQL或防火墙的东西或在MySQL内的一些特权。
我已经尝试过在互联网上的步骤。 我将把这个过程一步一步地举例来说明我正在做什么,并作为另一个有这个问题的人的教程:
我在用着:
-ubuntu server 12.04 -mysql-server5.5 -there is NO hardware firewall just software one
1-首先我安装了mysql:
sudo apt-get install mysql-server
我通过以下方式更改了root密码:
sudo /etc/init.d/mysql stop sudo mysqld --skip-grant-tables & mysql -u root mysql UPDATE user SET Password=PASSWORD('MYPASSWORD') WHERE User='root'; FLUSH PRIVILEGES; exit;
3-我给所有特权根到任何IP:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES;
4-编辑my.cnf后
sudo nano /etc/mysql/my.cnf
我评论如下:
#skip-external-locking #bind-address = 127.0.0.1
5我编辑了iptables以允许MySql 3306:
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
现在键入netstat -ant:
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN tcp 0 0 66.123.173.170:53 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN tcp 0 0 66.123.173.170:22 189.32.2.232:49167 ESTABLISHED tcp 0 336 66.123.173.170:22 189.32.2.232:49654 ESTABLISHED tcp6 0 0 :::110 :::* LISTEN tcp6 0 0 :::143 :::* LISTEN tcp6 0 0 :::8080 :::* LISTEN tcp6 0 0 :::21 :::* LISTEN tcp6 0 0 :::53 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:953 :::* LISTEN tcp6 0 0 :::25 :::* LISTEN tcp6 0 0 :::993 :::* LISTEN tcp6 0 0 :::995 :::* LISTEN tcp6 0 0 127.0.0.1:8005 :::* LISTEN
看到端口3306是开放的! 我对吗?
6-我重新启动了mysql:
sudo service mysql start
我input了:
service mysql status
结果:
mysql start/running, process 20757
我试图连接到服务器:
mysql -h 66.123.173.170 -u root -p
我得到这个错误:
错误2003(HY000):无法连接到'66 .123.173.170'(111)上的MySQL服务器
当我做:
mysql -h 127.0.0.1 -u root -p
它工作于MySQL>terminal
8-疑惑:你看这个过程有什么问题吗?
OBS:在第四步,我也尝试把绑定地址设置为bid-address = 0.0.0.0,但是没有解决问题。
9-DOUBT:如果我closuresMySQL: service mysql stop
然后,我可以用mysql -h 127.0.0.1 -u root -p来访问防火墙吗?
我做到了,我甚至可以连接mysql停止/等待(这是MySQL停止和检索状态后给出的状态)。
恢复解决方案:
我杀了持有3306端口的mysqld并重新启动它。
我认为这是一个错误或相关的问题一步一步检查我做了什么:
1-创建一个程序连接3306
首先我用Java创建一个简单的程序,以确保我的防火墙没有任何问题。 程序只需在3306上用TCP连接打开一个端口2分钟即可测试,程序:
import java.io.IOException; import java.net.serverSocket; public class PortMysqlTest { public static void main(String[] args) { int port = 3306; serverSocket ss = null; try { ss = new serverSocket(port); ss.setReuseAddress(true); } catch (IOException e) { System.out.println(e.getMessage()); } long futureTime = System.currentTimeMillis() + 1000 * 60 * 2; while (System.currentTimeMillis() < futureTime) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } if (ss != null) { try { ss.close(); } catch (IOException e) { System.out.println(e.getMessage()); } } }
2-停止了mysql服务
在执行程序之前,我停止了mysql服务:
sudo service mysql stop
或者可以通过以下方式完成:
/etc/init.d/mysql stop
3-用java PortMysqlTest启动我的程序
我的程序(PortMysqlTest)抛出一个异常,说明地址/端口已被mysqld使用!
惊喜? 据我所知,与MySQL服务停止的端口应该是免费的。 我对吗? (我不确定是否有人可以回答这个…)
我搜索了使用地址/端口的应用程序PID:
sudo netstat -lpn | grep 3306
答案:
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 6736/mysqld
5-我杀了这个过程:
kill -9 6736
OBS,如果你不知道是什么杀的话:6736是拿着端口的过程,我用第4步得到了这个数6736 / mysqld
6-现在我再次运行我的程序:
java PortMysqlTest和telnet连接(telnet 66.123.173.170 3306)externaly和它的工作 !
所以问题不是防火墙 ,因为我可以外部连接到机器66.123.173.170。
7-再次启动mysql服务:
(我等了2分钟,我的程序停止并释放3306端口),然后再次启动mysql服务来测试:
sudo service mysql start
要么
sudo /etc/init.d/mysql start
我用外网连接了外网:
telnet 66.123.173.170 3306
和工作!
我尝试连接到MySQL后:
mysql -h 66.123.173.170 -u root -p
和工作!
结论:我认为我的MySql安装有一个错误, 或者什么的,(我不知道是什么),当重新启动mysql时,mysql没有得到配置:
bind-address = 0.0.0.0
要么
bind-address = *
我希望这可以帮助别人。
你的netstat输出显示它没有对外部连接开放,它应该在那里显示0.0.0.0
,而不是127.0.0.1
(这是回送,不是本地的)。
您可能需要添加一个不同的bind-address
到您的MySQL配置(并且不要忘记重新启动服务)。
尝试
bind-address = *
或者你的实际网卡ip( 66.123.173.170
)也许。
您需要将my.cnf中的绑定地址设置为0.0.0.0,而不仅仅是注释掉该行。
作为一个方面说明,你可能不应该允许所有IP地址的根访问,就像你说的配置它一样。 我只将根限制在本地机器上。
默认情况下MySQL在本地主机上侦听。 您需要将其配置为在您的实际界面上运行,或者您可以在绑定中使用0.0.0.0地址。