作为 LAMP/LEMP 重要的一环,MySQL 的重要性不言而喻。不过相较于 Apache/Nginx 和 PHP 来说,MySQL 8.0 的安装和配置属实要费点功夫,坑还不少。

安装

添加 APT 存储库

在 Debian 下安装需要先添加 APT 存储库。访问这个链接:MySQL :: Download MySQL APT Repository,就能看到最新的存储库版本号,例如 mysql-apt-config_0.8.14-1_all.deb。之后执行:

wget https://dev.mysql.com/get/mysql-apt-config_0.8.14-1_all.deb
sudo dpkg -i mysql-apt-config*

默认选择就是 mysql-8.0,所以直接往下选 Ok 即可。

国外 VPS 可以进行下一步。国内 VPS 使用默认镜像速度实在感人,所以这里我们使用清华大学的 MySQL 镜像。执行以下命令:

echo "deb https://mirrors.tuna.tsinghua.edu.cn/mysql/apt/debian $(lsb_release -sc) mysql-8.0 mysql-tools" > /etc/apt/sources.list.d/mysql.list

更新存储库

sudo apt update

如果在上一步使用了旧版的存储库,这里可能报一个 “The following signatures were invalid: EXPKEYSIG XXXXX” 的错误,使用最新版的即可。

安装 MySQL

sudo apt install mysql-server

Step 1

进入 Package configuration 界面后,第一步是输入 root 用户的密码。由于 MySQL 8.0 中移除了密码验证插件,所以此时并不要求 “大写字母+小写字母+数字+符号” 这样的强密码,甚至可以使用 “123456”,但是为了安全还是建议至少使用 “大写字母+小写字母+数字” 这样的组合,以确保安全。

对于密码验证组件感兴趣的话,可以自行查阅官网文档:MySQL :: MySQL 8.0 Reference Manual :: 6.4.3 The Password Validation Component

Step 2

第二步是要求选择认证方式。MySQL 8.0 采用了新插件 caching_sha2_password,但是目前只有 PHP 7.4 支持 caching_sha2_password,所以如果你的 PHP 版本小于等于 7.3,那么建议选择第二项 “Use Legacy Authentication Method”;PHP 7.4 的 mysqli 默认使用的就是 caching_sha2_password,所以如果你的 PHP 是 7.4 版的话选择第一项 “Use Strong Password Encryption” 即可。

配置

允许远程访问

安装完的第一件事当然是允许远程访问了。执行:

mysql -u root -p

输入密码进入 mysql,之后执行:

use mysql;
UPDATE user SET host='%' WHERE user='root';
flush privileges;

就可以远程访问了。

更改认证方式

之前的步骤里说过认证插件的问题。实际上在 Step 2 选第二项 “Use Legacy Authentication Method” 的效果仅是将 root 用户的插件变成 mysql_native_password,并在 /etc/mysql/mysql.conf.d/ 目录新建了 default-auth-override.cnf 文件,里面的内容是:

# This file is automatically generated by MySQL Maintainer Scripts
[mysqld]
default-authentication-plugin = mysql_native_password

这样,新创建的账户默认都会使用 mysql_native_password 插件。如果之后需要使用新插件 caching_sha2_password 的话(例如更新到了 PHP 7.4),只需要删除这个文件或者注释掉这一行,再进入 mysql,改变相应用户的插件即可:

use mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY 'yourpassword';
flush privileges;

反之亦然,如果使用低版本的 PHP 报了 “PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]” 这样的错误的话,将上面的 caching_sha2_password 换成 mysql_native_password 再执行就可以了。

下面的命令可以查询每个账户的认证插件:

SELECT user,host,plugin FROM mysql.user;
执行结果
执行结果

重置密码

忘记密码确实是一件让人脑阔痛的事情,不过解决起来也很方便。先在 /etc/mysql/mysql.conf.d/ 目录下的 mysqld.cnf 文件中加一行,从而跳过权限验证:

skip-grant-tables
修改后的 mysqld.cnf
修改后的 mysqld.cnf

之后重启 MySQL:

systemctl restart mysql

此时无需输入密码,直接回车就可以进入 mysql:

mysql -u root -p

执行以下命令,清除密码:

use mysql;
UPDATE user SET authentication_string='' WHERE user='root';
quit;

此时 root 用户是空密码,也是直接回车就可以进入 mysql:

mysql -u root -p

现在修改密码:

use mysql;
ALTER USER 'root'@'%' IDENTIFIED BY 'newpassword';
flush privileges;
quit;

密码修改完毕。


作为 LEMP 必不可少的成员,Nginx 和 PHP 的安装配置比 MySQL 稍微简单一些,可以参考 Debian 下安装 Nginx 和 PHP-FPM