欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

mysql的各种纠结 有大用

【写在前面】因为配置新服,碰到了各种mysql的问题,在此记录一下。文章比较长,各位可以挑着看。

1、Warning: mysql_connect() [function.mysql-connect]: [2002] 口口口口口口口口 (trying to connect via .......)

由于乱码,只好搜索一下关键字 " mysql_connect 2002 ",是“由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败”。有人提到win7的host文件,有人提到php5.3.1不能装5.0.88的mysql数据库(这个着实让我吓一跳,搞不好得再重装耶)。

找来找去,还是觉得得知道这个口口口口是什么。确认了一下页面编码,是utf-8没错,头尾的中文echo输出也都正常。到底怎么回事呢?突然灵机一动,把页面设为GB2312编码,欧了!错误提示是“由于目标机器积极拒绝,无法连接。”,Warning: mysql_connect() [function.mysql-connect]: [2002] 由于目标机器积极拒绝,无法连接。 (trying to connect via tcp://192.168.52.193:3306) in  D:\xampp\htdocs\moodle\lib\moodlelib.php on line 9944 

经过确认重新确认host,username,password,以及用户拥有的权限无误后,又检查了一下防火墙,也是没有问题。

到底是怎么回事呢?mysql的各种纠结 - 飞鱼 - 鱼儿 悠悠各种郁闷。

运行了cmd,执行 telnet 192.168.52.193 3306 一直连接失败。想了一下,自己好像不是很明白这个telnet做啥用的,于是搜索,看到了下文:

       遇到一个很搞笑的问题,开启mysql之后

telnet localhost 3306  成功

telnet 192.168.20.204 3306 失败  //192.168.20.204是我机器的IP地址

百湿不得其姐的时候,打开my.cnf看了一下

原来开启了bind-address=127.0.0.1

注释掉,重启mysql,就OK了。

【来源】http://david-wangweijia.blogbus.com/logs/60376312.html

   速度地就去check了mysql的配置文件,果然,193的配置比本地的配置多了bind-address=127.0.0.1。用#注释bind-address=127.0.0.1后再来过一遍,问题解决。
唉。。。可算搞定了,查东西看得眼珠子都要掉出来了。

如果有人碰到其他原因,欢迎将解决办法跟在评论中。

 

2、Can't get hostname for your address

某Web应用的数据库部署在 100.ZZZ.YYY.XXX 的 MySql 5.5.5 实例(新装机器)上,

但是当用PHP或者Python从远端机器上试图访问该数据库时,会得到如下错误提示:

“Can't get hostname for your address”。

需要琢磨一下才能明白,这句提示是 MySql Server 返回给客户端的。

也就是说,MySql Server在试图对客户端IP地址进行反向域名解析,试图得到主机名,然而我们发起访问的客户端要么是自己

的机器,要么是机房的服务器,所以无法得到主机名,MySql Server 遂报错,拒绝客户端连接。


错误截屏

譬如,Python会得到这样的异常:

mysql的各种纠结 - 飞鱼 - 鱼儿 悠悠
事件日志的报告
此时 MySql Server 所在服务器上,Windows 事件日志出现了如下错误: 
事件类型:    警告
事件来源:    MySQL
事件种类:    无
事件 ID:    100
日期:        2010-01-01
事件:        11:29:13
用户:        N/A
计算机:    SERVERII
描述:
IP address '100.ZZZ.YYY.XXX' could not be resolved: getnameinfo() returned error (code: 11004).

For more information, see Help and Support Center at http://www.mysql.com


 【简单解释】
MySQL server received a request from you to allow you to connect to the database. So next thing it tried to do is to check what name is bound to your IP address (name resolution) and it failed to do so. So it just denied you access.

可以这么理解mysql处理客户端解析的过程:
1,当 mysql client 发起连接请求时,MySql Server 会主动去查 client 的主机名。
2,首先查找Windows系统目录下 /etc/hosts 文件,搜索域名和IP的对应关系。
3,如果hosts文件没有,则查找DNS设置,如果没有设置DNS服务器,会立刻返回失败;如果设置了DNS服务器,就进行反向解析,直到timeout。

  
【解决办法】
第一种方法:修改Hosts

在 MySql Server 所在服务器上,修改 Windows 的 hosts 文件,增加一行记录,如:

100.ZZZ.YYY.XXX dummy.ju690.cn

然后在 100.ZZZ.YYY.XXX 机器上用 Python 发起连接请求,经测试,可以正常连接,说明 MySql Server 这下可以通过 getnameinfo() 解析出100.ZZZ.YYY.XXX 的主机名了。

但这种方法很机械,所以一般采用下面这种方法。


第二种方法:修改MySql 的配置文件 my.ini

The solution:
Just add skip-name-resolve option to your MySQL configuration file (my.ini).

在 MySql Server 的配置文件 My.ini 中,增加如下两行:

[mysqld]

skip-name-resolve
 

它将禁止 MySql Server 对外部连接进行 DNS 解析,使用这一选项可以消除 MySql 进行 DNS 解析的时间。

但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求。

参考:
http://www.ixdba.net/article/89/2127.html
http://blog.chinaunix.net/u/25264/showart_1936561.html

 
可能的后果

如果开启 skip-name-resolve 选项,要确认 MySql 是否采用过主机名的授权,
在 mysql 中运行如下命令:

mysql> select user,host from mysql.user where host <> 'localhost' ;

一般会得到以“%”授权(也就是任何地址)的记录:

+------------------+-------------+
| user             | host        |
+------------------+-------------+
| root             | %           |
| user_sync | 192.168.0.113 |

如果有host名是什么“DB1”“DB2”的,那么删除授权表中有 hostanme 的记录,然后重启mysqld。

【说明】本人用的是修改mysql配置文件的方法,ok。这里补充一下SQL操作。

授予权限:grant 权限 on 对象 to 用户

拒绝权限:deny 权限 on 对象 to 用户

回收权限:revoke 权限 on 对象 from 用户

【来源】http://www.cnblogs.com/zhengyun_ustc/archive/2010/10/13/skip_name_resolve.html

 

3、192.168.X.X is not allowed to connect to this MySQL server

觉得很奇怪,明明已经授权(GRANT SELECT,INSERT,UPDATE,DELETE ON yourdb.*  TO 'root'@'192.168.X.X' IDENTIFIED BY 'XXXX' )了。CHECK了一下,发现自己把@客户端写成了@mysql主机 。修正,完成。

【参考】如果你想连接你的mysql的时候发生这个错误:
ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL server
解决方法:
1。 改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称"%"
mysql -u root -pvmwaremysql>use mysql;mysql>update user set host = '%' where user = 'root';mysql>select host, user from user;
2. 授权法。例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
如果你想允许用户myuser从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.10.40.54' IDENTIFIED BY '123456' WITH GRANT OPTION;

【来源】http://till.iteye.com/blog/115659

 

【附】MySQL常见错误代码说明(红色文字为其他地方搜集补充进来的)
1005:创建表失败 
1006:创建数据库失败 
1007:数据库已存在,创建数据库失败 
1008:数据库不存在,删除数据库失败 
1009:不能删除数据库文件导致删除数据库失败 
1010:不能删除数据目录导致删除数据库失败 
1011:删除数据库文件失败 
1012:不能读取系统表中的记录 
1016错误:文件无法打开,使用后台修复或者使用phpmyadmin进行修复。
1020:记录已被其他用户修改 
1021:硬盘剩余空间不足,请加大硬盘可用空间 
1022:关键字重复,更改记录失败 
1023:关闭时发生错误 
1024:读文件错误 
1025:更改名字时发生错误 
1026:写文件错误 
1032:记录不存在 
1036:数据表是只读的,不能对它进行修改 
1037:系统内存不足,请重启数据库或重启服务器 
1038:用于排序的内存不足,请增大排序缓冲区 
1040:已到达数据库的最大连接数,请加大数据库可用连接数 
1041:系统内存不足 
1042:无效的主机名 
1043:无效连接 
1044:当前用户没有访问数据库的权限 【错误:数据库用户权限不足,请联系空间商解决 】
1045:不能连接数据库,用户名或密码错误 【错误:数据库服务器/用户名/数据库名/数据库密码错误,请联系空间商检查帐户。】
1048:字段不能为空 
1049:数据库不存在 
1050:数据表已存在 
1051:数据表不存在 
1054:字段不存在 【错误:程序文件跟数据库有冲突,请使用正确的程序文件上传上去覆盖。】
1065:无效的SQL语句,SQL语句为空 
1081:不能建立Socket连接 
1114:数据表已满,不能容纳任何记录 
1116:打开的数据表太多 
1129:数据库出现异常,请重启数据库 【数据库l连接数过大,请重启数据库】
1130:连接数据库失败,没有连接数据库的权限 
1133:数据库用户不存在 
1141:当前用户无权访问数据库 
1142:当前用户无权访问数据表 
1143:当前用户无权访问数据表中的字段 
1146:数据表不存在 【数据表缺失,请恢复备份数据】
1147:未定义用户对数据表的访问权限 
1149:SQL语句语法错误 
1158:网络错误,出现读错误,请检查网络连接状况 
1159:网络错误,读超时,请检查网络连接状况 
1160:网络错误,出现写错误,请检查网络连接状况 
1161:网络错误,写超时,请检查网络连接状况 
1062:字段值重复,入库失败 
1169:字段值重复,更新记录失败 
1177:打开数据表失败 
1180:提交事务失败 
1181:回滚事务失败 
1203:当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或重启数据库 
1205:加锁超时 
1211:当前用户没有创建用户的权限 
1216:外键约束检查失败,更新子表记录失败 
1217:外键约束检查失败,删除或修改主表记录失败 
1226:当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器 
1227:权限不足,您无权进行此操作 
1235:MySQL版本过低,不具有本功能 
2002:Can't connect to ...通常意味着没有一个MySQL服务器运行在系统上或当试图连接mysqld服务器时,你正在使用一个错误的套接字文件或TCP/IP端口

【来源】http://www.siutung.org/post/506/

 
 
 
 
阅读(1876)| 评论(2)
推荐转载

在LOFTER的更多文章

评论

  登录后你可以发表评论,请先登录。登录>>
2014-05-16 10:55
我是 win 7 x64系统,使用yii的gii功能出现A valid database connection is required to run this generator in yii 
报错,我写了段测试代码:
$conn_string = 'mysql:host=127.0.0.1;dbname=blog';
$db = new PDO($conn_string,'root','root');
$sql = 'select * from tbl_comment';
$result = $db->query($sql);
while($row = $result->fetch()){
print_r($row);
}
出现错误如下:
[2002] 由于目标计算机积极拒绝 无法连接
找半天,后来我把C:\ProgramData\MySQL\MySQL Server 5.6\my.ini 端口由3308改为3306默认端口,一切都OK了!
来自 http://gslfaye.blog.163.com/blog/static/1221252212011614102712716/
普通分类: