现象:修改完root密码之后,退出mysql,重启mysql服务,然后想用新密码登陆mysql,发现登不上去了。
一,碰到这种问题的原因是,在给用户改密码的时候没有使用password()函数对密码加密。如下:
mysql> update user set password=‘[email protected]‘ where user=‘root‘;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> quit
# mysql -u root -p
Enter password: ********
ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
使用select查询mysql库里的user表,可以发现在user表中,密码都是以加密的形式存在的。
mysql> select * from user where user="root";
....
| localhost | root | *A00C34073A26B40AB4307650BFB9309D6BFA6999 | Y | Y | Y | Y
....
如果直接指定‘set password=‘[email protected]‘ ,mysql就会认为‘[email protected]‘是一个加密后的字符串,所以与这个加密字符串对应的
密码自然不是‘[email protected]‘了,而是另外一个位置的值。
正确的修改root密码的命令应该是
mysql> update user set password=password(‘[email protected]‘) where user=‘root‘;
二,现在知道原因了。但是我们登不上数据库,怎么办呢。解决方法如下:
1,找到当前数据库进程,并将其杀死
2,进入到mysql的安装目录,进入到bin目录,执行mysqld_safe --skip-grant-tables (默认安装路径/usr/local/mysql/bin)
经过这一步,mysql服务就会以一种忽略用户权限的方式启动,就能使用mysql进行无密码登陆了。可以通过ps aux | grep mysql查看服务已经启动
3,重新打开一个控制台,再次执行‘mysql‘命令,这次可以无密码登陆了
4,使用正确的命令重新修改密码
5,使用密码登陆,OK了
6,最好使用以下命令刷新一下系统权限(不然别人还可以无密码登陆)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)