第七章 权限与账户管理
1.简介
MySQL是一个多用户数据库,具有功能强大的访问控制系统,可以为不同的用户指定不同的权限。MySQL的用户管理与Linux操作系统类似,主要分为普通用户和root(超级管理员)用户。其中root用户具有所有权限,包括创建普通用户、删除用户和修改用户的密码等管理权限,在实际的项目应用中,可以根据不同的需求创建不同权限的普通用户。

2.权限表
MySQL服务器将用户的登录数据以权限表的形式存储到系统默认的数据库中,当用户访问数据库时,系统会将登录用户的数据与存储在数据库中的相关数据进行信息比对,信息一致则登录成功,否则登录失败。权限表由mysql_install_db脚本初始化,其中存储用户权限的信息表主要有 user、db、host、tables_priv、columns_priv和procs_priv。本节将为读者介绍这些表的内容和作用。MySQL安装完成后,会自动创建默认的数据库,这些数据库中存储着与MySQL相关的配置信息和一些基本数据,使用相关命令查看系统中的数据库,操作代码如下所示。
[root@localhost ~]# mysql -uroot -p123456
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.28-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select version();
+-----------------+
| version() |
+-----------------+
| 10.3.28-MariaDB |
+-----------------+
1 row in set (0.001 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| Chapter_Five |
| information_schema |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.007 sec)

MariaDB [(none)]>
MySQL 5.7默认的数据库包括information_schema、mysql、performance_schema和sys(MySQL5.6 默认的数据库为information_schema、mysql、performance_schema、test),下面将详细介绍这些默认的数据库。
1.information_schema
information_schema数据库中保存着关于MySQL服务器所维护的所有其他数据库的信息,这些信息被统称为元数据。 需要注意,在information_schema 中存在一些只读表, 这些表实际上只是视图,并不是基本表,因此,在这些表中将无法看到与之相关的任何文件。视图是由基本表导出的虚拟表,并不会展示出所有数据,用户只能通过视图修改查看到的数据。information_schema数据库也被称为“系统目录”和“数据字典”,每个用户都有权访问这些表,但只能看到表中与用户访问权限相应的行,其他的信息则会显示为NULL。information_schema数据库中的主要表如表所示。
图片 1.png
图片 2.png
更多关于information_schema数据库的信息读者可以参考更加详细的官方文档。
2.mysql
mysql数据库是系统的核心数据库,主要负责存储数据库的用户、权限设置、关键字等MySQL自己需要使用的控制和管理信息。需要注意,此表不可以删除。另外,如果对MySQL不是很了解,也不建议修改这个数据库里面表的信息。使用相关SQL语句可以查看mysql数据库的表,具体代码如下所示。
MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| column_stats |
| columns_priv |
| db |
| event |
| func |
| general_log |
| gtid_slave_pos |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| host |
| index_stats |
| innodb_index_stats |
| innodb_table_stats |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| roles_mapping |
| servers |
| slow_log |
| table_stats |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| transaction_registry |
| user |
+---------------------------+
31 rows in set (0.001 sec)

MariaDB [mysql]>
mysql数据库中关于系统访问权限和授权信息的表如下。
(1)user:包含用户账户和全局权限以及其他非权限列表(安全配置选项列和资源控制选项列)。
(2)db:数据库级别的权限表。
(3)tables_priv:表级别的权限表。
(4)columns_priv:列级权限表。
(5)procs_priv:存储过程和函数权限表。
(6)proxies_priv:代理用户权限表。
3.performance_schema
performance_schema是MySQL 5.5中加入的一个优化引擎,主要用于收集数据库服务器性能参数,在MySQL 5.7中默认为开启状态(MySQL 5.5中默认为关闭状态)。如果需要开启该引擎,需要在MySQL配置文件my.cnf中设置静态参数performance_schema,具体代码如下所示。
[mysqld]
performance_schema=ON
用户也可以通过相关命令查看performance_schema引擎是否开启,具体的SQL语句如下所示。
MariaDB [mysql]> show variables like 'performance_schema';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| performance_schema | ON |
+--------------------+-------+
1 row in set (0.001 sec)

