MySQL数据库——权限控制及日志管理

MySQL数据库——权限控制及日志管理

一、MySQL的用户管理和权限管理

1.DCL(Data Control Language数据库控制语言)

• 数据库授权、角色控制等操作

• GRANT用户授权,为用户赋予访问权限

• REVOKE取消授权,撒回授权权限

2.MySQL权限表

Mysql权限由权限表管理,权限表分为:

2.1、mysql.user

• 用户字段:Host、user、password

• 权限字段:_priv结尾字段

• 安全字段:ssl x509字段

• 资源控制字段:max_开头的字段

2.2、mysql.db

• 用户字段:host、user、password

• 权限字段:剩下的_priv结尾的字段

2.3、mysql.tables_priv、mysql.columns_priv、procs_priv

• 对于表、列、存储过程的授权表

2.4、授权级别排列

• mysql.user #全局授权

• mysql.db #数据库级别授权

• 其他 #表级、列级授权

2.5、数据库和表格式

数据库和表格式 含义
数据库名.* 数据库中的所有
数据库名.表名 指定数据库中的某张表
数据库名.存储过程 指定数据库中的存储过程
* . * 所有数据库

2.6、用户和IP格式

用户和IP格式 含义
用户名@IP地址 用户只能在该IP下才能访问
用户名@192.168.1.% 用户只能在该IP网段中才能访问(通配符%表示任意)
用户名@%.xxx.com 用户只能以.xxx.com域名为后缀的主机才能登录
用户名@% 用户可以在任意IP下访问(默认的IP地址就是%)

3.MySQL用户管理

3.1、创建用户

#create user语句创建
create user '用户名'@'IP地址' identified by '密码';
#例:
create user 'test'@'%' identified by '111';

#grant语句创建
grant select on 数据库和表权限 to '用户名'@'IP地址' identified by "密码";
#例:
grant select on *.* to 'test'@'%' identified by "111";

3.2、删除用户

#drop user语句删除
drop user '用户名'@'IP地址'
#例:
drop user 'user1'@'localhost'

#delete语句删除
delete from mysql.user where user='用户名' and host='IP地址';
#例:
delete from mysql.user where user='test' and host='%';

3.3、修改用户名和IP地址

rename user '旧用户名'@'IP地址' to '新用户名'@'IP地址';
#例:
rename user 'test'@'localhost' to 'demo'@'localhost';

3.4、修改密码

注意:修改完密码必须刷新权限flush privileges

①root用户修改自己密码

方法一:命令行输入
	mysqladmin -uroot -p原密码 password '新密码'

方法二:数据库中输入
	alter user 'root'@'localhost' identified by '新密码';

方法三:数据库中输入
	set PASSWORD=password('新密码');

②root用户修改其他用户密码

都在数据库中输入
方法一:
	alter user '用户名'@'IP地址' identified by '新密码';

方法二:
	grant select on *.* to '' '用户名'@'IP地址' identified by '新密码';

③普通用户修改自己密码

数据库中输入:
	set password=password('新密码')

3.5、找回root密码

如果有一天,忘记了root的密码,那如何找回root密码?

♩ 修改Mysql配置文件/etc/my.cnf

#在[mysqld]下面加上skip-grant-tables
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
…………
#设置免密登陆
skip-grant-tables

♪ 重启Mysql

[root@localhost ~]# systemctl restart mysqld

♫ 修改密码

#终端输入mysql直接登录mysql数据库
[root@localhost ~]# mysql
#切换到mysql系统库
mysql> use mysql;

#设置root密码
mysql> update user set authentication_string=password('新密码') where user='root';

♬ 把第一步的免密登陆注释掉

[root@localhost ~]# vim /etc/my.cnf
[mysqld]
…………
#skip-grant-tables

最后重新启动mysqld服务即可。

3.6、密码复杂度策略

♪ 安装密码插件

mysql默认启用了密码复杂度设置,插件的名字叫做validate_password

#安装插件
mysql> install plugin validate_password soname 'validate_password.so';

♪ 安装并修改配置文件

#修改配置文件
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
…………
plugin-load=validate_password.so	#安装插件
validate_password_policy=0(或1或2)	#可自行配置规则
validate_password=FORCE_PLUS_PERMANENT
#重启mysql生效
[root@localhost ~]# systemctl restart mysqld

♫ 登录数据库查看规则

mysql> show variables like 'validate%';

字段含义:

1.validate_password_policy

代表的密码策略,可配置的值有以下:

——0 or LOW 仅需符合密码长度即可(由参数validate_password_length指定)。

——1 or MEDIUM满足LOW策路,同时还需满足至少有1个数字,小写字母,大写字母和特殊字符。

