OperationalError:(OperationalError)(2003,“无法连接到'192.168.129.139'(111)”上的MySQL服务器)无无

问题描述:

我想在运行12.04的Ubuntu机器上使用mysql创建远程数据库。OperationalError:(OperationalError)(2003,“无法连接到'192.168.129.139'(111)”上的MySQL服务器)无无

它有一个启用了远程登录并且没有密码的root用户。我已经启动了服务器。输出的

sudo netstat -tap | grep mysql 

显示

tcp  0  0 localhost:mysql   *:*      LISTEN  13246/mysqld 

我已经创建了一个称为nwtopology使用数据库(如所提到的根不具有密码尚未。)

create database nwtopology 
grant all privileges on *.* to [email protected] 
FLUSH PRIVILEGES; 

从同时运行Ubuntu 12.04的客户端机器我使用python脚本使用sqlal连接到远程mysql数据库chemy。

from pox.core import core 
import pox.openflow.libopenflow_01 as of 
import re 
import datetime 
import time 
from sqlalchemy import create_engine, ForeignKey 
from sqlalchemy import Column, Date, Integer, String 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import relationship, backref 
from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 
from sqlalchemy.sql.expression import exists 

log = core.getLogger() 
engine = create_engine('mysql://[email protected]/nwtopology', echo=False) 
Base = declarative_base() 
Session = sessionmaker(bind=engine) 
session = Session() 

class SourcetoPort(Base): 
    """""" 
    __tablename__ = 'source_to_port' 
    id = Column(Integer, primary_key=True) 
    port_no  = Column(Integer) 
    src_address = Column(String,index=True) 

    #----------------------------------------- 
    def __init__(self, src_address,port_no): 
     """""" 
     self.src_address = src_address 
     self.port_no  = port_no 

create_engine()调用失败,出现以下错误。

POX 0.1.0 (betta)/Copyright 2011-2013 James McCauley, et al. 
Traceback (most recent call last): 
    File "/home/karthik/ms_thesis/pox/pox/boot.py", line 89, in do_import2 
    __import__(name, globals(), locals()) 
    File "/home/karthik/ms_thesis/pox/custom/tutorial.py", line 39, in <module> 
    Base.metadata.create_all(engine) 
    File "/usr/lib/python2.7/dist-packages/sqlalchemy/schema.py", line 2515, in create_all 
    tables=tables) 
    File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 2230, in _run_visitor 
    conn = self.contextual_connect(close_with_result=False) 
    File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 2340, in contextual_connect 
    self.pool.connect(), 
    File "/usr/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 210, in connect 
    return _ConnectionFairy(self).checkout() 
    File "/usr/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 371, in __init__ 
    rec = self._connection_record = pool._do_get() 
    File "/usr/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 697, in _do_get 
    con = self._create_connection() 
    File "/usr/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 174, in _create_connection 
    return _ConnectionRecord(self) 
    File "/usr/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 256, in __init__ 
    self.connection = self.__connect() 
    File "/usr/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 316, in __connect 
    connection = self.__pool._creator() 
    File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/strategies.py", line 80, in connect 
    return dialect.connect(*cargs, **cparams) 
    File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 280, in connect 
    return self.dbapi.connect(*cargs, **cparams) 
    File "/usr/lib/python2.7/dist-packages/MySQLdb/__init__.py", line 81, in Connect 
    return Connection(*args, **kwargs) 
    File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 187, in __init__ 
    super(Connection, self).__init__(*args, **kwargs2) 
OperationalError: (OperationalError) (2003, "Can't connect to MySQL server on '192.168.129.139' (111)") None None 

我想不通为什么会发生这种情况?

+3

错误告诉你,没有MySQL服务器在主机192.168.129.139的'mysql'端口上侦听。事实上,在那个港口听来可能什么都没有。 (你可以在shell中用'nc 192.168.129.139 3306'或者Python中的'socket.create_connection'来验证。) – abarnert 2013-05-09 22:32:05

+0

如果你问_why_没有服务器在那里监听......这不是Python的问题,或者一个编程问题;你配置了错误的东西,你可能想要去http://serverfault.com寻求帮助。 – abarnert 2013-05-09 22:32:42

+2

同时,有三种明显的可能性:(1)192.168.129.139不是运行MySQL的机器的地址。 (2)MySQL不在您尝试连接的同一端口上运行。我相信默认端口是3306(和我的'/ etc/services'同意...),但是你可以配置它在任何端口上运行,并且你可以将任何端口传递给connect调用。 (3)MySQL服务正在监听错误的接口 - 例如,它正在本地主机上侦听,并且您尝试通过eth0进行连接,反之亦然。 – abarnert 2013-05-09 22:35:59

看起来像mysql被配置为仅侦听本地主机。

您可以通过在客户端计算机上运行telnet 192.168.129.139 3306来进行测试。

最可能的原因 - mysqld被配置为这样做。

请尽量遵守Configuration step described here

编辑/etc/mysql/my.cnf文件到MySQL配置侦听来自网络主机的连接,更改绑定地址指令的服务器的IP地址。例如用适当的地址替换192.168.0.5。如果没有这样的条目 - 取消注释或创建新行。

bind-address   = 192.168.0.5 

然后重启mysqld

​​

然后用telnet或通过再次运行你的应用程序进行测试。另外netstat会有mysqld的第二项。

+0

+1感谢您的清晰轮廓。如果有人这样做,仍然无法连接(并正在运行Ubuntu),那么请检查您的防火墙设置并允许3306作为端口。 – 2016-10-04 23:48:13

+0

我还必须创建一个具有足够权限的新用户,可以从外部连接(请参阅[这里](http://stackoverflow.com/questions/1559955/host-xxx-xx-xxx-xxx-is-not-允许对连接到这个MySQL的服务器))。 – MBR 2017-05-11 08:41:11

+0

我遵循了答案中给出的内容,但仍无法使其正常工作。然后我发现“bind-address”参数在“/etc/mysql/mysql.conf.d/mysqld.cnf”文件中。评论它在那里,它的工作! – Yahya 2017-08-17 07:18:58