MySQL-体系结构及授权管理

Posted 运维人在路上

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL-体系结构及授权管理相关的知识,希望对你有一定的参考价值。

一、mysql体系结构

1.1、mysql C/S模型

主要有两种连接mysql的方式:

  • 1)TCP/IP
  • 2)Socket

image

mysql -uroot -pmysql -h 10.0.0.51   #TCP/IP
mysql -uroot -pmysql -S /tmp/mysql.sock  #socket

1.2、mysql实例概念

image

分布式系统架构中会使用多实例:在一个系统上要起多个mysql。

mysqld守护进程+Master thread + worker thread +专用内存 ====>实例

实例+数据 ====>完整的数据库管理系统

多实例==完整的数据库管理系统*n

1.3、mysql工作过程

一条SQL语句的执行过程:select user,authentication_string,host from mysql.user;

image

1.3.1、连接层工作原理

(1) 提供连接协议 
	TCP/IP
	Socket
(2) 提供用户验证模块,加载授权表(mysql.user)
	user 
	password
(3) 提供连接线程
	负责:所有会话相关的命令接收及回馈

1.3.2、SQL层工作原理

#SQL语言种类
SQL :结构化的查询语言
DDL :数据定义语言
DCL :数据控制语言
DML :数据操作语言
DQL :数据查询语言
每一类语言,都有专门的模块来负责

#SQL层工作原理 
(1) 验证语句语法(SQL 92, 99,移植性),SQL_MODE
(2) 权限验证模块
(3) 语义验证模块
(4) 专用SQL解析器,SQL语句执行的方法(explain)
(5) 优化器:选择一个代价最低的执行计划
代价:CPU MEM IO
(6) 执行器:根据优化器的选择最优的执行计划,执行SQL语句,得出执行结果.
(7) 提供查询缓存:query_cache ,现在一般用redis产品替代query_cache
(8) 提供查询(变更类)日志:binlog 

1.3.4、存储引擎层工作原理

多种存储引擎,以插件形式支持.
不同存储引擎就像,不同的文件系统一样,提供不同数据存取模式.
InnoDB: 一张表就是一个文件, .ibd文件,一个段,区,数据页(16K)
存储引擎根据,SQL层提供的执行结果,结构化层表的形式,返回给用户

1.4、mysql逻辑结构

image

1.5、mysql物理结构

1)对于Linux操作系统来讲,他的物理层是同柱面的扇区.

2)对于MySQL来讲,他是Linux系统之上的应用软件,他的物理层就是文件系统上的特定格式的文件,由MySQL<存储引擎>决定的

对于myisam引擎来说:

  • user.frm :表的列结构
  • user.MYD :数据行记录
  • user.MYI :表的索引

对于innodb引擎来说:(注意:mysql8.0中已经没有.frm文件了

  • t1.frm :表列的结构
  • t1.ibd :数据行记录和索引

二、用户权限管理

2.1、mysql用户

2.1.1、用户作用

1)登录MySQL

2)管理MySQL对象(逻辑结构:库(库名字,库属性)、表(表名,表的数据行,表的列(列名字及列属性),表的属性))

2.1.2、用户定义

abc@\'白名单\'    密码123

白名单: 允许白名单中的IP,可以通过abc用户及123密码登录和管理MySQL

白名单支持定义的方式:

10.0.0.52 
10.0.0.%  ==> 10.0.0.1~10.0.0.254/24
10.0.0.5% ==> 10.0.0.50 ~10.0.0.59(包含10.0.0.5)
www.oldguo.com
%         
10.0.0.0/255.255.254.0

image

2.2、用户管理命令

2.2.1、创建用户

create user abc@\'10.0.0.%\'   identified  by  \'123\';
select user ,host  from mysql.user; 

2.2.2、删除用户

drop user abc@\'10.0.0.%\';

2.2.3、修改用户密码

alter user abc@\'10.0.0.%\' identified by \'456\';

2.3、权限管理

2.3.1、授权命令

grant all on *.* to wordpress@\'%\' identified by \'123\';

#注意8.0以后授权
create user wordpress@\'10.0.0.%\' identified by \'123\';
grant all on wordpress.* to wordpress@\'10.0.0.%\';

注意:all权限内容

INSERT,
SELECT, 
UPDATE, 
DELETE, 
CREATE,
DROP, 
RELOAD,
SHUTDOWN, 	
PROCESS, 
FILE, 
REFERENCES, 
INDEX, 
ALTER, 
SHOW DATABASES, 
SUPER, 	
CREATE TEMPORARY TABLES, 
LOCK TABLES, 
EXECUTE, 
REPLICATION SLAVE, 	
REPLICATION CLIENT, 
CREATE VIEW, 
SHOW VIEW, 
CREATE ROUTINE, 
ALTER 	ROUTINE, 
CREATE USER, 
EVENT, 
TRIGGER, 
CREATE TABLESPACE

#注意:all中不包含with grant option

2.3.2、权限作用对象

*.*     #表示的是,对整个数据库下的所有的表都授权.
abc.*   #表示的是,对abc下所有的表都授权
abc.t1  #只对 abc下的t1表进行授权

#8.0版本以前: 创建用户和授权都合到一起了,其实是不符合SQL92标准的
grant  all   on wordpress.* to wordpress@\'10.0.0.%\' identified by \'123\';

#标准的SQL92标准:
(1) 用户必须提前存在
(2) grant  all   on wordpress.* to wordpress@\'10.0.0.%\'

#8.0以后授权:
create user wordpress@\'10.0.0.%\' identified by \'123\';
grant all on wordpress.* to wordpress@\'10.0.0.%\';

2.4、生产授权

生产授权案例:
生产库: 
	管理员用户 : root身份
	授权管理员用户oldguo,实现从10网段登录管理	
	[(none)]>grant all on *.* to oldguo@\'10.0.0.%\' identified by \'123\';
	应用用户   :  实现业务功能的
沟通: 
		1.用户名,密码方面和开发沟通,一般情况下,用户名一般会应用有关,密码一般是有复杂度(三种字符以上复杂度)
		用户和密码信息会填写到应用的配置文件中
		2.确认从什么IP地址连接我的生产库,涉及到白名单问题,不能设置%
		3.业务功能都有需要哪些权限,确认最小权限.
			select , insert , update ,delete
			疑问: 
				1. delete危险怎么办?
				2. 表结构变化怎么办  ---->一般是DBA来做
		   user passwd   ip   权限

		4. 难缠开发,找你要root
		   走流程---->找领导邮件确认 

2.5、查看用户具备的权限

show grants for oldguo@\'10.0.0.%\';
show grants for root@\'localhost\';
GRANT ALL PRIVILEGES ON *.* TO \'root\'@\'localhost\' WITH GRANT OPTION  #超级管理员

2.6、回收权限

revoke select on *.* from \'oldguo\'@\'10.0.0.%\';

三、MySQL基础管理

3.1、mysql连接管理

1)mysql客户端命令

#本地连接
mysql -uroot -p
mysql -uroot -p -S /tmp/mysql.sock

#远程连接:
-h  IP  
-P  port
mysql -uwordpress -p123 -h 10.0.0.51 -P 3306

#自带的其他客户端命令
mysqladmin  
mysqldump 

2)mysql客户端程序

  • sqlyog
  • navicat
  • workbench(EM)

3)基于API的连接

一个问题:开发人员反馈,为啥我的应用,登录不上你的数据库啊!!怎么证明自己没问题?
自己连接测试:mysql -uwordpress -p123 -h 10.0.0.51 -P 3306

3.2、mysql启动流程

image

3.3、报错日志查看

日志在什么位置:
默认位置:数据路径下,叫db01.err
可以添加参数,设置日志位置
log_error=/var/log/mysql.log	
分析带有   [ERROR]  行

3.4、初始化配置

1)初始化配置方式

(1) CMAKE  时可以实现初始化配置
(2) 初始化配置文件/etc/my.cnf   *****用的最多的方法
(3) 命令行可以直接指定

2)优先级

命令行   >  配置文件  > 编译安装的

3)读取/etc/my.cnf顺序

[root@db01 mysql]# mysqld --help --verbose|grep my.cnf
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 
                      my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default

image

3.5、配置文件书写

[root@db01 ~]# cat /etc/my.cnf 

[mysqld]

basedir=/app/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
server_id=3306
port=3306
log_error=/data/mysql/mysql.err 

[mysql]

socket=/tmp/mysql.sock
prompt=[\\\\d]>

四、MySQL权限补充

4.1、权限级别

1)mysql权限级别

  • 全局性的管理权限,作用于整个MySQL实例级别
  • 数据库级别的权限,作用于某个指定的数据库上或者所有的数据库上
  • 数据库对象级别的权限,作用于指定的数据库对象上(表、视图等)或者所有的数据库对象上

2)权限存储在mysql库的user, db, tables_priv, columns_priv, and procs_priv这几个系统表中,待MySQL实例启动后就加载到内存中

4.2、特殊用户权限

mysql> select user,host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
3 rows in set (0.00 sec)

4.2.1、root@localhost用户

mysql> show  grants for root@\'localhost\';
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO \'root\'@\'localhost\' WITH GRANT OPTION |
| GRANT PROXY ON \'\'@\'\' TO \'root\'@\'localhost\' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
#对比root用户在几个权限系统表中的数据 
mysql> select * from user where user=\'root\' and host=\'localhost\'\\G;  #都是Y
mysql> select * from db where user=\'root\' and host=\'localhost\'\\G;  #无记录
mysql> select * from table_pri where user=\'root\' and host=\'localhost\'\\G;  #无记录
mysql> select * from columns_pri where user=\'root\' and host=\'localhost\'\\G;  #无记录
mysql> select * from procs_priv where user=\'root\' and host=\'localhost\'\\G;  #无记录

4.2.2、mysql.sys@localhost用户

mysql> show  grants for \'mysql.sys\'@\'localhost\';
+---------------------------------------------------------------+
| Grants for mysql.sys@localhost                                |
+---------------------------------------------------------------+
| GRANT USAGE ON *.* TO \'mysql.sys\'@\'localhost\'                 |
| GRANT TRIGGER ON `sys`.* TO \'mysql.sys\'@\'localhost\'           |
| GRANT SELECT ON `sys`.`sys_config` TO \'mysql.sys\'@\'localhost\' |
+---------------------------------------------------------------+
3 rows in set (0.00 sec)


#对比mysql.sys用户在几个权限系统表中的数据
mysql> select * from user where user=\'mysql.sys\' and host=\'localhost\'; ##都是\'N\'
mysql> select * from db where user=\'mysql.sys\' and host=\'localhost\'; ##一条记录,在sys数据库上的Trigger_priv字段为\'Y\',
mysql> select * from tables_priv where host=\'localhost\' and user=\'mysql.sys\'; ##一条记录,在sys数据库的sys_config表上有select权限
mysql> select * from columns_priv where user=\'mysql.sys\' and host=\'localhost\'; ##无记录
mysql> select * from procs_priv where user=\'mysql.sys\' and host=\'localhost\'; ##无记录

补充:

#针对系统中mysql.sys@localhost这个用户:
mysql> show grants for \'mysql.sys\'@localhost;
+---------------------------------------------------------------+
| Grants for mysql.sys@localhost                                |
+---------------------------------------------------------------+
| GRANT USAGE ON *.* TO `mysql.sys`@`localhost`                 |
| GRANT TRIGGER ON `sys`.* TO `mysql.sys`@`localhost`           |
| GRANT SELECT ON `sys`.`sys_config` TO `mysql.sys`@`localhost` |
+---------------------------------------------------------------+
3 rows in set (0.01 sec)

1.用户级别的权限:
mysql> select * from mysql.user where user=\'mysql.sys\' and host=\'localhost\'\\G

2.数据库级别的权限
mysql> select * from mysql.db where user=\'mysql.sys\' and host=\'localhost\'\\G
*************************** 1. row ***************************
                 Host: localhost
                   Db: sys
                 User: mysql.sys
          Select_priv: N
          Insert_priv: N
          Update_priv: N
          Delete_priv: N
          Create_priv: N
            Drop_priv: N
           Grant_priv: N
      References_priv: N
           Index_priv: N
           Alter_priv: N
Create_tmp_table_priv: N
     Lock_tables_priv: N
     Create_view_priv: N
       Show_view_priv: N
  Create_routine_priv: N
   Alter_routine_priv: N
         Execute_priv: N
           Event_priv: N
         Trigger_priv: Y
1 row in set (0.00 sec)

3.数据库对象级别的权限(表)
mysql> select * from mysql.tables_priv where user=\'mysql.sys\' and host=\'localhost\';
+-----------+-----+-----------+------------+----------------+---------------------+------------+-------------+
| Host      | Db  | User      | Table_name | Grantor        | Timestamp           | Table_priv | Column_priv |
+-----------+-----+-----------+------------+----------------+---------------------+------------+-------------+
| localhost | sys | mysql.sys | sys_config | root@localhost | 2019-02-07 13:23:33 | Select     |             |
+-----------+-----+-----------+------------+----------------+---------------------+------------+-------------+
1 row in set (0.00 sec)

4.3、权限详解

All/All Privileges  #权限代表全局或者全数据库对象级别的所有权限
Alter   #权限代表允许修改表结构的权限,但必须要求有create和insert权限配合。如果是rename表名,则要求有alter和drop原表,create和insert新表的权限
Alter routine  #权限代表允许修改或者删除存储过程、函数的权限
Create  #权限代表允许创建新的数据库和表的权限
Create routine  #权限代表允许创建存储过程、函数的权限
Create tablespace  #权限代表允许创建、修改、删除表空间和日志组的权限
Create temporary tables  #权限代表允许创建临时表的权限
Create user  #权限代表允许创建、修改、删除、重命名user的权限
Create view  #权限代表允许创建视图的权限
Delete  #权限代表允许删除行数据的权限
Drop   #权限代表允许删除数据库、表、视图的权限,包括truncate table命令
Event  #权限代表允许查询,创建,修改,删除MySQL事件
Execute  #权限代表允许执行存储过程和函数的权限
File   #权限代表允许在MySQL可以访问的目录进行读写磁盘文件操作,可使用的命令包括load data infile,select … into outfile,load file()函数
Grant option  #权限代表是否允许此用户授权或者收回给其他用户你给予的权限
Index  #权限代表是否允许创建和删除索引
Insert  #权限代表是否允许在表里插入数据,同时在执行analyze table,optimize table,repair table语句的时候也需要insert权限
Lock   #权限代表允许对拥有select权限的表进行锁定,以防止其他链接对此表的读或写
Process  #权限代表允许查看MySQL中的进程信息,比如执行show processlist, mysqladmin processlist, show engine等命令
Reference  #权限是在5.7.6版本之后引入,代表是否允许创建外键
Reload  #权限代表允许执行flush命令,指明重新加载权限表到系统内存中,refresh命令代表关闭和重新开启日志文件并刷新所有的表
Replication client  #权限代表允许执行show master status,show slave status,show binary logs命令
Replication slave   #权限代表允许slave主机通过此用户连接master以便建立主从复制关系
Select  #权限代表允许从表中查看数据,某些不查询表数据的select执行则不需要此权限,如Select 1+1,Select PI()+2;而且select权限在执行update/delete语句中含有where条件的情况下也是需要的
Show databases  #权限代表通过执行show databases命令查看所有的数据库名
Show view  #权限代表通过执行show create view命令查看视图创建的语句
Shutdown  #权限代表允许关闭数据库实例,执行语句包括mysqladmin shutdown
Super   #权限代表允许执行一系列数据库管理命令,包括kill强制关闭某个连接命令,change master to创建复制关系命令,以及create/alter/drop server等命令
Trigger  #权限代表允许创建,删除,执行,显示触发器的权限
Update   #权限代表允许修改表中的数据的权限

Usage  #权限是创建一个用户之后的默认权限,其本身代表连接登录权限
mysql> create user abc@localhost;
mysql> show grants for abc@localhost;
+-----------------------------------------+
| Grants for abc@localhost |
+-----------------------------------------+
| GRANT USAGE ON *.* TO \'abc\'@\'localhost\' |
+-----------------------------------------+

4.4、系统权限表

权限存储在mysql库的user,db, tables_priv, columns_priv, and procs_priv这几个系统表中,待MySQL实例启动后就加载到内存中

文档:https://dev.mysql.com/doc/refman/5.7/en/grant-tables.html

  • User表:存放用户账户信息以及全局级别(所有数据库)权限,决定了来自哪些主机的哪些用户可以访问数据库实例,如果有全局权限则意味着对所有数据库都有此权限
  • Db表:存放数据库级别的权限,决定了来自哪些主机的哪些用户可以访问此数据库
  • Tables_priv表:存放表级别的权限,决定了来自哪些主机的哪些用户可以访问数据库的这个表
  • Columns_priv表:存放列级别的权限,决定了来自哪些主机的哪些用户可以访问数据库表的这个字段
  • Procs_priv表:存放存储过程和函数级别的权限

