今天折腾 mysql 的时候,遇到一个问题。我在mac book上下载最新的 mysql -5.6.15-osx10.7-x86_64,在连接一个远程的 mysql 服务器(5.0.77版)时报如下的异常: [baoniu@zkb-MacbookAir bin]$ mysql -h10.232.41.14 -uazkaban -pazkabanWarning: Using a pas
今天折腾mysql的时候,遇到一个问题。我在mac book上下载最新的mysql-5.6.15-osx10.7-x86_64,在连接一个远程的mysql服务器(5.0.77版)时报如下的异常:
[baoniu@zkb-MacbookAir bin]$ mysql -h10.232.41.14 -uazkaban -pazkaban Warning: Using a password on the command line interface can be insecure. ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)
看字面意思是两边的mysql版本不一致, 使用了mysql 4.1.1之前的授权协议连接时被拒绝。奇怪,本地的版本更新,远程的mysql是5.0.77版也大于4.1.1啊?后来查到在服务器上的密码加密是打开了old_passwords,用的旧的加密方式。
本质原因是:mysql变更过哈希加密的方法,早前是16位以下的,而在4.1以后是更长的hash。
可以测试下:
mysql> SELECT PASSWORD("baoniu"); +--------------------+ | PASSWORD("baoniu") | +--------------------+ | 36552eac6dd793f6 | +--------------------+ 1 row in set (0.00 sec)
这是16位的hash,查看old_password选项的值:
mysql> show variables like '%password%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | old_passwords | ON | +---------------+-------+ 1 row in set (0.00 sec)
可以在当前会话里面设置密码格式:
mysql> set old_passwords=0; Query OK, 0 rows affected (0.00 sec) mysql> show variables like "%password%"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | old_passwords | OFF | +---------------+-------+ 1 row in set (0.01 sec)
现在试下新密码的hash长度:
mysql> select password("baoniu"); +-------------------------------------------+ | password("baoniu") | +-------------------------------------------+ | *64BB8A91878B304CAEBD3141D835ED18531FD69A | +-------------------------------------------+ 1 row in set (0.03 sec)
如果执行
SELECT * FROM mysql.user;
查看mysql.user表可以发现,长密码和短密码都有。
现在,创建新用户:
create user 'baoniu' IDENTIFIED BY 'mypassword';
通过
select * from mysql.user order by User;
可以看到新建用户baoniu的密码hash值是长的。
接着可以授权用户 baoniu 远程登录权限:
Grant all privileges on *.* to 'baoniu'@'%' identified by 'mypassword';
格式:grant 权限 on 数据库名.表名 to 用户@登录主机 identified by “用户密码”; @ 后面是访问mysql的客户端ip地址(或是主机名) % 代表任意的客户端,如果填写 localhost 为本地访问(那此用户就不能远程访问该mysql数据库了)。
flush privileges;
(让刚才的内容立即生效)
至此,新创建的用户 baoniu 就可以远程登录了,不会再报这个异常信息了。
如果想把老的账号都改用新的hash方式,可以执行:
SELECT Host, User, Password FROM mysql.user WHERE LENGTH(Password) <p>参考:<br> 1. MySQL_4.1之后的哈希加密问题<br> 2. mysql-error-2049-hy000-connection-using-old-pre-4-1-1-authentication-protoc</p> <p class="copyright"> 原文地址:记MySQL的哈希加密问题导致的远程连接异常:”ERROR 2049 (HY000): Connec, 感谢原作者分享。 </p>