如果在Linux终端中登录MySQL时遇到下面类型的错误:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
此错误可以直观的看出是登录被拒绝,原因通常为密码错误。
如果你是刚通过yum或apt-get安装完MySQL,这时你是不知道root的登录密码的,尝试登录肯定登录失败。
这时你可以在MySQL的运行日志文件中尝试找到root的初始密码,MySQL日志路径为:/var/log/mysql/mysql.log
但如果你并没有在日志文件中发现密码的存在,此时就要通过另一种方法,跳过MySQL登录的授权表,也就是说谁都能进入mysql看到所有数据表,输入任意字符账号密码都可以登录。
现在开始操作:
进入到这个配置文件
# sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
或
# sudo vim /etc/my.cnf
如果这两个文件都不在或无效可以通过全局搜索找一下MySQL配置文件的位置(以.cnf结尾):
# sudo find / -name "my*.cnf"
进到配置文件然后在这个配置文件中的 [mysqld] 下面一行中加入skip-grant-tables这句话
重新启动MySQL (Ubuntu)
# service mysql restart
重新启动MySQL (CentOS 7.0)
# systemctl restart mysql
登录MySQL
# mysql -uroot -p
进入库中并更新密码的字段值
>update mysql.user set authentication_string=Password("123.com") where User="root";
>flush privileges;
重新进入到mysqld.cnf文件中去把刚开始加的skip-grant-tables这条语句给注释掉
再返回终端输入:
# mysql -uroot -p123.com;
应该就可以进入数据库了。
| Host | User | authentication_string |
+--------+--------------+----------------------------------------+
| % | root | *THISISNOTAVALIDPASSWORDTHA |
+--------+--------------+----------------------------------------+
2 rows in set (0.00 sec)
--------------------------------------------------------------------------------------
如果此时还是不能进入到数据库,那么就需要返回第一步中,取消刚才注释掉的那条语句使它重新生效,再重新进入mysql中
执行:
>select User,plugin from mysql.user;
+------------------+------------+
| User | plugin
+------------------+------------+
| root | auth_socket
+------------------+------------+
1 rows in set (0.01 sec)
可以看到错误原因是因为plugin root的字段的值是auth_socket,那我们改掉它,替换为mysql_native_password就行了。
>update user set plugin='mysql_native_password' where user='root';
再输入:
>select User,plugin from mysql.user;
+------+-----------------------+
| User | plugin |
+------+-----------------------+
| root | mysql_native_password |
+------+-----------------------+
1 row in set (0.01 sec)
我们能看到root用户的字段改成功了。此时退出MySQL,将第一步文件中的skip-grant-tables再次注释掉并重启MySQL就可以正常登录了。