不知道我这文章名字这样写是否精确,但是我在5.1.37 和 5.1.60 两个版本上碰到了这样的问题。
以前网站链接数据库的用户权限是 grant all on *.* to user identified by 'password'
后来感觉这样的权限太大,想修改为只能从特定主机访问特定库,于是执行
revoke all on *.* from user;
然后重新赋权限:revoke all on ledb.* from user@192.168.100.10;
之后flush privileges;
然后到192.168.100.10机器上登陆mysql,执行mysql -uuser -h192.168.100.11 -p
注:192.168.100.11是mysql服务器ip
登陆成功,但是无法执行任何操作,例如执行show databases;
会提示如下报错:
mysql> show databases;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 197738
Current database: *** NONE ***
ERROR 2013 (HY000): Lost connection to MySQL server during query
查看mysql服务器错误日志,有如下报错:
131120 11:28:01 [Warning] Aborted connection 5058 to db: 'unconnected' user: '7cacti5' host: 'localhost' (init_connect command failed)
后来尝试了:删除用户,在重新授权,也不行。
最后 查询错误日志里的错误提示(init_connect command failed),总算在mysql官网找到了答案,原来这是一个bug。官网上给出了修复方法,在此贴出,希望能帮到别人。
How to repeat: mysql -uroot -P5137 ------------- DROP USER 'roel'@'localhost'; DROP PROCEDURE IF EXISTS LOGINUSER; CREATE USER 'roel'@'localhost'; GRANT SELECT ON *.* TO 'roel'@'localhost'; DELIMITER // CREATE PROCEDURE LOGINUSER() BEGIN SELECT USER(),CURRENT_USER(); SELECT CONCAT(CURRENT_DATE(),' ',CURRENT_TIME()); END; // DELIMITER ; SET @@global.init_connect='CALL LOGINUSER();';
SET @@global.init_connect='';
Query OK, 0 rows affected (0.00 sec)
然后,重新给用户授权即可解决问题。
虽然问题搞定了,但是还不是很清楚原理,看修复过程,应该是掉用init_connect这个命令的时候出错,然后重建了这个命令或功能。
原文链接:http://bugs.mysql.com/bug.php?id=47032