Mysql 5.7.28初始化使用root无法登录
背景:
新买的云服务器,Ubuntu系统,在线安装了mysql-5.7.28,初始化之后并成功启动
问题:
打开error.log日志,使用root账号登录失败,从日志中也无法找到临时密码,无法登录
解决方法:
1. 修改配置文件mysqld.cnf,添加配置skip-grant-tables, 重启mysql
#sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
#sudo service mysql restart
2. 使用root账号无密码登录
#mysql -u root -p
3. 查看root账号的信息
mysql> select user, host, authentication_string, plugin from mysql.user where user = 'root' and host = 'localhost' \G
4. 修改root账号的plugin为‘mysql_native_password’,并设置密码
mysql>update mysql.user set plugin = 'mysql_native_password', authentication_string = password('hello123') where user = 'root' and host = 'localhost';
mysql> flush privileges;
5. 修改配置文件mysqld.cnf,注释配置skip-grant-tables, 重启mysql
#sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
6. 使用账号root登录mysql,并输入设置的密码
#mysql -u root -p
总结:
1. 由于在线安装mysql,初始化也是自动完成的,该安装包使用的是--initialize-insecure
方式,所有没有给root创建默认的初始密码,导致在error.log中找不到随机密码。
2. 根据官网解释,如果使用--initialize-insecure
方式,只需要使用命令mysql -u root --skip-password登录后设置密码即可,但是试过方式失败,原因是因为root的plugin使用的是“auth_socket”而不是“mysql_native_password". 在官网暂未找到为何plugin会被设置成”auth_socket"的原因。
3. auth_socket,是检验连接是否通过unix套接字实现的,而不是校验账号密码的,如果账号的plugin选择的是auth_socket,即使设置了密码,也是无法通过账号密码登录的,详情可参考官网 https://dev.mysql.com/doc/refman/5.7/en/socket-pluggable-authentication.html