MariaDB [mysql]>
需要注意,因为performance_schema数据库中表的存储引擎均为PERFORMANCE_SCHEMA,所以用户不能创建存储引擎为PERFORMANCE_SCHEMA的表。
MySQL 服务器维护着许多指示其配置方式的系统变量,这些性能模式表提供了系统变量信息。performance_schema 数据库中的表可以分为以下几类。
(1)设置表:主要用于配置和显示监视特征。
(2)当前事件表:该表包含每个线程的最新事件,按层次不同,可分为阶段事件(events_stages_current)、语句事件(events_statements_current)和事务事件(events_transactions_current)。
(3)历史记录表:与当前事件表具有相同的结构,但包含更多行。如果需要更改历史记录表的大小,可以在服务器启动时设置适当的系统变量。例如,如果需要设置等待事件历史记录表的大小,可以设置performance_schema_events_waits_history_size和performance_schema_events_waits_history_long_size。
(4)汇总表:主要包含按事件组聚合的信息,包括已从历史记录表中丢弃的事件。
(5)实例表:记录了要检测的对象类型,当服务器使用检测对象时,会产生一个事件。这类表提供了事件名称和说明性注释或状态信息。
(6)杂项表:不属于任何其他表组。
需要注意,performance_schema数据库主要收集的是系统性能的数据,而information_schema数据库主要存储的是系统方面的元数据,两者要加以区分。
4.sys
sys数据库所有的数据来自performance_schema数据库,主要是为了将performance_schema数据库的复杂度降低,让数据库管理员(Database Administrator,DBA)能更好地阅读库中的内容并了解库的运行情况。

3.账户管理
MySQL提供丰富的语句来管理用户账户,这些语句主要可以用来登录和退出MySQL服务器、创建和删除用户、管理密码和权限等。数据库的安全性也需要通过账户管理来保证。

4.登录和退出数据库
只有登录到数据库中才可以对数据进行操作。接下来将介绍数据库的登录操作和其相关参数的使用。
1.登录数据库
用户可以通过使用SQL命令并在语句后面指定登录主机名以及用户名和密码来登录数据库,另外,使用mysql --help命令可以查看MySQL命令的帮助信息。MySQL登录命令中常用的参数如下。
(1)-h:使用该参数可以指定主机名(hostname)或IP地址,如果不指定,默认为localhost(本地主机)。
(2)-u:使用该参数可以指定登录的用户(user)。
(3)-p:使用该参数可以指定登录密码(password)。如果该参数后面有一字段,则该字符串将作为用户的密码直接登录;如果该参数后面没有内容,则会在登录的时候提示输入密码。需要注意,该参数后面的字符串和-p之间不能存在空格。
(4)-P:使用该参数可以指定登录MySQL的端口号(Port),如果不指定,默认为3306端口。
(5)-e:使用该参数可以指定执行的SQL语句。需要注意,如果设置了该参数,登录后执行-e后面的命令(或SQL语句)后将自动退出。
(6)数据库名:可以在命令的最后指定数据库名。
为了使读者更加清楚地了解MySQL数据库的登录参数,下面列举出比较常用的命令。例如,使用root用户并且密码为123,登录MySQL数据库的SQL语句如下。
[root@localhost ~]# mysql --user=root --password=123456
也可以通过简写的形式来登录数据库。上方的 SQL 语句可简写如下
[root@localhost ~]# mysql --uroot --p123456
使用root用户并且密码为123,登录到本地MySQL服务器的mytest库中,命令如下。
[root@localhost ~]# mysql --uroot --p123456 mytest
用户如果不指定密码(password),在登录时则会被提醒输入密码。如果密码输入正确,则可以登录到数据库服务器,如下所示。
[root@localhost ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 10.3.28-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
需要注意,MySQL要保证数据的安全性,因此,在这种情况下输入的密码为不可见状态(上方代码的加粗部分)。所以,在实际的操作中建议不要直接在-p参数后指定用户密码,这样可以防止密码暴露。
使用root用户登录到本地MySQL服务器的mytest库中并同时执行一条查询语句的命令如下。
图片 3.png
从上方代码的执行过程可以看出,通过在登录命令中使用-e参数查询出了mytest库中的test表中id为5的数据信息。
2.退出数据库
MySQL服务器登录后可以使用以下3种方式退出。
(1)使用exit命令退出,如下所示。
MariaDB [mysql]> exit
Bye
[root@localhost ~]
(2)使用quit命令退出,如下所示。
MariaDB [mysql]> quit
Bye
[root@localhost ~]
使用\q 命令退出,如下所示。
MariaDB [mysql]> \q
Bye
[root@localhost ~]
另外,用户也可以使用 Ctrl + Z 快捷键将 MySQL 会话窗口隐藏在后台。

5.创建与删除用户
在实际的生产环境中,为了避免用户恶意冒名以root用户身份控制数据库,通常会创建一系列具备适当权限的普通用户,从而尽可能地不用或少使用root用户身份登录系统,以此来确保数据的安全访问。下面将介绍MySQL中创建普通用户的方法。MySQL中使用CREATE USER命令可以创建一个或者多个MySQL用户,并设置相应的登录口令,其语法格式如下所示:
CREATE USER <用户名与登陆主机> identified by [password]
上方语句中“用户名与登录主机”指的是需要创建的用户名和允许登录的主机名或IP地址,格式为'user_name'@'host',其中user_name为用户名,host为允许登录的主机名或IP地址。如果允许所有主机登录MySQL,则可以使用%表示所有主机。另外,如果不指定主机名,系统默认为%(即所有主机)。PASSWORD表示创建用户的登录密码,如果不指定该项,则表示用户不需要密码即可登录。
在使用 CREATE USER 语句创建用户时应该注意以下几点。
(1)如果使用CREATE USER语句时没有为用户指定登录口令(密码),那么MySQL允许该用户不使用口令登录系统。在实际的应用场景中,出于对数据安全的考虑,不建议采用这种做法。
(2)用户使用CREATE USER语句时必须拥有MySQL服务器中MySQL数据库的INSERT权限或全局CREATE USER权限。
(3)使用CREATE USER语句创建一个用户后,系统自身的MySQL数据库的 user 表中会添加一条新记录。如果创建的用户已经存在,则语句执行时会出现错误。
(4)新创建的用户拥有的权限很少,只允许登录MySQL服务器或进行不需要权限的操作,如使用SHOW语句查询所有存储引擎和字符集的列表等。
(5)如果两个用户具有相同的用户名,但是具有不同的主机名,MySQL会将他们视为不同的用户,并允许为这两个用户分配不同的权限集合。
下面通过具体的实例对创建用户时需要注意的事项进行说明。
创建用户alice,登录密码为123,并且指定其IP地址为192.168.74.100时才可以登录MySQL服务器。
MariaDB [(none)]> create user 'alice'@'192.168.74.100' identified by '123';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]>
创建用户tom,登录密码为123,并且使用 192.168.74网段内的IP地址才可登录MySQL服务器。
MariaDB [(none)]> create user 'tom'@'192.168.74.%' identified by '123';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]>
创建用户mike,允许其在任何IP地址上登录MySQL服务器,并且不需要使用登录密码。
MariaDB [(none)]> create user 'mike'@;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]>
需要注意,如果创建的用户不显示,可以使用强制刷新命令来刷新数据库和数据表,具体代码如下所示。
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]>
用户创建完成后,可以通过查看mysql.user表来获取用户的基本信息。
MariaDB [(none)]> select user,host from mysql.user;
+-------+----------------+
| user | host |
+-------+----------------+
| mike | % |
| root | 127.0.0.1 |
| tom | 192.168.74.% |
| alice | 192.168.74.100 |
| root | ::1 |
| root | localhost |
+-------+----------------+
6 rows in set (0.000 sec)

MariaDB [(none)]>
尝试使用mike用户登录MySQL服务器,具体的SQL语句如下所示。
[root@localhost ~]# mysql -umike
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 12
Server version: 10.3.28-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
从上方代码的执行结果可以看出,系统并没有提示mike用户输入登录密码。接下来尝试使用mike用户创建一个名为miketest的数据库,并查看所有数据库,具体的语句如下所示。
MariaDB [(none)]> create database miketest;
ERROR 1044 (42000): Access denied for user 'mike'@'%' to database 'miketest'
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.001 sec)

MariaDB [(none)]>
从上方代码的执行结果可以看出,mike用户的权限不足导致创建数据库失败,使用SHOW命令查看所有的数据库也只显示系统默认的information_schema库。
MySQL中可以直接使用DROP命令删除用户,也可以通过删除mysql.user表中的用户信息来达到删除用户的目的。两种方式的语句格式如下。
方式一:
drop user '用户名'@'主机地址'
方式二:
delete from mysql.user where host='主机地址' and user='用户名'
使用DROP语句删除tom用户的语句如下。
MariaDB [(none)]> drop user 'tom'@'192.168.74.%';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> select user,host from mysql.user;
+-------+----------------+
| user | host |
+-------+----------------+
| mike | % |
| root | 127.0.0.1 |
| alice | 192.168.74.100 |
| root | ::1 |
| root | localhost |
+-------+----------------+
5 rows in set (0.000 sec)

