缘起

日常工作用的服务器还在用Ubuntu14.04,这不18.04都发布了,于是想赶紧新装一台,折腾好了就迁移过去;装好18.04之后安装MySQL,按照往常方式apt-get安装,结果竟然没有提示录入root密码的地方。直接mysql -uroot -p回车,结果跟想的一样密码错误。

研究

经过研究发现,MySQL5.7较之之前版本在性能和安全性上都有了很大进步,安全性进步的一大体现便是安装时不再让你输入root密码,而是自动生成一个密码;对于不同发行版本的Linux来说,有所差异,Debian系(Ubuntu)是把密码存在了/etc/mysql/debian.cnf文件里,RedHat(CentOS)则是在/var/log/mysqld.log文件里(用关键词 temporary passowrd)

更改默认密码

找到默认密码之后,在shell下直接用默认密码登陆,对于Ubuntu来说,由于默认没提供root用户,需要在默认的debian-sys-maint用户下更改root的密码:

use mysql;
#更改默认的安全认证插件方式为mysql_native_password;
update user set plugin='mysql_native_password' where user='root'; 
#更改密码
update user set authentication_string=PASSWORD('这里输入你要改的密码') where user='root'; 
#更新所有操作权限
flush privileges; 

关于MySQL中auth_socket方式的说明:

If you install 5.7 and don’t provide a password to the root user, it will use the auth_socket plugin. That plugin doesn’t care and doesn’t need a password. It just checks if the user is connecting using a UNIX socket and then compares the username.

简单翻译一下:MySQL5.7如果没给root用户配置密码,安装程序会默认增加一个采用auth_socket的root用户, 需更改plugin为mysql_native_password 才能密码登陆;这个插件不关心也不需要一个密码,它只检测是否通过Unix socket方式连接,并且操作系统登陆用户名与mysql用户名是否一致,如果一致就可以无密码登录,否则不让登陆。

在不做设置的情况下,可以通过socket的方式登录(需要注意必须root权限才能执行sock文件):

sudo mysql --protocol=socket --socket=/var/run/mysqld/mysqld.sock

另外一种方案就是将auth_socket改为默认的mysql_native_password即可(也就是本文的方案)。

对于CentOS则简单多了:

SET PASSWORD = PASSWORD('这里输入你要改的密码'); 

参考 1 2 3