Ubuntu 安装和配置 MySQL(含远程连接)

记录下 MySQL 在 Ubuntu 上的安装和相关配置

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

一、安装 MySQL

1.更新软件包列表

sudo apt update

2.查看是否安装 MySQL

dpkg -l | grep mysql


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

3.安装 MySQL

sudo apt install mysql-server


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

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

mysql --version


注:写本文时的版本为 8.0.34

4.查看 MySQL 状态

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

sudo systemctl status mysql


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

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

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

# 启动
sudo systemctl start mysql
# 停止
sudo systemctl stop mysql
# 重启
sudo systemctl restart mysql

停止和启动命令的演示

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

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

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

sudo systemctl disable mysql


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

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

sudo systemctl enabled mysql


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

二、MySQL 安全配置向导

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

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

sudo mysql


登入成功后输出如上图

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

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

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


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

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

修改

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

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


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

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

FLUSH PRIVILEGES;


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

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


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

修改后登录

输入exit退出 MySQL

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

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

mysql -u root -p

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

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

登录成功

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

创建

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

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


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

FLUSH PRIVILEGES;


查看创建用户的权限

show grants for new_root@localhost;


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

登录创建用户

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

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

mysql -u new_root -p

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

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

登录成功

四、配置远程连接

先使用 root 身份登录 MySQL

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

说明

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

1.修改 host

查看 root 用户的 host

SELECT user,host FROM mysql.user;


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

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


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

2.注释掉 bind-address

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

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


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

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

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

3.重启 mysql 服务

sudo systemctl restart mysql

4.云服务器放行 3306 端口

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


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

5.测试连接

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

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

结束!