——2 or STRONG满足MEDIUM策略,同时密码不能存在字典文件(dictionary file)中。

2.validate_password_dictionary_file

用于配置密码的字典文件,当validate_password_policy设置为STRONG时可以配置密码字典文件,字典文件中存在的密码不得使用。

3.validate_password_length

用来设置密码的最小长度,默认值是8最小是0

4.validate_password_mixed_case_count

当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少同时拥有的小写和大写字母的数量,默认是1最小是0;默认是至少拥有一个小写和一个大写字母。

5.validate_password_number_count

当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的数字的个数,默认1最小是0。

6.validate_password_special_char_count

当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的特殊字符的个数,默认1最小是0。

4.权限管理

4.1回收权限

对于数据库既然能添加权限,就能回收权限,命令是:

revoke 权限 on 数据库.数据表 from '用户名'@'IP地址'

• 被回收的权限必须存在,否则会出错;

• 整个服务器——使用grant allevoke all;

• 整个数据库——使用on datebases.*;

• 特定的表——使用on datebase.table;

4.2刷新权限

mysql> flush privileges;

flush privileges命令本质上的作用是将当前user和privilige表中的用户信息/权限设置从mysql库(MySQL数据库的内置库)中提取到内存里。

MySQL用户数据和权限有修改后,搜索希望在"不重启MySQL服务"的情况下直接生效,那么就需要执行这个命令。

4.3查看权限

show grants for '用户名'@'IP地址';
#可以不指定用户,则显示当前用户权限。
show grants;

4.4授权及设置密码

#授权及设置密码
grant 权限1[,权限2,权限3...] no 数据库.数据表 to '用户名'@'IP地址';
grant 权限1[,权限2,权限3...] no 数据库.数据表 to '用户名'@'IP地址' identified by '密码';

可以简化多次授权,并用逗号分割。grant需要明确的信息:要授权的权限;被授权权限的数据库或表;用户名。

权限 权限可操作级别 权限说明
create 库、表或索引 创建库、表、或索引权限
drop 库或表 删除库或表权限
grant option 库、表、或保存的程序 赋予权限选项权限
references 库或表 是否允许创建外键权限
alter 更改表,如添加字段、索引等权限
delete 删除数据权限
index 索引权限
insert 插入权限
select 查询权限
update 更新权限
create view 视图 创建视图权限
show view 视图 查看视图权限
alter routine 存储过程 更改存储过程权限
create routine 存储过程 创建存储过程权限
execute 存储过程 执行存储过程权限
file 服务器主机上的文件访问 文件访问权限
create temporary table 服务器管理 创建临时表权限
lock tables 服务器管理 锁表权限
create user 服务器管理 创建用户权限
reload 服务器管理 执行flush-hosts,flush-logs,flush-privileges,flush-status,flush-tables,flush-threads,refresh,reload等命令的权限
process 服务器管理 查看进程权限
replication client 服务器管理 允许执行show master status,show slave status,show binary logs命令
replication slave 服务器管理 允许slave主机通过此用户连接master以便建立主从复制关系
show datebases 服务器管理 查看数据库权限
shutdown 服务器管理 关闭数据库权限
super 服务器管理 执行kill线程权限
权限分布 可能的设置的权限
表权限 Select’,‘Insert’,‘Update’,‘Delete’,‘Create’,‘Drop’,‘Grant’,‘References’,‘Index’,‘Alter’
列权限 ‘Select’,‘Insert’,‘Update’,‘References’
过程权限 Execute’,‘Alter Routine’,‘Grant’

二、Mysql日志管理

1.Mysql错误日志

错误日志的作用:记录MySQL启动及工作过程中,状态、报错、警告。

设置错误日志

#配置错误日志,修改配置文件,并重启MySQL
[root@localhost ~]# vim /etc/my.cnf
log_error=/mnt/mysql.log #这里的路径和文件名称可以随便定义
[root@localhost ~]# systemctl restart mysqld

查看错误日志

mysql> select @@log_error;
+-----------------+
| @@log_error 	  |
+-----------------+
| /mnt/mysql.log  |
+-----------------+
1 row in set (0.00 sec)

注意:查看错误日志时关注[ERROR]的上下文

2.Mysql二进制日志

二进制日志的作用:数据恢复必备日志;主从复制依赖的日志

二进制日志的设置

#修改配置文件
[root@localhost ~]# vim /etc/my.cnf
server_id=1
log_bin=/mnt/binlog/mysql-bin
#server_id是mysql5.7版本之后开二进制日志的必加参数
#log_bin= 打开二进制功能
#/mnt/binlog 为指定存放路径
#mysql-bin 为文件名前缀

#创建目录并授权
[root@localhost ~]# mkdir -p /mnt/binlog/
[root@localhost ~]# chown -R mysql.mysql /mnt/binlog/*
[root@localhost ~]# systemctl restart mysqld

配置说明:

mysql-bin 是在配置文件配置的前缀。

000001 MySQL每次重启,重新生成新的。

二进制日志的内容

除了查询类的语句,都会记录,即所有数据库变更类的语句

①记录语句的种类

• DDL(数据定义语言):create、drop

• DCL(数据控制语言):grant、revoke

• DML(数据操作语言):insert、update、delete

②不同语句的记录格式说明

• DDL、DCL直接以语句(statement)方式记录

• DML语句有三种模式:SBR、RBR、MBR

模式说明:

• statement——>SBR:做什么记录什么,即SQL语句

• row——>RBR:记录数据行的变化

• mixed——>MBR:自动判断记录模式

• SBR和RBR的区别

区别项 SBR RBR
记录内容 SQL语句 记录数据行的变化
可读性 较强
日志量
日志记录准确性 数据误差 没有误差
#修改二进制日志工作模式
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
binlog_format='MIXED'
#查看二进制日志是否开启
mysql> show variables like '%binlog%';

2.1二进制日志三种模式的区别

2.1.1、ROW:基于行的复制

优点:所有的语句都可以复制,不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。

缺点:binlog大了很多,复杂的回滚时binlog中会包含大量的数据;主服务器上执行update语句时,所有发生变化的记录都会写到binlog中;比如有这样一条update语句update product set owner_member_id='d'where owner_member_id-'a'执行之后,日志中记录的不是这条update语句所对应的事件(mysql是以事件的形式来记录bin-log日志),而是这条语句所更新的每一条记录的变化情况,这样就记录成很多条记录被更新的很多事件。自然bin-log日志的量会很大。

2.1.2、Statement:基于sql语句的复制

优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。

缺点:由于它是记录的执行语句,所以为了让这些语句在slave端也能正确执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端被执行的时候能够得到和在master端执行时候相同的结果。另外就是,由于mysql现在发展比较快,很多的新功能加入,使mysql的复制遇到了不小的挑战,自然复制的时候涉及到越复杂的内容,bug也就越容易出现。在statement level下,目前已经发现的就有不少情况会造成mysql的复制问题,主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现,比如sleep()在有些版本就不能正确复制。

2.1.3、mixed模式:row与statement结合

实际上就是前两种模式的结合,在mixed模式下,mysql会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在statement和row之间选一种。新版本中的statement level还是和以前一样,仅仅记录执行的语句。而新版本的mysql中对row level模式被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时侯就会以statement模式来记录,如果sgl语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。

2.2二进制日志事件

2.2.1、二进制日志事件简介

• 二进制日志内容以事件(binlog events)为最小记录单元。

• 对于DDL和DCL,一个语句就是一个事件。

• 对于DML(标准的事务语句),只记录已提交的事务的DML语句

begin	;		事件1
a				事件2
b				事件3
commit	;		事件4
2.2.2、事件的构成(为了截取日志)
[root@localhost data]# mysqlbinlog mysql-bin.000001
#at219					事件开始的位置(position)
end_log_pos 319			事件结束的位置(position)
#220811 14:28:12		事件发生的时间
create database aaaaa	事件内容
2.2.3、二进制日志的基础查看
#查看二进制日志的配置信息
mysql> show variables like '%log_bin%';

字段说明:

• log_bin开启二进制日志的开关

• log_bin_basename位置

• sql_log_bin临时开启或关闭二进制日志的小开关

#查看二进制日志的基本信息
mysql> show binary logs;
#查看当前正在使用的二进制日志
mysql> show master status;(常用)

2.3二进制日志内容的查看和截取

#二进制文件不能用vim查看,要用mysqlbinlog命令查看
[root@localhost data]# mysqlbinlog 路径/mysql-bin.000001
#mysql中查看当前记录事务的二进制文件
mysql> show master status;
#查看该文件中的具体事务
mysql> show binlog events in '二进制文件名'

日志截取语法:

• --start-position 开始截取pod点

• --stop-position 结束截取pod点

#截取日志并另存为一个用来恢复的文件
[root@localhost data]# mysqlbinlog --start-position=xxx --stop-position 路径/mysql-bin.00000x > 路径/自定义名字.sql
#恢复
mysql> source 路径/自定义名字.sql

mysql> begin;		#开始事务
mysql> commit;		#提交事务

2.4基于gtid的二进制日志管理