MariaDB [(none)]>
从代码的执行结果可以看出, tom 用户已经被删除。

6.修改账户密码
账户密码作为登录数据库的关键参数,其安全性也是非常重要的。在实际的生产环境中,密码也要不定期修改,以避免黑客或其他无权人员侵入的风险。本节将详细介绍数据库中用户密码的修改方式和注意事项。
1.通过mysqladmin命令修改
root用户作为数据库系统的最高权限者,其账户信息的安全性是非常重要的。在MySQL中可以使用mysqladmin命令在命令行中指定新密码,mysqladmin命令的基本语法格式如下所示。
mysqladmin -u username -h localhost -p '当前密码' password '新密码'
上方语句格式中,username为需要修改密码的用户名;-h参数指定登录主机,默认为localhost;-p参数指定当前密码;password关键字后面双引号中的内容为设置的新密码。将root用户的密码修改为123abc,具体的SQL语句如下所示。
[root@localhost ~]# mysqladmin -uroot password '123abc' -p
Enter password:
[root@localhost ~]#
从上方代码中可以看出,使用-p参数后,系统提示输入旧密码,旧密码输入成功后,root用户的密码将被修改为123abc。
2.通过SET命令修改
root用户或普通用户在登录系统的情况下都可以使用SET语句来修改自己的密码。root用户通过SET语句修改普通用户密码的语句格式如下所示。
set password for ‘用户名’@‘IP地址’ =password(‘新密码’);
需要注意,只有具备相应权限的用户才可以修改其他用户的密码。另外,用户在登录数据库的情况下,也可以用此命令修改自己的密码,语句可以简写为如下形式。
set password=password('新密码');
例如,root用户将mike用户的登录密码设置为123的SQL语句如下所示。
MariaDB [(none)]> set password for 'mike'@'' =password('123');
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]>
mike用户登录,将自己的密码修改为123的SQL语句如下所示。
[root@localhost ~]# mysql -umike -p123
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 17
Server version: 10.3.28-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
从上方代码的执行结果可以看出,mike用户的密码成功修改为123。
3.使用 ALTER 语句修改密码
在 MySQL 中也可以使用 ALTER 语句修改用户密码,语句的具体格式如下所示。
alter user ‘用户名’@‘客户端来源IP地址’ identified by ‘新密码’;
使用此语句修改密码的操作读者可以自行实验,此处不再赘述。
4.使用UPDATE命令修改密码
MySQL中使用UPDATE命令可以直接修改user权限表中的信息,所以可以使用该命令达到修改密码的目的,具体的语句格式如下。
update mysql.user set authentication_string=password('新密码') where user=‘用户名’ and host=‘主机地址’;
需要注意,root用户忘记密码时,只有通过此方式才可以修改密码,使用mysqladmin、SET、ALTER等语句均不能修改密码。
5.关于密码复杂度
MySQL 5.6之后增加了密码强度验证插件validate_password,该插件要求密码包含至少一个大写字母,一个小写字母,一个数字和一个特殊字符,并且密码总长度至少为8个字符。MySQL 5.7默认该插件为启用状态,该插件会检查设置的密码是否符合当前的强度规则,若不符合则拒绝设置。需要注意,为了降低实例的理解难度,前面章节中的操作是在validate_password插件关闭的情况下进行的。在MySQL 5.7中,关闭该插件需要在配置文件my.cnf的[mysql]配置块中添加如下配置项。
plugin-load=validate_password.so
validate-password=OFF
保存退出后,重启MySQL服务即可使配置生效。另外,如果需要设置免密登录,可加入如下配置项.
skip-grant-tables=true
需要注意,出于数据安全方面的考虑,在实际生产环境中不建议取消密码强度验证和设置免密登录。
6.忘记密码
如果root用户忘记密码,可以先停止MySQL服务并在配置文件中设置免密登录,然后重启服务。登录后使用相关命令修改root用户密码即可。具体的操作流程如下所示。
图片 4.png
需要注意,如果普通用户忘记密码,不建议使用此方式修改密码。在实际生产环境中,普通用户忘记密码后,可以通过root用户(或 DBA)修改密码。

