• 本文环境
    • 云服务器:腾讯云(不同厂商云服务器上的操作基本相同)
    • 系统:Ubuntu 22.04 LTS
    • 终端:腾讯云 OrcaTerm(可使用 Xshell+Xftp 代替)
  • 本文全部 shell 终端指令均执行在 root  用户下(命令前的sudo可不加),如果是非 root 用户也许本文中某些没加sudo命令也要加上sudo

一、安装 MySQL

1.更新软件包列表

1
sudo apt update

2.查看是否安装 MySQL

1
dpkg -l | grep mysql


如果输入上述命令后没有任何的输出(如上图),则说明没有安装 MySQL

3.安装 MySQL

1
sudo apt install mysql-server


这里列出了软件包的相关信息并询问你是否继续安装
输入y后回车确定继续安装
等待安装完后再输入第 2 步的命令查看 MySQL 是否已经安装

输出如上图,说明 MySQL 已经安装成功
安装的 MySQL 版本默认为当前 apt 源中最新的稳定版本,可以输入下面的命令查看 MySQL 版本

1
mysql --version


注:写本文时的版本为 8.0.34

4.查看 MySQL 状态

一旦安装完成,MySQL 服务将会自动启动,想要查看 MySQL 服务运行状态可以输入下面命令查看

1
sudo systemctl status mysql


输出显示 MySQL 服务已经被启动,并且正在运行

5.启动、重启、停止 MySQL 服务的命令

上一步的命令可以用来查看 MySQL 服务的运行状态,下面是启动、重启、停止命令

1
2
3
4
5
6
# 启动
sudo systemctl start mysql
# 停止
sudo systemctl stop mysql
# 重启
sudo systemctl restart mysql

停止和启动命令的演示

6.开机自启动设置(可选)

注:使用systemd管理服务,前提是使用 apt 安装的 MySQL
当前新版本的 MySQL 服务默认是开机自启动,可以通过前面的sudo systemctl status mysql命令查看

该处的参数为enabled,说明当前 MySQL 服务是开机自启动
可以用下面命令关闭开机自启动

1
sudo systemctl disable mysql


查看状态可以发现原本的enabled参数变成了disabled,说明 MySQL 服务不再是开机自启动

附上开启开机自启动的命令

1
sudo systemctl enabled mysql


再次查看状态就可以发现又变回了enabled

二、MySQL 安全配置向导

MySQL 安装文件时会附带一个名为mysql_secure_installation的脚本,我们可以通过运行该脚本提高 MySQL 的安全性

1
sudo mysql_secure_installation