gtid(Global Transaction ID)简介

• 全局唯一的事务编号。

• 幂等性。

• Gtid包括两部分:Server_uuid和Tx_id。

gtid配置

#查看gtid
mysql> show variables like '%gtid%';
+----------------------------------+-----------+
| Variable_name                    | Value     |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery      | ON        |
| enforce_gtid_consistency         | OFF       |
| gtid_executed_compression_period | 1000      |
| gtid_mode                        | OFF       |
| gtid_next                        | AUTOMATIC |
| gtid_owned                       |           |
| gtid_purged                      |           |
| session_track_gtids              | OFF       |
+----------------------------------+-----------+
8 rows in set (0.01 sec)
#修改配置
[root@localhost data]# vim /etc/my.cnf
[msyqld]
gtid_mode=on					#开启gtid
enforce_gtid_consistency=true	#强制GTID一致性
log_slave_updates=1				#主从复制中从库记求bin1og,并统一GTID信息
#重启数据库生效
[root@localhost data]# systemcat restart mysqld
#此时查看gtid就开启了
mysql> show variables like '%gtid%';
+----------------------------------+-----------+
| Variable_name                    | Value     |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery      | ON        |
| enforce_gtid_consistency         | ON       |
| gtid_executed_compression_period | 1000      |
| gtid_mode                        | ON        |
| gtid_next                        | AUTOMATIC |
| gtid_owned                       |           |
| gtid_purged                      |           |
| session_track_gtids              | OFF       |
+----------------------------------+-----------+
8 rows in set (0.01 sec)

基于gtid截取日志

• 对于DDL和DCL 一个操作就是一个GTID

• 对于DML 一个完整的事务就是一个GTID

--include-gtids=包含
--exclude-gtids=排除
--skip-gtids=跳过
#如截取1-3号事务
[root@localhost data]# mysqlbinlog --include-gtids='827ddb16-4ec8-11ea-b734-000c293df1f0:1-3'/usr/lcoal/mysql/data/mysql-bin.000003 > /usr/lcoal/mysql/data/gtid.sql
#截取1-10号事务,跳过6号事务
[root@localhost data]# mysqlbinlog --include-gtids='827ddb16-4ec8-1lea-b734-000c293df1f0:1-10 --exc1ude-gtids:='545fd699-be48-11e9-8f0a-000c2980e248:6' /usr/lcoal/mysql/data/mysql-bin.000003>/usr/lcoal/mysql/data/gtid.sql

3.Mysql慢日志

慢日志简介

• 记录运行较慢的语句记录slowlog中。

• 功能是铺助优化的工具日志。

• 应激性的慢可以通过show processlisti进行监控。

• 一段时间的慢可以进行slow记录、统计。

慢日志配置

#查看慢日志是否开启
mysql> show variables like '%slow_query%';
+---------------------+------------------------------------------+
| Variable_name       | Value                                    |
+---------------------+------------------------------------------+
| slow_query_log      | OFF                                      |
| slow_query_log_file | /usr/local/mysql/data/localhost-slow.log |
+---------------------+------------------------------------------+
2 rows in set (0.01 sec)
#此时慢日志是关闭的
#重连或者新开一个会话才能看到修改值
#查看阈值(达到多长时间才能记录慢日志)
mysql> select @@long_query_time;
+-------------------+
| @@long_query_time |
+-------------------+
|         10.000000 |
+-------------------+
1 row in set (0.00 sec)
#设置阈值为3秒
mysql> set global long_query_time=3;
#修改配置文件,开启慢日志
[root@localhost data]#vim /etc/my.cnf
[mysqld]
slow_query_log=1
slow_query_log_file=/usr/local/mysql/data/qfedu-slow.log
1ong-query_time=3  #默认配置10秒
log_queries_not_using_indexes=1
#重启数据库生效

慢日志分析工具

#得到返回记录集最多的10个SQL
mysqldumpslow -s r -t 10 /usr/local/mysql/data/test-slow.log
#得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /usr/local/mysql/data/test-slow.log
#得到按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "LEFT JOIN"
/usr/local/mysql/data/test-s1ow.1og
#结合|more使用,防止爆屏情况
mysqldumpslow -s r -t 10/usr/local/mysql/data/test-slow.log | more
#选项含义
s:表示按何种方式排序
c:访问次数
l:锁定时间
r:返回记录
t:查询时间
al:平均锁定时间
ar:平均返回记录数
at:平均查询时间
t:返回前面多少条的数据
g:后边搭配一个正则匹配模式,大小写不敏感
--help查看帮助

END

猜你喜欢

转载自blog.csdn.net/tu464932199/article/details/126396805