MySQL可以远程连接但不能本地连接

时间:2010-12-24 00:22:32

标签: mysql node.js

这是一个奇怪的问题,我不确定发生了什么。我在运行Ubuntu 10.04 LTS的Linux机器上安装了MySQL。我可以通过SSH mysql -p访问mysql并以这种方式执行我的所有命令。我添加了一个用户,我可以使用AddedUser从我的机器远程连接,但不能从本地机器连接。这对我没有意义......

SELECT host, user FROM mysql.user收益率:

+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | AddedUser        |
| 127.0.0.1 | root             |
| li241-255 | root             |
| localhost | debian-sys-maint |
| localhost | root             |
+-----------+------------------+

问题是我正在使用Node.js在这台机器上开发,我无法使用相同的用户名从服务器本地连接。我试过FLUSH PRIVILEGES,但似乎没有效果。

我知道它不是Node.js,因为我在另一个数据库上使用相同的代码并且它在该环境中工作。

修改

这是错误节点给我的。

node.js:50
    throw e; // process.nextTick error, or 'error' event on first tick
    ^
Error: ECONNREFUSED, Connection refused
    at Stream._onConnect (net.js:687:18)
    at IOWatcher.onWritable [as callback] (net.js:284:12)

修改2

我有正确的端口&服务器就像我能说的那样。我的/etc/mysql/my.cnf包含以下内容:

port            = 3306
socket          = /var/run/mysqld/mysqld.sock

我的MySQL对象包含:

{ host: 'localhost',
  port: 3306,
  user: 'removed',
  password: 'removed',
  database: '',
  typeCast: true,
  flags: 260047,
  maxPacketSize: 16777216,
  charsetNumber: 192,
  debug: false,
  ending: false,
  connected: false,
  _greeting: null,
  _queue: [],
  _connection: null,
  _parser: null,
  server: 'ExternalIpAddress' }

可能有用吗?

netstat -ln | grep mysql
unix  2      [ ACC ]     STREAM     LISTENING     1016418  /var/run/mysqld/mysqld.sock

8 个答案:

答案 0 :(得分:4)

Connection Refused在TCP / IP协议级别发出信号,表示您的本地连接尝试使用了错误的主机名和/或(更可能是)端口号。

编辑:这是另一种(不可否认的低概率)可能性:

  1. 您在JS对象中定义了hostserver,在这种情况下,node.js可能优先于server
  2. 如果externalIPaddress位于NAT防火墙的另一侧,则防火墙可能(实际上应该)配置为丢弃到端口3306的传入流量。
  3. 当您尝试连接时,您的数据包首先被路由到NAT防火墙并在那里被丢弃。
  4. 确认同时设置serverhost不会导致此问题。

答案 1 :(得分:3)

您需要设置socketPath

mysql = require('mysql');
var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : 'password',
    socketPath  : '/var/run/mysqld/mysqld.sock',

});

答案 2 :(得分:2)

手动定义套接字为我解决了这个问题。

var client = mysql.createClient({
    user: '(your user here)',
    password: '(your password here)',
    host: '127.0.0.1',
    port: '3306',
    _socket: '/var/run/mysqld/mysqld.sock',
});

答案 3 :(得分:1)

我有类似的问题,但使用MongoDB。我认为您需要将host指向127.0.0.1而不是localhost

检查:

$ nslookup localhost

$ nslookup localhost.

两者都应返回127.0.0.1的地址

同时检查cat /etc/hosts

如果localhost映射到ipv6:::1 localhost 然后改为127.0.0.1 localhost

localhost可能指向ipv6地址而不是ipv4地址。

希望这会有所帮助:)

答案 4 :(得分:1)

同样的问题。 我刚刚在mysql配置文件中用 skip-networking 评论了该行,问题消失了

答案 5 :(得分:0)

正如第一个也是一个好的答案所说,MySQL没有收听你的本地TCP / IP套接字。

使用以下方式连接mysql.Client模块:

  

client.port = '/tmp/mysql.sock';

并填写您的mysql套接字文件所在的位置。如果你找不到这个,请考虑使用这个沉重但成功保证的全系统搜索

  

cd / ; find * | grep mysql.sock

答案 6 :(得分:0)

在my.cnf中,我将bind-address更改为0.0.0.0,现在我的节点应用程序的连接被正确接受了。

答案 7 :(得分:0)

对我来说,这个问题发生在只能在我们的内部网络上访问的Ubuntu盒子上(尽管我认为无论网络如何,这个解决方案都适用)。我能够很好地使用mysql Workshop和我的开发系统中的Node.js mysql插件访问mysql,但来自运行在服务器上的Node。

特别是,我尝试了localhost,127.0.0.1甚至是'serverName',在/ etc / hosts中定义为127 ....我什么都没有,但ECONNREFUSED。

原来我的mysql实例设置为只接受发往服务器IP地址的连接。也就是说,它只接受来自

的连接

{host:'172.xxx.xxx.xxx',user:'blah',....

祝你好运!!