7.删除与修改用户
在MySQL中可以使用DROP USER语句删除用户,也可以直接使用DELECT语句删除mysql.user表中对应的用户信息,从而达到删除用户的目的。
使用DROP USER语句删除用户语法格式如下。
图片 5.png
使用DELETE语句删除用户语法格式如下。
图片 6.png
需要注意,如果用户已经登录到数据库服务器,删除用户的操作并不会阻止此用户当前的操作,命令要到用户对话被关闭后才生效。另外,也可以对已经创建的用户重新命名,语法格式如下所示。
rename user '用户名'@‘主机地址’ to ‘新用户名’@‘IP地址’;
将tom用户的用户名修改为tomtest后删除该用户,具体的操作流程如下。
MariaDB [(none)]> rename user 'tom'@ to 'tomtest'@;
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> drop user 'tomtest'@;
Query OK, 0 rows affected (0.000 sec)
从上方代码的执行结果可以看出,tom用户被修改用户名后又被删除。

8.权限管理
合理地分配权限是实现数据安全的重要保证,MySQL数据库管理员可以通过多种方式来赋予用户权限。本节将详细介绍数据库权限的设置方法。

9.MySQL的权限
前面我们已经知道MySQL的用户和权限信息会被存储到数据库的权限表中,MySQL启动时会自动加载这些权限信息,并将这些信息读取到内存。用户的相关权限在user表中也存在对应的列(拥有权限为Y,不拥有为N),以mike用户为例,其user表中对应的权限信息如下所示(代码的注释部分并不是命令的输出结果)。
图片 7.png
图片 8.png
用户权限表 user 中各权限列的对应范围如表所示。
图片 9.png
图片 10.png
MySQL中各权限的作用范围可以大致分为5层,分别为全局层级、数据库层级、表层级、列层级、子程序层级。由于权限的作用对象不同,因此权限的执行范围也不同。关于用户权限的详细说明如下所示。
(1)CREATE权限和DROP权限允许用户创建新数据库(表)和删除(移掉)已有数据库(表)。
(2)SELECT权限、INSERT权限、UPDATE权限和DELETE权限允许用户在数据库现有的表上进行操作。
(3)INDEX权限允许用户创建或删除索引。如果用户具有某个表的CREATE权限,也可以在CREATE TABLE语句中加入索引定义项。
(4)ALTER权限允许用户更改表的结构和重新命名表。
(5)CREATE ROUTINE权限允许用户创建要保存的程序(函数),ALTER ROUTINE权限用来更改和删除保存的程序,EXECUTE权限用来执行保存的程序。
(6)GRANT权限允许用户给其他用户授权。
(7)FILE权限允许用户使用LOAD DATA INFILE和SELECT… INTO OUTFILE等语句读写服务器上的文件,但不能将原有文件覆盖。
MySQL中也可以使用MySQLadmin程序或SQL语句设定其他权限用于管理性操作,具体如下所示。
(1)reload 命令与flush-privileges命令实现的功能相似,可以使服务器将授权表重新读入内存。refresh命令可以清空所有的表并关闭(或打开)记录文件。
(2)shutdown命令可以关闭服务(只能通过MySQLadmin程序执行)。
(3)processlist命令可以显示服务器内执行的线程信息。
(4)kill命令可以终止其他用户连接数据库或更改服务器的操作方式。

10.授予权限
MySQL中可以使用GRANT语句来授予用户相关权限,授予权限并设置相关密码的GRANT语法格式如下所示。
grant on <数据库.表> to <'username'@'hostname'> [identified by] ['password'] [with grant option];
以上语法格式中,各参数的含义如下。
privileges:表示权限类型。
数据库.表:表示指定数据库中的某张表。另外,还可以使用符号“”表示不指定。例如,<数据库名.>表示指定数据库中的所有事物;<数据库名.存储过程>表示指定数据库中的存储过程;<.>表示所有数据库中的所有事物。
username:表示用户名。
hostname:表示客户端来源 P地址。
identified by:可选项,表示为用户设置密码。
password:表示用户的新密码,一般与indentified by参数搭配使用。
WITH GRANT OPTION:可选项,表示跟随的权限选项。此项有4种不同的取值,分别为MAX_QUERlES_PER_HOUR count(设置每小时可以执行count次查询)、MAX_UPDATES_PER_HOURcount(设置每小时可以执行count次更新)、MAX_CONNECTIONS_PER_HOUR count(设置每小时可以建立count个连接)和MAX_USER_CONNECTIONS count(设置单个用户可以同时建立 count个连接)。
接下来通过具体实例演示如何对用户进行权限的授予。
使用GRANT语句创建新用户,用户名为user123,密码为admin123,用户对所有数据库有INSERT和SELECT的权限。
MariaDB [(none)]> grant insert,select on . to 'user123'@'' identified by 'admin123';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]>
从以上代码的执行结果可以看出,新用户user123创建成功。使用SELECT语句查看user123的用户权限,如下所示。
MariaDB [(none)]> select host,user,insert_priv from mysql.user where user='user123';
+------+---------+-------------+
| host | user | insert_priv |
+------+---------+-------------+
| % | user123 | Y |
+------+---------+-------------+
1 row in set (0.001 sec)

