介绍
MySQL是一个开源的关系数据库管理系统。它通常部署为LAMP堆栈(代表Linux,Apache,MySQL和PHP)的一部分,并且在撰写本文时,它是世界上最受欢迎的开源数据库。
本指南概述了如何创建新的MySQL用户并授予他们执行各种操作所需的权限。
先决条件
为了遵循本指南,您需要访问 MySQL 数据库。本指南假定此数据库安装在运行 Ubuntu 20.04 的虚拟专用服务器上,尽管无论您如何访问数据库,它概述的原则都应该适用。
如果您无权访问MySQL数据库,并且想自己设置一个,则可以按照我们关于如何安装MySQL的指南之一进行操作。同样,无论您的服务器底层操作系统如何,创建新MySQL用户并授予他们权限的方法通常是相同的。
创建新用户
安装后,MySQL会创建一个根用户帐户,您可以使用该帐户来管理数据库。该用户对MySQL服务器具有完全权限,这意味着它可以完全控制每个数据库,表,用户等。因此,最好避免在管理功能之外使用此帐户。此步骤概述了如何使用根MySQL用户创建新的用户帐户并授予其权限。
在运行MySQL(及更高版本)的Ubuntu系统中,默认情况下,根MySQL用户设置为使用插件进行身份验证,而不是使用密码进行身份验证。此插件要求调用 MySQL 客户端的操作系统用户的名称与命令中指定的 MySQL 用户的名称匹配。这意味着您需要在命令前面加上以根 Ubuntu 用户的权限调用它,以便访问根 MySQL 用户:5.7 auth_socket mysql sudo
sudo mysql
注意:如果您的根 MySQL 用户配置为使用密码进行身份验证,则需要使用其他命令来访问 MySQL shell。以下内容将以常规用户权限运行您的 MySQL 客户端,并且您只能通过使用正确的密码进行身份验证来获得数据库中的管理员权限:
mysql -u root -p
访问 MySQL 提示符后,您可以使用语句创建新用户。这些遵循以下常规语法:CREATE USER
CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';
之后,指定用户名。紧跟一个符号,然后是此用户将从中连接的主机名。如果您只计划从 Ubuntu 服务器本地访问此用户,则可以指定 .将用户名和主机都括在单引号中并不总是必要的,但这样做有助于防止错误。CREATE USER@localhost
在选择用户的身份验证插件时,您有多种选择。前面提到的插件可能很方便,因为它提供了强大的安全性,而无需有效用户输入密码即可访问数据库。但它也可以防止远程连接,当外部程序需要与MySQL交互时,这可能会使事情复杂化。auth_socket
作为替代方案,您可以完全省略语法部分,让用户使用 MySQL 的默认插件进行身份验证。MySQL文档建议想要使用密码登录的用户使用此插件,因为它具有强大的安全功能。WITH authentication_plugin caching_sha2_password
运行以下命令以创建使用 进行身份验证的用户。请务必更改为您的首选用户名和您选择的强密码:caching_sha2_password sammy password
CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password';
注意:某些版本的 PHP 存在一个已知问题,该问题会导致 出现问题。如果您计划将此数据库与PHP应用程序(例如phpMyAdmin)一起使用,则可能需要创建一个用户,该用户将使用较旧的,但仍然安全的插件进行身份验证caching_sha2_password 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';
此示例语法中的值定义允许用户对指定的 和 执行的操作。您可以在一个命令中向同一用户授予多个权限,方法是用逗号分隔每个权限。还可以通过输入星号 () 代替数据库和表名称来全局授予用户权限。在 SQL 中,星号是用于表示“所有”数据库或表的特殊字符。PRIVILEGEdatabasetable*
为了说明这一点,以下命令授予用户对 、 和数据库、表和用户的全局权限,以及服务器上任何表中的 、 和数据的权限。它还授予用户使用 查询数据的能力,使用关键字创建外键,并使用特权执行操作。但是,您应该只授予用户所需的权限,因此请根据需要随意调整自己用户的权限。CREATEALTERDROPINSERTUPDATEDELETESELECTREFERENCESFLUSHRELOAD
您可以在官方MySQL文档中找到可用权限的完整列表。
运行此语句,替换为您自己的 MySQL 用户名,以向您的用户授予这些权限:GRANT sammy
GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
请注意,此语句还包括 。这将允许您的MySQL用户向系统上的其他用户授予其拥有的任何权限。WITH GRANT OPTION
警告:某些用户可能希望授予其MySQL用户权限,这将为他们提供类似于root用户权限的广泛超级用户权限,如下所示:ALL PRIVILEGES
GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
不应轻易授予如此广泛的权限,因为任何有权访问此MySQL用户的人都可以完全控制服务器上的每个数据库。
许多指南建议在 or 语句之后立即运行命令,以便重新加载授权表,以确保新权限生效:FLUSH PRIVILEGESCREATE USERGRANT
FLUSH PRIVILEGES;
但是,根据官方 MySQL 文档,当您使用帐户管理语句间接修改授权表时,数据库会立即将授权表重新加载到内存中,这意味着在我们的例子中不需要该命令。另一方面,运行它不会对系统产生任何负面影响。GRANTFLUSH PRIVILEGES
如果需要撤销权限,其结构几乎与授予权限相同:
REVOKE type_of_permission ON database_name.table_name FROM 'username'@'host';
请注意,撤消权限时,语法要求您使用 ,而不是在授予权限时使用的语法。FROMTO
您可以通过运行以下命令来查看用户的当前权限:SHOW GRANTS
SHOW GRANTS FOR 'username'@'host';
正如您可以使用 删除数据库一样,您可以使用 删除用户:DROP DROP
DROP USER 'username'@'localhost';
创建 MySQL 用户并授予他们权限后,您可以退出 MySQL 客户端:
exit
将来,要以新的MySQL用户身份登录,请使用如下命令:
mysql -u sammy -p
该标志将导致MySQL客户端提示您输入MySQL用户的密码以进行身份验证。-p