- 本文环境
- 云服务器:腾讯云(不同厂商云服务器上的操作基本相同)
- 系统: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 | # 启动 |
停止和启动命令的演示
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 | # 创建用户并设置密码 |
输入下面命令,重新加载授权表并将更改更新到 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 | # 没修改过 root 用户身份验证方式 |
说明
- 推荐的做法是创建一个普通用户,并为其授予适当的权限,用来远程访问数据库
- 该部分可以参考本文 修改 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 | # 使用名为 mysql 的数据库 |
再次查看 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 用户名
结束!