MariaDB [(none)]>
从上面语句的执行结果可以看出,成功为新用户赋予了全局的SELECT权限和INSERT权限。

11.查看权限
前面已经介绍了如何对用户授予权限,并通过SELECT语句来查看用户权限。在实际的应用场景中,用SELECT语句查询权限信息比较烦琐,因此,MySQL提供了SHOW GRANTS语句来代替SELECT语句,其语法格式如下所示。
show grants for 'username'@'hostname';
SHOW GRANT语句中只需要指定用户名和主机名即可。接下来通过具体实例演示SHOWGRANTS语句的用法。
MariaDB [(none)]> show grants for 'user123'@'' \G
*************************** 1. row ***************************
Grants for user123@%: GRANT SELECT, INSERT ON . TO user123@% IDENTIFIED BY PASSWORD '*01A6717B58FF5C7EAFFF6CB7C96F7428EA65FE4C'
1 row in set (0.000 sec)

MariaDB [(none)]>
从以上执行结果中可看出,用户user123具有INSERT和SELECT的权限。可以发现,使用SHOWGRANTS语句查询用户权限是非常方便快捷的。

12.收回权限
数据库管理员在管理用户时,可能会出于安全性考虑收回一些授予过的权限,MySQL提供了REVOKE语句用于收回权限,语法格式如下所示。
revoke on <数据库.表> from <‘username’@'hostname'>;
上方语句中各参数的含义与GRANT语句中的参数含义相同。接下来通过具体实例演示REVOKE语句的使用。
使用REVOKE语句收回用户user123的INSERT权限。
MariaDB [(none)]> revoke insert on . from 'user123'@'';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]>
以上执行结果证明权限收回成功,此时可以使用SELECT语句查询user123用户的权限。
MariaDB [(none)]> select host,user,insert_priv,select_priv from mysql.user where user='user123';
+------+---------+-------------+-------------+
| host | user | insert_priv | select_priv |
+------+---------+-------------+-------------+
| % | user123 | N | Y |
+------+---------+-------------+-------------+
1 row in set (0.001 sec)

MariaDB [(none)]>
从以上执行结果可看出,user123用户的Insert_priv权限值已经修改为N,说明INSERT权限被收回。

数据库的授权
1.创建本地用户runtime,并登录测试
[root@localhost ~]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.17-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> create user runtime@localhost identified by '123456';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> quit
Bye
[root@localhost ~]# mysql -uruntime -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.3.17-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.000 sec)
MariaDB [(none)]> exit
Bye
[root@localhost ~]#
2.登录root用户,授权runtime库给runtime用户使用
[root@localhost ~]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 10.3.17-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| runtime            |
+--------------------+
4 rows in set (0.001 sec)
MariaDB [(none)]> grant select on runtime.* to runtime@localhost;
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> quit
Bye
[root@localhost ~]# mysql -uruntime -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 10.3.17-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| runtime            |
+--------------------+
2 rows in set (0.000 sec)
MariaDB [(none)]> show grants for runtime@localhost;
+----------------------------------------------------------------------------------------------------------------+
| Grants for runtime@localhost                                                                                   |
+----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'runtime'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
| GRANT SELECT ON `runtime`.* TO 'runtime'@'localhost'                                                           |
+----------------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)
MariaDB [(none)]> exit
Bye
[root@localhost ~]#
3.权限赋予完成后进行卸权
[root@localhost ~]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 12
Server version: 10.3.17-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> revoke select on runtime.* from runtime@localhost;
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> quit
Bye
[root@localhost ~]# 
[root@localhost ~]# mysql -uruntime -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 14
Server version: 10.3.17-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show grants for runtime@localhost;
+----------------------------------------------------------------------------------------------------------------+
| Grants for runtime@localhost                                                                                   |
+----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'runtime'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
+----------------------------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)
MariaDB [(none)]> exit
Bye
[root@localhost ~]#
4.删除用户
[root@localhost ~]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 15
Server version: 10.3.17-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> drop user runtime@localhost;
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> quit
Bye
[root@localhost ~]# mysql -uruntime -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'runtime'@'localhost' (using password: YES)
[root@localhost ~]#
数据库登陆密码破解
1.知道数据库密码的修改
[root@localhost ~]# mysqladmin -uroot -p123456 password abcdef
2.不知道数据库密码的修改
[root@localhost ~]# systemctl  stop mariadb.service 
[root@localhost ~]# mysqld_safe --skip-grant-tables &
[1] 671330
210113 04:15:43 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
210113 04:15:43 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql

[root@localhost ~]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.17-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> update mysql.user set authentication_string=password('123456') where user='root';
Query OK, 3 rows affected (0.001 sec)
Rows matched: 3  Changed: 3  Warnings: 0

MariaDB [(none)]> exit
Bye
[root@localhost ~]# ps aux |grep mysql
root      671330  0.0  0.1  13172  3356 pts/1    S    04:15   0:00 /bin/sh /usr/bin/mysqld_safe --skip-grant-tables
mysql     671588  0.0  4.8 1340064 89112 pts/1   Sl   04:15   0:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mariadb/plugin --user=mysql --wsrep_on=1 --wsrep_provider=/usr/lib64/galera/libgalera_smm.so --skip-grant-tables --log-error=/var/log/mariadb/mariadb.log --pid-file=/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root      678252  0.0  0.0  12320  1052 pts/1    S+   04:19   0:00 grep --color=auto mysql
[root@localhost ~]# kill -9 671588
-bash: kill: (671588) - 没有那个进程
[1]+  已完成               mysqld_safe --skip-grant-tables
[root@localhost ~]# systemctl  restart mariadb.service 
[root@localhost ~]#
数据库的图形化管理界面
1.安装php服务
[root@localhost ~]# dnf -y install php
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
上次元数据过期检查:2:23:40 前,执行于 2021年01月13日 星期三 02时12分36秒。
依赖关系解决。
===========================================================
 软件包          架构       版本                       仓库             大小
===========================================================
安装:
 Php  x86_64  7.2.24-1.module+el8.2.0+4601+7c76a223       AppStream       1.5 M
。。。。。。。。。。。。。。。。省略
已安装:
  apr-1.6.3-9.el8.x86_64                                                                                     
  apr-util-1.6.1-6.el8.x86_64                                                                                
  apr-util-bdb-1.6.1-6.el8.x86_64                                                                            
  apr-util-openssl-1.6.1-6.el8.x86_64                                                                        
  httpd-2.4.37-21.module+el8.2.0+5008+cca404a3.x86_64                                                        
  httpd-filesystem-2.4.37-21.module+el8.2.0+5008+cca404a3.noarch                                             
  httpd-tools-2.4.37-21.module+el8.2.0+5008+cca404a3.x86_64                                                  
  mod_http2-1.11.3-3.module+el8.2.0+4377+dc421495.x86_64                                                     
  nginx-filesystem-1:1.14.1-9.module+el8.0.0+4108+af250afe.noarch                                            
  php-7.2.24-1.module+el8.2.0+4601+7c76a223.x86_64                                                           
  php-cli-7.2.24-1.module+el8.2.0+4601+7c76a223.x86_64                                                       
  php-common-7.2.24-1.module+el8.2.0+4601+7c76a223.x86_64                                                    
  php-fpm-7.2.24-1.module+el8.2.0+4601+7c76a223.x86_64                                                       
  redhat-logos-httpd-81.1-1.el8.noarch                                                                       