这里有一个插件VALIDATE PASSWORD PLUGIN,它可以测试 MySQL 用户密码的强度,并且提高安全性,如果你想设置验证密码插件,按y回车后移动到下一个步骤
注:如果不想设置复杂密码(比如想设置密码是 123456)的建议选择输入n不设置验证密码的插件,因为即使是下面的 LOW 策略也要求密码长度至少为 8 位(安全性哪有方便重要

这里给出了低级,中级,高级三个级别的密码验证策略

  • 低级 长度 >= 8
  • 中级 在低级的基础上,需要同时包含数字,大小写字母和特殊字符
  • 高级 在中级的基础上,要求密码不能存在字典文件中

可以输入对应级别前的数字进行选择,这边选择了 STRONG(即 2)

注:这里是输入 2 后回车,显示的上半部分内容,我在写本文时从网上找到的教程在这里都会有要你设置密码的一步,但是在新版本的 MySQL 是没有的,被上面这段话代替了,翻译过来的意思是:

默认情况下,使用 auth_socket 进行身份验证,因此跳过为 root 用户设置密码。
如果你想改用密码身份验证,可以使用”ALTER_USER”命令进行设置。
请参考 https://dev.mysql.com/doc/refman/8.0/en/alter-user.html#alter-user-password-management 获取更多信息。

这边仅做一个补充,为 root 用户设置密码的操作在第三部分会提到


询问是否删除匿名用户,建议输入y删除

  • 在 MySQL 中,默认情况下会存在一个匿名用户(没有用户名和密码就可以登录),该用户具有一些基本的权限
  • 如果每个用户都有明确的身份和权限,可以更容易地追踪和监视数据库的活动,识别潜在的安全问题
  • 为了确保数据库仅允许经过授权的用户进行访问和操作,减少潜在的安全风险,建议删除匿名用户


询问是否禁止 root 远程登录,根据自己需求选择,如果你想要使用 root 用户远程连接 MySQL 数据库,可以输入任意键跳过该设置
出于安全考虑,建议输入y禁止

  • root 是 MySQL 数据库的超级管理员,拥有最高权限,一旦泄露后果非常严重,禁止 root 用户远程登录可以降低潜在的风险
  • 更推荐的做法是创建一个普通用户,并为其授予适当的权限,以便远程访问数据库,这样做可以限制对数据库的访问权限,并提供额外的安全层
  • 禁止 root 用户远程登录还可以防止意外的操作或误操作


询问是否删除 test 数据库,输入y删除

询问是否重新加载权限表,输入y重新加载

Success.
All done!

三、修改 root 用户验证方式(可选)

在 MySQL 5.7(及更高版本)的 Ubuntu 系统中,root 用户默认使用 auth_socket 插件授权,而不是通过密码进行身份验证(即使输入了密码也不会验证),但这并不意味着安全性降低,因为他有两个限制:

  • 只能用 UNIX 的 socket 方式登陆,这就保证了只能本地登陆,用户在使用这种登陆方式时已经通过了操作系统的安全验证
  • 操作系统的用户和 MySQL 数据库的用户名必须一致,如果你要登陆 MySQL 的 root 用户,必须使用操作系统的 root 用户

在多数情况下,这可以获得更高的安全性和可用性,但也会阻碍你使用外部程序(如 phpMyAdmin)访问数据库,或者是想使用 root 用户远程连接数据库等
对此有两种解决方案:

  • 将身份验证方式从 auth_socket 修改为 caching_sha2_password(即使用密码验证 root 用户)
    • 我在写本文时从网上找到的教程都是修改为 mysql_native_password,主要原因是因为 caching_sha2_password 在 MySQL 8.0.3 才开始引入,并且由老版本升级为新版本时会出现一些问题
    • 但相比于 mysql_native_password,caching_sha2_password 的安全性更高,从 MySQL 8.0.4 开始,此插件成为 MySQL 服务器的新默认身份验证插件
    • 因为我们安装的是新版的 MySQL,所以我更建议使用 caching_sha2_password
  • 创建一个新的管理用户,拥有所有数据库的访问权限

1.使用 root 身份登录 MySQL

1
sudo mysql


登入成功后输出如上图

2.查看不同用户使用的身份验证方法

输入下面的命令查看数据库对不同用户使用的身份验证方法

1
SELECT user,authentication_string,plugin,host FROM mysql.user;


可以看到 root 用户确实是使用的 auth_socket 插件进行身份验证,并且密码为空

方案一:修改身份验证方式

修改

输入下面命令将 root 用户的身份验证方式 auth_socket 修改成 caching_sha2_password,并设置登录的密码(包含在单引号之间)
注:需要满足在安全配置向导中选择的密码强度

1
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'your_password';


如果设置的密码不满足之前选择的强度则会报下图的错误

最后输入下面命令,重新加载授权表并将更改更新到 MySQL 数据库

1
FLUSH PRIVILEGES;


完成后,再次运行以下命令确认 root 用户不再使用 auth_socket 进行身份验证

1
SELECT user,authentication_string,plugin,host FROM mysql.user;


从上图中,我们可以看到 root 身份验证方式已经修改为 caching_sha2_password,即 root 用户可以使用密码作为验证方式登陆了

修改后登录

输入exit退出 MySQL

由于我们更改了 root 的身份验证方法,因此我们不能再使用之前的命令(即sudo mysql)登录 MySQL

我们在登陆时需要加上用户名和密码参数

1
mysql -u root -p

-u 表示 user,-p 表示 password,当你按下回车后,服务器会要求你输入密码

考虑到安全性,输入的密码不会在屏幕上显示出来,输入正确的密码后回车即可

登录成功

方案二:创建新的管理用户(推荐)

创建

创建一个新的管理用户,并赋予所有数据库的访问权限
注:需要满足在安全配置向导中选择的密码强度

1
2
3
4
# 创建用户并设置密码
CREATE USER 'new_root'@'localhost' IDENTIFIED BY 'your_password';
# 赋予用户所有权限
GRANT ALL PRIVILEGES ON *.* TO 'new_root'@'localhost' WITH GRANT OPTION;


输入下面命令,重新加载授权表并将更改更新到 MySQL 数据库

1
FLUSH PRIVILEGES;


查看创建用户的权限

1
show grants for new_root@localhost;


输出格式怪怪的,可能是终端的问题,但是问题不大
可以看到所有权限都被赋予了我们新创建的 new_root 用户,之后我们就能将该用户当作 root 用户使用

登录创建用户

我们依旧可以使用sudo mysql命令登录 root 用户,但是现在我们想要登录新创建的 new_root 用户
输入exit退出 MySQL

我们在登陆时需要加上用户名和密码参数

1
mysql -u new_root -p

-u 表示 user,-p 表示 password,当你按下回车后,服务器会要求你输入密码

考虑到安全性,输入的密码不会在屏幕上显示出来,输入正确的密码后回车即可

登录成功

四、配置远程连接

先使用 root 身份登录 MySQL

1
2
3
4
# 没修改过 root 用户身份验证方式
sudo mysql
# 修改过 root 用户身份验证方式
mysql -u root -p

说明

  • 推荐的做法是创建一个普通用户,并为其授予适当的权限,用来远程访问数据库
    • 该部分可以参考本文 修改 root 用户验证方式(可选) 中的 方案二:创建新的管理用户 部分
    • 不同的地方在于可以根据自己的实际情况赋予创建的用户权限,相关命令可以自行百度,懒得写了
    • 如果暂时不清楚需要给什么权限,可以先赋予所有权限(跟着方案二即可),后续再修改
  • 如果想要使用 root 用户进行远程连接,请先确保已经跟着方案一修改好了 root 用户的验证方式
  • root 用户或者是自己新创建的用户,后续配置远程连接的操作都是一样的,这里用 root 用户进行演示,如果选择创建一个新的用户进行远程连接,将带有 root 用户名的部分都替换成新创建用户的用户名即可

1.修改 host

查看 root 用户的 host

1
SELECT user,host FROM mysql.user;


如果 root 用户的 host 为localhost,表示只能在本地(该服务器内)登录 root 用户
修改  root  用户的 host  为%
注:host 为%表示所有 ip 都有连接权限

1
2
3
4
5
6
# 使用名为 mysql 的数据库
use mysql
# 修改 host
update user set host = '%' where user = 'root';
# 刷新权限
flush privileges;


再次查看 root 用户的 host,确认已经修改为%

2.注释掉 bind-address

输入exit退出 MySQL,回到 Ubuntu 终端
使用 vim 查看编辑 MySQL 配置文件,输入下面命令后回车

1
vim /etc/mysql/mysql.conf.d/mysqld.cnf


移动光标找到下图中标记的位置

按下i进入 vim 的编辑模式(在英文输入法下)

将该行(意思是只允许本地访问)注释掉(在前面加#
然后按下Esc键退出编辑模式
再输入:wq(包括:号,在英文输入法下)后回车即保存退出

3.重启 mysql 服务

1
sudo systemctl restart mysql

4.云服务器放行 3306 端口

在云服务器厂商找到对应云服务器的防火墙,并放行 3306 端口(MySQL 的默认端口)
这里以腾讯云为例,不同厂商基本都大同小异


有这样一条记录就说明 3306 端口已经放行了

5.测试连接

本文使用 Navicat 测试连接云服务器上的 MySQL

主机填你云服务器的 ip 地址
用户名填你用来进行远程连接的 MySQL 用户名

结束!