如何在Ubuntu20.04上安装MySQL

来自菜鸟教程
跳转至:导航、​搜索

介绍

MySQL 是一个开源数据库管理系统,通常作为流行的 LAMP(Linux、Apache、MySQL、PHP/Python/Perl)堆栈的一部分安装。 它实现了关系模型并使用结构化查询语言(更好地称为 SQL)来管理其数据。

本教程将介绍如何在 Ubuntu 20.04 服务器上安装 MySQL 8.0 版。 通过完成它,您将拥有一个工作关系数据库,您可以使用它来构建您的下一个网站或应用程序。

先决条件

要遵循本教程,您将需要:

  • 一台 Ubuntu 20.04 服务器,具有非 root 管理用户和配置了 UFW 的防火墙。 要进行设置,请按照我们的 Ubuntu 20.04 初始服务器设置指南进行操作。

您还可以使用嵌入在此页面上的交互式终端来尝试在本教程中安装和配置 MySQL。 单击下面的Launch an Interactive Terminal!按钮开始使用。

启动交互式终端!

第 1 步 — 安装 MySQL

在 Ubuntu 20.04 上,您可以使用 APT 软件包存储库安装 MySQL。 在撰写本文时,默认 Ubuntu 存储库中可用的 MySQL 版本为 8.0.27 版。

要安装它,如果您最近没有这样做,请更新服务器上的包索引:

sudo apt update

然后安装mysql-server包:

sudo apt install mysql-server

使用 systemctl start 命令确保服务器正在运行:

sudo systemctl start mysql.service

这些命令将安装和启动 MySQL,但不会提示您设置密码或进行任何其他配置更改。 因为这会使您的 MySQL 安装不安全,我们将在接下来解决这个问题。

第 2 步 — 配置 MySQL

对于 MySQL 的全新安装,您需要运行 DBMS 包含的安全脚本。 此脚本更改了一些不太安全的默认选项,例如远程 root 登录和示例用户。

使用 sudo 运行安全脚本:

sudo mysql_secure_installation

这将引导您完成一系列提示,您可以在其中对 MySQL 安装的安全选项进行一些更改。 第一个提示将询问您是否要设置验证密码插件,该插件可用于在认为新用户有效之前测试新 MySQL 用户的密码强度。

如果您选择设置验证密码插件,则您创建的任何使用密码进行身份验证的 MySQL 用户都需要具有满足您选择的策略的密码。 最强的策略级别(您可以通过输入 2 来选择)要求密码长度至少为 8 个字符,并且包括大写、小写、数字和特殊字符的混合:

OutputSecuring the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: Y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
 2

无论您是否选择设置验证密码插件,下一个提示都是为 MySQL root 用户设置密码。 输入并确认您选择的安全密码:

OutputPlease set the password for root here.


New password:

Re-enter new password:

请注意,即使您为 root MySQL 用户设置了密码,该用户当前未配置为在连接到 MySQL shell 时使用密码进行身份验证。

如果您使用了验证密码插件,您将收到有关新密码强度的反馈。 然后脚本将询问您是要继续使用刚刚输入的密码还是要输入新密码。 假设您对刚刚输入的密码强度感到满意,请输入 Y 继续执行脚本:

OutputEstimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y

从那里,您可以按 Y 然后按 ENTER 接受所有后续问题的默认值。 这将删除一些匿名用户和测试数据库,禁用远程 root 登录,并加载这些新规则,以便 MySQL 立即尊重您所做的更改。

脚本完成后,您的 MySQL 安装将得到保护。 您现在可以继续使用 MySQL 客户端创建专用数据库用户。

第 3 步 — 创建专用 MySQL 用户并授予权限

安装后,MySQL 会创建一个 root 用户帐户,您可以使用它来管理您的数据库。 此用户对 MySQL 服务器拥有完全权限,这意味着它可以完全控制每个数据库、表、用户等。 因此,最好避免在管理功能之外使用此帐户。 此步骤概述了如何使用 root MySQL 用户创建新用户帐户并授予其权限。

在运行 MySQL 5.7(及更高版本)的 Ubuntu 系统中,root MySQL 用户默认设置为使用 auth_socket 插件进行身份验证,而不是使用密码。 该插件要求调用 MySQL 客户端的操作系统用户名与命令中指定的 MySQL 用户名匹配,因此必须以 sudo 权限调用 mysql 才能访问root MySQL 用户:

sudo mysql

注意: 如果您使用其他教程安装 MySQL 并为 root 启用密码验证,则需要使用不同的命令来访问 MySQL shell。 以下将以常规用户权限运行您的 MySQL 客户端,并且您只能通过身份验证获得数据库内的管理员权限:

mysql -u root -p

访问 MySQL 提示后,您可以使用 CREATE USER 语句创建新用户。 这些遵循以下一般语法:

CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';

CREATE USER 之后,指定用户名。 紧随其后的是 @ 符号,然后是该用户将连接的主机名。 如果你只打算从你的 Ubuntu 服务器本地访问这个用户,你可以指定 localhost。 并不总是需要将用户名和主机都用单引号括起来,但这样做有助于防止错误。