imageimage

4.4.1、user权限表

User权限表结构中的特殊字段:

1)Plugin,password,authentication_string三个字段存放用户认证信息

2)Password_expired设置成’Y’则表明允许DBA将此用户的密码设置成过期而且过期后要求用户的使用者重置密码(alter user/set password重置密码)

3)Password_last_changed作为一个时间戳字段代表密码上次修改时间,执行create user/alter user/set password/grant等命令创建用户或修改用户密码时此数值自动更新

4)Password_lifetime代表从password_last_changed时间开始此密码过期的天数

5)Account_locked代表此用户被锁住,无法使用

4.4.2、Tables_priv和columns_priv权限表结构

image

Timestamp和grantor两个字段暂时没用

image

4.4.3、procs_priv权限表结构

image

Routine_type是枚举类型,代表是存储过程还是函数
Timestamp和grantor两个字段暂时没用

4.4.4、系统权限表字段长度限制表

image

4.5、权限认证中的大小写敏感问题

1)字段user,password,authencation_string,db,table_name大小写敏感
2)字段host,column_name,routine_name大小写不敏感

4.6、查看用户权限信息

#查看已经授权给用户的权限信息
mysql> show grants for \'root\'@\'localhost\';
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO \'root\'@\'localhost\' WITH GRANT OPTION |
| GRANT PROXY ON \'\'@\'\' TO \'root\'@\'localhost\' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

#查看用户的其他非授权信息 
mysql> show create user \'root\'@\'localhost\';
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER for root@localhost                                                                                                                                            |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER \'root\'@\'localhost\' IDENTIFIED WITH \'mysql_native_password\' AS \'*E74858DB86EBA20BC33D0AECAE8A8108C56B17FA\' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

4.7、MySQL修改权限的生效

1)执行Grant,revoke,set password,rename user命令修改权限之后,MySQL会自动将修改后的权限信息同步加载到系统内存中

2)如果执行insert/update/delete操作上述的系统权限表之后,则必须再执行刷新权限命令才能同步到系统内存中,刷新权限命令包括:flush privileges/mysqladmin flush-privileges/mysqladmin reload

drop user cdq@\'%\';		#可以不刷新权限表
delete from mysql.user where user=\'cdq\' and host=\'%\';	#必须要刷新权限表flush privileges;

3)如果是修改tables和columns级别的权限,则客户端的下次操作新权限就会生效

4)如果是修改database级别的权限,则新权限在客户端执行use database命令后生效

5)如果是修改global级别的权限,则需要重新创建连接新权限才能生效

6)--skip-grant-tables可以跳过所有系统权限表而允许所有用户登录,只在特殊情况下暂时使用

4.8、创建用户,赋予相应权限

#权限回收:
mysql> revoke all privileges from cdq@localhost;
mysql> show grants for cdq@localhost;
+-----------------------------------------+
| Grants for cdq@localhost                |
+-----------------------------------------+
| GRANT USAGE ON *.* TO `cdq`@`localhost` |
+-----------------------------------------+
1 row in set (0.00 sec)

#授予全局权限(select)
mysql> grant select on *.* to cdq@localhost;
Query OK, 0 rows affected (0.10 sec)

mysql> show grants for cdq@localhost;
+------------------------------------------+
| Grants for cdq@localhost                 |
+------------------------------------------+
| GRANT SELECT ON *.* TO `cdq`@`localhost` |
+------------------------------------------+
1 row in set (0.00 sec)

#授权数据库级别的权限、
mysql> grant select on mysql.* to cdq@localhost;
Query OK, 0 rows affected (0.08 sec)

mysql> show grants for cdq@localhost;
+------------------------------------------------+
| Grants for cdq@localhost                       |
+------------------------------------------------+
| GRANT USAGE ON *.* TO `cdq`@`localhost`        |
| GRANT SELECT ON `mysql`.* TO `cdq`@`localhost` |
+------------------------------------------------+
2 rows in set (0.00 sec)

#数据库对象级别的权限,表
mysql> grant select on mysql.user to cdq@localhost;

#表字段级别的权限(最小级别的权限)
mysql> grant select(name) on mysql.user to cdq@localhost;

五、mysql用户资源限制

5.1、资源限制介绍

1)通过设置全局变量max_user_connections可以限制所有用户在同一时间连接MySQL实例的数量,但此参数无法对每个用户区别对待,所以MySQL提供了对每个用户的资源限制管理

2)MAX_QUERIES_PER_HOUR:一个用户在一个小时内可以执行查询的次数(基本包含所有语句)

3)MAX_UPDATES_PER_HOUR:一个用户在一个小时内可以执行修改的次数(仅包含修改数据库或表的语句)

4)MAX_CONNECTIONS_PER_HOUR:一个用户在一个小时内可以连接MySQL的时间

5)MAX_USER_CONNECTIONS:一个用户可以在同一时间连接MySQL实例的数量

6)从5.0.3版本开始,对用户‘user’@‘%.example.com’的资源限制是指所有通过example.com域名主机连接user用户的连接,而不是分别指从host1.example.com和host2.example.com主机过来的连接

5.2、资源限制配置

1)通过执行create user/alter user设置/修改用户的资源限制

mysql> CREATE USER \'francis\'@\'localhost\' IDENTIFIED BY \'frank\'
-> WITH MAX_QUERIES_PER_HOUR 20
-> MAX_UPDATES_PER_HOUR 10
-> MAX_CONNECTIONS_PER_HOUR 5
-> MAX_USER_CONNECTIONS 2;

mysql> ALTER USER \'francis\'@\'localhost\' WITH MAX_QUERIES_PER_HOUR 100;

2)取消某项资源限制既是把原先的值修改成0

mysql> ALTER USER \'francis\'@\'localhost\' WITH MAX_CONNECTIONS_PER_HOUR 0;

3)当针对某个用户的max_user_connections非0时,则忽略全局系统参数max_user_connections,反之则全局系统参数生效

5.3、设置mysql用户密码

image

5.4、设置mysql用户密码过期策略

image

5.5、mysql用户锁定

image

#账户的锁定与解锁
mysql> create user cdq3@localhost identified by \'mysql\';
Query OK, 0 rows affected (0.04 sec)

mysql> alter user cdq3@localhost account lock;  #锁定
Query OK, 0 rows affected (0.02 sec)

#新开连接测试:
[root@mysql ~]# mysql -ucdq3 -p
Enter password: 
ERROR 3118 (HY000): Access denied for user \'cdq3\'@\'localhost\'. Account is locked.

#解锁:
mysql> alter user cdq3@localhost account unlock;

#作用:如果想要删除某个用户,先将用户锁定,如对业务没多大影响的话,可以删除了

#查看被锁定的用户:
mysql> select user,host,account_locked from mysql.user;
+------------------+-----------+----------------+
| user             | host      | account_locked |
+------------------+-----------+----------------+
| cdq              | 10.0.0.%  | N              |
| cdq2             | 10.0.0.%  | N              |
| cdq3             | localhost | N              |
| mysql.infoschema | localhost | Y              |
| mysql.session    | localhost | Y              |
| mysql.sys        | localhost | Y              |
| root             | localhost | N              |
+------------------+-----------+----------------+
7 rows in set (0.00 sec)

5.6、企业应用中的常规MySQL用户

image

5.7、企业应用中的MySQL用户密码设定

image

六、小问题

6.1、多个用户,那个用户连接?

当存在多个用户,同时匹配时,远程连接时会选择哪个用户进行连接??

mysql> select user,host from mysql.user;
+---------------+------------+
| user          | host       |
+---------------+------------+
| cdq           | %          |
| cdq           | 10.0.0.%   |
| cdq           | 10.0.0.200 |
| mysql.session | localhost  |
| mysql.sys     | localhost  |
| root          | localhost  |
+---------------+------------+
6 rows in set (0.00 sec)

mysql> select * from course.tmp;
+------+------+
| id   | name |
+------+------+
|    1 | aa   |
|    2 | bb   |
+------+------+
2 rows in set (0.00 sec)


mysql> show grants for cdq@\'10.0.0.200\';
+---------------------------------------------------+
| Grants for cdq@10.0.0.200                         |
+---------------------------------------------------+
| GRANT SELECT, UPDATE ON *.* TO \'cdq\'@\'10.0.0.200\' |
+---------------------------------------------------+
1 row in set (0.00 sec)

mysql> show grants for cdq@\'10.0.0.%\';
+-----------------------------------------+
| Grants for cdq@10.0.0.%                 |
+-----------------------------------------+
| GRANT SELECT ON *.* TO \'cdq\'@\'10.0.0.%\' |
+-----------------------------------------+
1 row in set (0.00 sec)

mysql> show grants for cdq@\'%\';
+------------------------------------------+
| Grants for cdq@%                         |
+------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO \'cdq\'@\'%\' |
+------------------------------------------+
1 row in set (0.00 sec)


当客户端ip为10.0.0.200,他会选择哪个用户去连接呢?
mysql> show grants;		#查看当前连接用户的权限
+---------------------------------------------------+
| Grants for cdq@10.0.0.200                         |
+---------------------------------------------------+
| GRANT SELECT, UPDATE ON *.* TO \'cdq\'@\'10.0.0.200\' |
+---------------------------------------------------+
1 row in set (0.00 sec)

总结:会使用最接近授权用户去连接
当执行drop user cdq@\'10.0.0.200\'后,默认会选择cdq@\'10.0.0.%\'去连接

七、mysql8.0新特性

7.1、密码认证新特性

1)在mysql8.0之前,用户的密码认证方式是mysql_native_password

2)mysql8.0采用的密码验证方式是caching_sha2_password

所以在使用一些客户端的工具时,会连接不上(sqlyog,navicat)

解决方法:更改创建用户的密码验证方式

mysql> create user cdq2@\'10.0.0.%\' identified with mysql_native_password by \'mysql\';
Query OK, 0 rows affected (0.07 sec)

mysql> grant all privileges on *.* to cdq2@\'10.0.0.%\';
Query OK, 0 rows affected (0.06 sec)

mysql> select user,host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| cdq              | 10.0.0.%  | caching_sha2_password |	#连接不上
| cdq2             | 10.0.0.%  | mysql_native_password |	#可以连接
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)

7.2、角色的概念

相同功能的用户所属相同组,统一化管理

#创建只读用户组
mysql> create role app_readonly;							#创建角色(组)
mysql> grant select on *.* to app_readonly;
mysql> create user app1@localhost identified by \'mysql\';	 创建用户
mysql> create user app2@localhost identified by \'mysql\';     创建用户
mysql> grant app_readonly to app1@localhost;				#将角色赋予用户
mysql> grant app_readonly to app2@localhost;                #将角色赋予用户

#创建读写用户组
mysql> create role app_readwrite;
mysql> grant select,insert,update,delete on *.* to app_readwrite;
mysql> create user app3@localhost identified by \'mysql\';
mysql> create user app4@localhost identified by \'mysql\';
mysql> grant app_readwrite to app3@localhost;
mysql> grant app_readwrite to app4@localhost;

#查看组用户的权限
mysql> show grants for app1@localhost using app_readonly;
+------------------------------------------------+
| Grants for app1@localhost                      |
+------------------------------------------------+
| GRANT SELECT ON *.* TO `app1`@`localhost`      |
| GRANT `app_readonly`@`%` TO `app1`@`localhost` |
+------------------------------------------------+
2 rows in set (0.01 sec)

mysql> show grants for app3@localhost using app_readwrite;
+-------------------------------------------------------------------+
| Grants for app3@localhost                                         |
+-------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO `app3`@`localhost` |
| GRANT `app_readwrite`@`%` TO `app3`@`localhost`                   |
+-------------------------------------------------------------------+
2 rows in set (0.00 sec)

#回收组权限:
mysql> revoke app_readonly from app1@localhost;

以上是关于MySQL-体系结构及授权管理的主要内容,如果未能解决你的问题,请参考以下文章

26_多表查询 MySQL管理工具 用户授权及撤销

mysql用户授权及撤销

Mysql运维管理-生产场景Mysql主从复制读写分离授权方案及实战15

04: 用户授权及撤销 数据备份与恢复 MySQL管理工具

MySQL授权用户及密码恢复设置

数据库用户管理及授权