本文源码:GitHub·点这里 || GitEE·点这里

一、MySQL用户

1、基础描述

在数据库的使用过程中,用户作为访问数据库的鉴权因素,起到非常重要的作用,安装MySQL时会自动生成一个root用户,作为数据库管理员,拥有所有权限。在多用户的应用场景下,可能需要给不同的用户分配不同的权限,用来提升系统的稳定性,比如常见:报表库只提供读权限,或者开放给第三方的库,也只提供可读用户。

2、用户管理

基本描述

MySQL将用户信息存储在系统数据库mysql的user表中。根据用户名密码和客户端主机来定义帐户。

用户密码:基本验证操作 ;

客户端IP:类似黑白名单的限制,支持通配符表达式 ;

SELECT t.`Host`,t.`User`,t.authentication_string
FROM mysql.`user` t ;

添加用户

可以对user表进行增删改查一系列操作,进而添加用户,不同的用户就会涉及到不同的操作权限,这就是另外一个问题:用户的权限管理。

这里添加一个user01用户,作为权限模块的测试用户,权限先给和root用户一样的权限。

INSERT INTO `mysql`.`user`(`Host`, `User`, `authentication_string`)
VALUES ('%', 'user01', '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9');
FLUSH PRIVILEGES ;

注意:这里host赋值%,就是代表所有IP可以通过user01用户连接MySQL服务器。修改系统表之后需要执行一次刷新操作。

二、访问鉴权

1、权限控制

MySQL数据库系统中,权限分配涉及到如下几张核心表:user、db、table_pric、columns_priv。在权限认证时候遵守该顺序逐步验证。

  • 权限表描述

user表:存储用户和用户全局权限,也是MySQL鉴权流程首当其冲的表 ;

db表:保存数据库权限 ;

tables_priv表:存储表权限,面向一个特定表中的和其中所有列;

columns_priv表:存储列权限,面向一个特定表中的单一列;

注意:权限表的管理,不止上述描述的几个,但是人生苦短,把这几个理顺了,其他表也应该可以顺藤摸瓜找过去。

  • user表结构

这里处理包含用户的连接信息,还有很多权限点认证。

CREATE TABLE `user` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(32) COLLATE utf8_bin NOT NULL DEFAULT '',
`Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
... //此处省略很多
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges';

注意:注释说明,用户和全局权限管理。

  • 权限点描述

对一般开发流程而言,知道如下几个权限点管理即可,道理同上,到需要使用的时候再去熟悉,不差时。

SELECT: 查询表中的记录 ;
INSERT: 向表中写入新数据 ;
UPDATE: 更新表数据;
DELETE: 删除表的记录 ;
CREATE: 创建数据库和表 ;
DROP: 删除数据库和表 ;

絮叨一句:工作几年之后,你最喜欢写的程序逻辑是什么?反正我就想写写简单的增删改查操作。

2、鉴权流程

首先验证user表,其次db表,然后table表,再然后column表;

基于范围逐级缩小,权限不断的细化。

  • 测试user01用户权限

权限查询

首先查看user01用户的查询权限。此时该用户是具有select权限的。

SELECT t.`Host`,t.`User`,t.Select_priv
FROM mysql.`user` t WHERE t.`User`='user01' ;

基于客户端工具,使用user01用户登录MySQL服务器,可以正常使用查询权限。

禁用查询权限点

UPDATE `mysql`.`user` SET `Select_priv` = 'N' WHERE `User` = 'user01';
FLUSH PRIVILEGES ;

权限验证

使用user01登录的客户端,不能查询表数据,说明权限管理起到作用了。

三、日志记录系统

1、日志配置查看

基于该语句查看日志相关配置,例如日志地址,是否开启关闭,日志缓存大小,相关配置信息。

SHOW GLOBAL VARIABLES LIKE '%log%';

正常停止MySQL服务器,可以通过my.cnf更改相关配置。Linux下配置文件一般在/etc/my.cnf中。

2、InnoDB事务日志

InnoDB的事务日志包括Redo-log和Undo-log两种,这个日志的描述在MySQL5.7官方文档的InnoDB存储引擎-磁盘结构模块下面。

  • Redo-log

重做日志:基于磁盘的数据结构,记录事务性操作崩溃期间没有正常写入库的数据,重做:处理日志中没有正常写入的数据记录,完成数据入库。

  • Undo-log

回滚日志:提供回滚操作和多个行版本控制MVCC,事务提交时,会记录Undo-log,当事务失败或执行回滚,就需要通过Undo-log进行回滚。思维跳跃一层:当写入数据时,日志记录应该是新增标记,要执行的记录是删除这条数据操作,删除数据,过程应该相反,要记录的是删除的这条数据的写入操作。

2、错误日志

在MySQL的配置文件中,log_error是强制开启的,且没有关闭开关,用来记录mysql服务器每次启动和关闭时的详细信息,以及运行过程中出现的的严重警告信息和错误信息等,Linux下配置如下:

log-error=/var/log/mysqld.log

错误日志包含mysqld启动和关闭时间的记录。它还包含诊断消息,例如错误,警告和注释,它们在服务器启动和关闭期间以及服务器运行期间发生。例如,如果mysqld注意到需要自动检查或修复表,它将向错误日志中写入一条消息。

3、通用查询日志

General-Query-Log,所有连接和语句被记录到日志文件。当想知道客户端发生了错误并想确切地知道该客户端发送给mysqld的语句时,该日志可能非常有用。mysqld按照它接收的顺序记录语句到查询日志。可能与执行的顺序不同。这与更新日志和二进制日志不同,它们在查询执行后,但是任何一个锁释放之前记录日志。MySQL5.6版本下是默认关闭的。

4、二进制日志

Binary-Log,主要用来记录数据库更改,例如表创建操作或表数据更改的事件,对于主从复制流程,主库服务器上的二进制日志发送到从库服务器,从服务器执行这些事件,保证主从服务器的数据同步。

log_bin  OFF

MySQL5.6版本下,该日志默认是关闭的。

5、慢查询日志

Slow-Query-Log慢查询日志主要记录mysql中执行的时间比较长的sql,默认的阈值是10秒,执行时间超过10秒的sql语句就会被慢查询日志所记录,慢查询日志的配置可以在mysql的配置文件中配置,默认不开启。

SHOW GLOBAL VARIABLES LIKE '%long_query_time%';

开启慢查询日志,通过对该时间的调整,可以记录性能差的SQL语句,进行分析优化,对系统性能的提升十分有帮助。

四、源代码地址

GitHub·地址
https://github.com/cicadasmile/mysql-data-base
GitEE·地址
https://gitee.com/cicadasmile/mysql-data-base

MySQL基础篇(07):用户和权限管理,日志体系简介的更多相关文章

  1. MySQL/MariaDB数据库的用户和权限管理

    MySQL/MariaDB数据库的用户和权限管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.元数据数据库(mysql) 系统授权表(均在mysql数据库中): db hos ...

  2. Mysql 用户,权限管理的几点理解。

    前两天项目数据库要移植到mysql,为此临时抓了几天很久没用的mysql. 公司的数据库比较简单,从oracle迁移到mysql很简单,但是,中间的权限管理让我感觉既简单又复杂..简单是因为网上关于m ...

  3. MySQL用户与权限管理

    执行mysql select 查询报错: SELECT command denied to user 'root'@'localhost' for table "xxx" 问题原因 ...

  4. mysql用户和权限管理

    用户和权限管理 Information about account privileges is stored in the user, db, host, tables_priv, columns_p ...

  5. mysql 用户及权限管理 小结

    MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用.如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接. 在 MySQL 命令行模式下输入如下命 ...

  6. Mysql 用户和权限管理

    用户和权限管理: 语法 grant 权限 on 数据库.数据表 to '用户' @ '主机名'; 例:给 xiaogang 分配所有的权限 grant all on *.* to 'xiaogang' ...

  7. MySQL Study之--MySQL用户及权限管理

    MySQL Study之--MySQL用户及权限管理     MySQLserver通过MySQL权限表来控制用户对数据库的訪问.MySQL权限表存放在mysql数据库里.由mysql_install ...

  8. MySQL数据库用户和权限管理

    一.视图 视图:VIEW,虚表,保存有实表的查询结果,在视图插入的内容都会存入表中.创建方法: CREATE VIEW view_name [(column_list)] AS select_st ...

  9. MySQL高级学习笔记(二):mysql配置文件、mysql的用户与权限管理、mysql的一些杂项配置

    文章目录 mysql配置文件 二进制日志log-bin 错误日志log-error 数据文件 两系统 Myisam存放方式 innodb存放方式 如何配置 mysql的用户与权限管理 MySQL的用户 ...

随机推荐

  1. Css兼容性大全

    知识有所欠缺  疯狂脑补抄袭经验中... 兼容性处理要点1.DOCTYPE 影响 CSS 处理 2.FF: 设置 padding 后, div 会增加 height 和 width, 但 IE 不会, ...

  2. Thrift RPC实战(三) thrift序列化揭秘

    本文主要讲解Thrift的序列化机制, 看看thrift作为数据交换格式是如何工作的? 1.构造应用场景: 1). 首先我们先来定义下thrift的简单结构. 1 2 3 4 5 namespace ...

  3. BTCU(高校区块链联盟)-联盟链第6讲作业

    // payment project main.go package main import ( "fmt" "strconv" "github.co ...

  4. 码海拾遗:Linux多线程mutex锁

    多线程计数,每个线程累加10个数. 实现: #include <stdio.h> #include <stdlib.h> #include <string.h> # ...

  5. PHPExcel之蛋疼

    限制了内存,处理个80+K的表就会GG,所以还要尽量删空行,选中某一行如A3,ctrl+shift+↓然后ctrl+小键盘的减号最后需要ctrl+s

  6. RPi.GPIO 和 HM

    后续笔记不再记录导入的模块和硬件的连接方法,请根据关键词自行搜索. RPi.GPIO模块 GPIO:General Purpose Input Output 即 通用输入/输出 RPi.GPIO是一个 ...

  7. 爬虫cookies详解

    cookies简介 cookie是什么? Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密).定义于 ...

  8. python爬虫之浅析验证码

    一.什么是验证码? 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”( ...

  9. Web最佳实践阅读总结(2)

    代码符合标准 标准的页面会保证正确的渲染 页面容易被搜索引擎搜索,提高搜索排名(SEO) 提高网站的易用性 网页更好维护和扩展(Validator,HTML Validator 属于Firefox插件 ...

  10. 工作技术点小计14条 hybrid + animate 方向

    设置transition 动画的时候 , js直接设置duration 和 变化值不会起作用 , 需要先设置duration , 等一小会再设置变化值 安卓端 , 窗口不可见时 , window.in ...