在选择用户的身份验证插件时,您有多种选择。 前面提到的auth_socket插件可以很方便,因为它提供了强大的安全性,不需要有效用户输入密码来访问数据库。 但它也阻止了远程连接,当外部程序需要与 MySQL 交互时,这会使事情变得复杂。

作为替代方案,您可以完全省略语法的 WITH authentication_plugin 部分,让用户使用 MySQL 的默认插件 caching_sha2_password 进行身份验证。 MySQL 文档推荐这个插件 给想要使用密码登录的用户,因为它具有强大的安全功能。

运行以下命令以创建使用 caching_sha2_password 进行身份验证的用户。 请务必将 sammy 更改为您的首选用户名,并将 password 更改为您选择的强密码:

CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password';

注意:某些版本的 PHP 存在一个已知问题,导致 caching_sha2_password 出现问题。 如果您计划将此数据库与 PHP 应用程序(例如 phpMyAdmin)一起使用,您可能希望创建一个用户,该用户将使用较旧但仍然安全的 mysql_native_password 插件进行身份验证:

CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

如果您不确定,您始终可以创建一个使用 caching_sha2_plugin 进行身份验证的用户,然后稍后使用以下命令对其进行 ALTER 身份验证:

ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

创建新用户后,您可以授予他们适当的权限。 授予用户权限的一般语法如下:

GRANT PRIVILEGE ON database.table TO 'username'@'host';

此示例语法中的 PRIVILEGE 值定义了允许用户在指定的 databasetable 上执行的操作。 您可以在一个命令中向同一用户授予多个权限,每个命令之间用逗号分隔。 您还可以通过输入星号 (*) 代替数据库和表名来全局授予用户权限。 在 SQL 中,星号是用于表示“所有”数据库或表的特殊字符。

为了说明,以下命令授予用户对 CREATEALTERDROP 数据库、表和用户的全局权限,以及对 [来自服务器上任何表的 X166X]、UPDATEDELETE 数据。 它还授予用户使用 SELECT 查询数据、使用 REFERENCES 关键字创建外键以及使用 RELOAD 权限执行 FLUSH 操作的能力。 但是,您应该只授予用户他们需要的权限,因此可以根据需要随意调整您自己用户的权限。

您可以在 官方 MySQL 文档 中找到可用权限的完整列表。

运行此 GRANT 语句,将 sammy 替换为您自己的 MySQL 用户名,以将这些权限授予您的用户:

GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'localhost' WITH GRANT OPTION;

请注意,此语句还包括 WITH GRANT OPTION。 这将允许您的 MySQL 用户将其拥有的任何权限授予系统上的其他用户。

Warning:一些用户可能希望授予他们的 MySQL 用户 ALL PRIVILEGES 权限,这将为他们提供类似于 root 用户权限的广泛超级用户权限,如下所示:

GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;

不应轻易授予如此广泛的特权 ' ,因为任何有权访问此 MySQL 用户的人都将完全控制服务器上的每个数据库。


在此之后,最好运行 FLUSH PRIVILEGES 命令。 这将释放服务器由于前面的 CREATE USERGRANT 语句而缓存的所有内存:

FLUSH PRIVILEGES;

然后就可以退出 MySQL 客户端了:

exit

将来,要以新的 MySQL 用户身份登录,您将使用如下命令:

mysql -u sammy -p

-p 标志将导致 MySQL 客户端提示您输入 MySQL 用户的密码以进行身份验证。

最后,让我们测试一下 MySQL 的安装。

第 4 步 — 测试 MySQL

不管你如何安装它,MySQL 应该已经开始自动运行了。 要对此进行测试,请检查其状态。

systemctl status mysql.service

您将看到类似于以下内容的输出:

Output● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2020-04-21 12:56:48 UTC; 6min ago
   Main PID: 10382 (mysqld)
     Status: "Server is operational"
      Tasks: 39 (limit: 1137)
     Memory: 370.0M
     CGroup: /system.slice/mysql.service
             └─10382 /usr/sbin/mysqld

如果 MySQL 没有运行,您可以使用 sudo systemctl start mysql 启动它。

如需进一步检查,您可以尝试使用 mysqladmin 工具连接到数据库,该工具是一个允许您运行管理命令的客户端。 例如,此命令表示以名为 sammy (-u sammy) 的 MySQL 用户身份连接,提示输入密码 (-p),并返回版本。 请务必将 sammy 更改为您的专用 MySQL 用户的名称,并在出现提示时输入该用户的密码:

sudo mysqladmin -p -u sammy version

您应该会看到与此类似的输出:

Outputmysqladmin  Ver 8.0.19-0ubuntu5 for Linux on x86_64 ((Ubuntu))
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version        8.0.19-0ubuntu5
Protocol version    10
Connection        Localhost via UNIX socket
UNIX socket        /var/run/mysqld/mysqld.sock
Uptime:            10 min 44 sec

Threads: 2  Questions: 25  Slow queries: 0  Opens: 149  Flush tables: 3  Open tables: 69  Queries per second avg: 0.038

这意味着 MySQL 已启动并正在运行。

结论

您现在已经在服务器上安装了基本的 MySQL 设置。 以下是您可以采取的后续步骤的一些示例: