如何从命令行管理MySQL数据库和用户

时间:2020-03-05 15:30:22  来源:igfitidea点击:

MySQL是最流行的开源关系数据库管理系统。
MySQL服务器允许我们创建许多用户和数据库,并授予适当的特权,以便用户可以访问和管理数据库。

本教程说明了如何使用命令行来创建和管理MySQL或者MariaDB数据库以及用户。

在你开始之前

在开始本教程之前,我们假设我们已经在系统上安装了MySQL或者MariaDB服务器。
所有命令将以root用户身份执行。

要打开MySQL提示符,请键入以下命令,并在出现提示时输入MySQL root用户密码:

mysql -u root -p

创建一个新的MySQL数据库

要创建新的MySQL数据库,请运行以下命令,只需将“ database_name”替换为我们要创建的数据库的名称即可:

CREATE DATABASE database_name;
Query OK, 1 row affected (0.00 sec)

如果我们尝试创建一个已经存在的数据库,则会看到以下错误消息:

ERROR 1007 (HY000): Can't create database 'database_name'; database exists

为避免错误,如果存在与我们要创建的名称相同的数据库,则可以使用以下命令:

CREATE DATABASE IF NOT EXISTS database_name;
Query OK, 1 row affected, 1 warning (0.00 sec)

在上面的输出中,“查询确定”表示查询成功,“ 1警告”告诉我们该数据库已存在,并且未创建新数据库。

列出所有MySQL数据库

我们可以使用以下命令列出我们的MySQL或者MariaDB服务器上存在的所有数据库:

SHOW DATABASES;

输出将如下所示:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| database_name      |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

“ information_schema”,“ mysql”,“ performance_schema”和“ sys”数据库是在安装时创建的,它们存储有关所有其他数据库,系统配置,用户,权限和其他重要数据的信息。
这些数据库对于MySQL安装的正确功能是必需的。

删除MySQL数据库

删除MySQL数据库就像运行单个命令一样简单。

这是不可逆的操作,应谨慎执行。
确保我们没有删除错误的数据库,因为一旦删除数据库就无法恢复。

要删除MySQL或者MariaDB,数据库运行以下命令:

DROP DATABASE database_name;
Query OK, 0 rows affected (0.00 sec)

如果我们尝试删除一个不存在的数据库,则会看到以下错误消息:

ERROR 1008 (HY000): Can't drop database 'database_name'; database doesn't exist

为避免此错误,可以使用以下命令:

DROP DATABASE IF EXISTS database_name;

创建一个新的MySQL用户帐户

MySQL中的用户帐户由用户名和主机名部分组成。

要创建新的MySQL用户帐户,请运行以下命令,只需将“ database_user”替换为要创建的用户名即可:

CREATE USER 'database_user'@'localhost' IDENTIFIED BY 'user_password';

在上面的命令中,我们将主机名部分设置为“ localhost”,这意味着该用户将只能从本地主机(例如:从运行MySQL Server的系统)连接到MySQL服务器。
如果要授予来自其他主机的访问权限,只需使用远程计算机IP更改“本地主机”或者在主机部分使用“%”通配符,这意味着该用户帐户将能够从任何主机进行连接。

与使用数据库来避免在尝试创建已经存在的用户帐户时出错时相同,可以使用:

CREATE USER IF NOT EXISTS 'database_user'@'localhost' IDENTIFIED BY 'user_password';
Query OK, 0 rows affected, 1 warning (0.00 sec)

修改MySQL用户帐号密码

更改MySQL或者MariaDB用户帐户密码的语法取决于我们在系统上运行的服务器版本。

我们可以通过发出以下命令来找到服务器版本:

mysql --version

如果我们拥有MySQL 5.7.6和更高版本或者MariaDB 10.1.20和更高版本,请使用以下命令来更改密码:

ALTER USER 'database_user'@'localhost' IDENTIFIED BY 'new_password';

如果我们拥有MySQL 5.7.5及更高版本或者MariaDB 10.1.20及更高版本,请使用:

SET PASSWORD FOR 'database_user'@'localhost' = PASSWORD('new_password');

在这两种情况下,输出应如下所示:

Query OK, 0 rows affected (0.00 sec)

列出所有MySQL用户帐户

我们可以通过查询“ mysql.users”表列出所有MySQL或者MariaDB用户帐户:

SELECT user, host FROM mysql.user;

输出应类似于以下内容:

+------------------+-----------+
| user             | host      |
+------------------+-----------+
| database_user    | %         |
| database_user    | localhost |
| debian-sys-maint | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
6 rows in set (0.00 sec)

删除MySQL用户帐户

要删除用户帐户,请使用以下命令:

DROP USER 'database_user@'localhost';

如果我们尝试删除不存在的用户帐户,则会发生错误。

ERROR 1396 (HY000): Operation DROP USER failed for 'database_user'@'localhost'

与使用数据库以避免错误时相同,可以使用:

DROP USER IF EXISTS 'database_user'@'localhost';
Query OK, 0 rows affected, 1 warning (0.00 sec)

向MySQL用户帐户授予权限

可以向用户帐户授予多种类型的特权。
我们可以在此处找到MySQL支持的特权的完整列表。

在本教程中,我们将介绍几个示例:

要授予对特定数据库用户帐户的所有特权,请使用以下命令:

GRANT ALL PRIVILEGES ON database_name.* TO 'database_user'@'localhost';

要授予对所有数据库用户帐户的所有特权,请使用以下命令:

GRANT ALL PRIVILEGES ON *.* TO 'database_user'@'localhost';

要对数据库中的特定表授予用户帐户的所有特权,请使用以下命令:

GRANT ALL PRIVILEGES ON database_name.table_name TO 'database_user'@'localhost';

如果要仅授予特定数据库类型的用户帐户特定特权,请执行以下操作:

GRANT SELECT, INSERT, DELETE ON database_name.* TO database_user@'localhost';

从MySQL用户帐户撤消权限

如果我们需要撤消一个用户帐户的一个或者多个特权或者所有特权,则语法几乎与授予它相同。
例如,如果要撤消特定数据库上用户帐户的所有特权,请使用以下命令:

REVOKE ALL PRIVILEGES ON database_name.* TO 'database_user'@'localhost';

显示MySQL用户帐户权限

查找授予特定MySQL用户帐户类型的特权:

SHOW GRANTS FOR 'database_user'@'localhost';
+---------------------------------------------------------------------------+
| Grants for database_user@localhost                                        |
+---------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'database_user'@'localhost'                         |
| GRANT ALL PRIVILEGES ON `database_name`.* TO 'database_user'@'localhost'  |
+---------------------------------------------------------------------------+
2 rows in set (0.00 sec)