完毕!
[root@localhost ~]#
2.安装http等相关服务
[root@localhost ~]# dnf -y install httpd php php-mysqlnd
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
上次元数据过期检查:0:00:22 前,执行于 2021年01月13日 星期三 04时42分45秒。
软件包 httpd-2.4.37-21.module+el8.2.0+5008+cca404a3.x86_64 已安装。
软件包 php-7.2.24-1.module+el8.2.0+4601+7c76a223.x86_64 已安装。
。。。。。。省略
已安装:
  php-mysqlnd-7.2.24-1.module+el8.2.0+4601+7c76a223.x86_64                                                   
  php-pdo-7.2.24-1.module+el8.2.0+4601+7c76a223.x86_64                                                       
完毕!
[root@localhost ~]#
3.开启httpd服务,并关闭防火墙
[root@localhost ~]# systemctl  restart httpd
[root@localhost ~]# systemctl  enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@localhost ~]# systemctl  stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]#
4.下载PHPmyadmin源码包,并复制到共享目录,随后解压
[root@localhost ~]# wget https://files.phpmyadmin.net/phpMyAdmin/3.4.0/phpMyAdmin-3.4.0-all-languages.tar.bz2
--2021-01-13 04:54:21--  https://files.phpmyadmin.net/phpMyAdmin/3.4.0/phpMyAdmin-3.4.0-all-languages.tar.bz2
正在解析主机 files.phpmyadmin.net (files.phpmyadmin.net)... 185.180.13.16, 2a02:6ea0:c800::6
正在连接 files.phpmyadmin.net (files.phpmyadmin.net)|185.180.13.16|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:4548030 (4.3M) [application/octet-stream]
正在保存至: “phpMyAdmin-3.4.0-all-languages.tar.bz2”
phpMyAdmin-3.4.0-all-langua 100%[========================================>]4.34M 2.07MB/s 用时 2.1s    
2021-01-13 04:54:28 (2.07 MB/s) - 已保存 “phpMyAdmin-3.4.0-all-languages.tar.bz2” [4548030/4548030])
[root@localhost ~]# cp phpMyAdmin-3.4.0-all-languages.tar.bz2 /var/www/html/
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# ls
phpMyAdmin-3.4.0-all-languages.tar.bz2
[root@localhost html]# tar jxf phpMyAdmin-3.4.0-all-languages.tar.bz2 
[root@localhost html]# ls
phpMyAdmin-3.4.0-all-languages  phpMyAdmin-3.4.0-all-languages.tar.bz2
[root@localhost html]#
5.移动并改名,太长不方便访问,切换到目录中,复制配置文件
[root@localhost html]# mv phpMyAdmin-3.4.0-all-languages mysqladmin
[root@localhost html]# ls
mysqladmin  phpMyAdmin-3.4.0-all-languages.tar.bz2
[root@localhost html]# cd mysqladmin/
[root@localhost mysqladmin]# ls
browse_foreigners.php     import_status.php      README.VENDOR           tbl_export.php
bs_disp_as_mime_type.php  index.php  RELEASE-DATE-3.4.0  tbl_get_field.php
bs_play_media.php         INSTALL                robots.txt              tbl_import.php
ChangeLog                 js                     schema_edit.php         tbl_indexes.php
changelog.php             libraries              schema_export.php       tbl_move_copy.php
chk_rel.php               LICENSE                scripts                 tbl_operations.php
config.sample.inc.php     license.php            server_binlog.php       tbl_printview.php
。。。。。。。。。。。。。。。。。。省略
export.php                print.css              tbl_change.php
favicon.ico               querywindow.php        tbl_chart.php
import.php                README                 tbl_create.php
[root@localhost mysqladmin]# cp config.sample.inc.php  config.inc.php 
[root@localhost mysqladmin]# ls
browse_foreigners.php     import.php             README                  tbl_create.php
bs_disp_as_mime_type.php  import_status.php      README.VENDOR           tbl_export.php
bs_play_media.php         index.php              RELEASE-DATE-3.4.0      tbl_get_field.php
ChangeLog                 INSTALL                robots.txt              tbl_import.php
changelog.php             js                     schema_edit.php         tbl_indexes.php
chk_rel.php               libraries              schema_export.php       tbl_move_copy.php
config.inc.php            LICENSE                scripts                 tbl_operations.php
。。。。。。。。。。。。。。。。。。省略
export.php                print.css              tbl_change.php
favicon.ico               querywindow.php        tbl_chart.php
[root@localhost mysqladmin]#
6.重启服务,并在浏览器中访问测试
[root@localhost mysqladmin]# systemctl  restart httpd

图片 7.png
图片 8.png
图片 9.png
图片 10.png

上一篇 下一篇