MySQL日志管理和权限管理(重点)

一、日志管理

日志类型

  • 1、错误日志:启动,停止,关闭失败报错。rpm安装日志位置/var/log/mysqld.log 默认开启
  • 2、通用查询日志:所有的查询都记下来。默认关闭,一般不开启
  • 3、二进制日志(bin log):实现备份,增量备份。只记录改变数据,除了select都记
  • 4、中继日志(Relay log):读取主服务器的binlog,在slave机器本地回放,保持与主服务器数据一致
  • 5、slow log:慢查询日志,指导调优,定义某一个查询语句,执行时间过长,通过日志提供调优建议给开发人员
  • 6、DDL log: 数据定义语言的日志

1.错误日志

[root@localhost ~]# mkdir -p /usr/local/mysql/logs/
[root@localhost ~]# touch /usr/local/mysql/logs/mysqld.log
[root@localhost ~]# chown -R mysql:mysql /usr/local/mysql/logs/
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
log-error=/usr/local/mysql/logs/mysqld.log
//log-error=/var/log/mysqld.log
//编译安装的在/usr/local/mysql/,yum安装的在/var/log/mysqld.log
[root@localhost ~]# systemctl restart mysqld

2.二进制日志

//Binary Log:需要提前开启
[root@localhost ~]# mkdir -p /usr/local/mysql/logs/mysql-bin
[root@localhost ~]# chown -R mysql:mysql /usr/local/mysql/logs/mysql-bin
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
log-bin=/usr/local/mysql/logs/mysql-bin/mylog  //如果不指定路径默认在/var/lib/mysql
server-id=1   //AB复制的时候使用,为了防止相互复制,会设置一个ID,来标识谁产生的日志
[root@localhost ~]# systemctl restart mysqld
​
//查看binlog日志
[root@localhost]# cd /usr/local/mysql/logs/mysql-bin/
[root@localhost mysql-bin]# ls
mylog.000001  mylog.index
​
[root@localhost mysql-bin]# mysqlbinlog mylog.000001 -v
mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8
​
//取消字符集查看binlog日志
[root@localhost mysql-bin]# mysqlbinlog --no-defaults mylog.000001  -v
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#230706 11:51:53 server id 1  end_log_pos 123 CRC32 0x510185a5  Start: binlog v 4, server v 5.7.41-log created 230706 11:51:53 at startup
#Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
WTqmZA8BAAAAdwAAAHsAAAABAAQANS43LjQxLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABZOqZkEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AaWFAVE=
'/*!*/;
# at 123
#230706 11:51:53 server id 1  end_log_pos 154 CRC32 0x8293327a  Previous-GTIDs
#[empty]
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
#End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
#注:
1. 重启mysqld 会截断日志   
2. mysql> flush logs;   //会截断
3. mysql> reset master;   //删除所有binlog,不要轻易使用,相当于:rm -rf /
4. 删除部分
    mysql> PURGE BINARY LOGS TO 'mylog.000002';   //删除mysqllog.000002之前的日志 purge:清除
5. 暂停 仅当前会话
    SET SQL_LOG_BIN=0;  //关闭
    SET SQL_LOG_BIN=1;  //开启
=======================================================================
解决binlog日志不记录insert语句:
1. 登录mysql后,设置binlog的记录格式:
        mysql> set binlog_format=statement;
2. 然后,最好在my.cnf中添加:
        binlog_format=statement
3.修改完配置文件之后记得重启服务

3.慢查询日志

1、Slow Query Log :慢查询开关打开后,并且执行的SQL语句达到参数设定的阈值后,就会触发慢查询功能打印出日志
2、慢查询日志主要是记录执行时间超过指定阈值的SQL语句,这些执行时间较长的语句称为"慢查询"。
3、作用:监控和分析慢查询,有助于优化SQL和数据库架构。通过分析慢查询,可以了解哪些SQL执行效率低下,哪些表或者索引需要优化。

[root@localhost ~]# mkdir /usr/local/mysql/logs/mysql-slow/
[root@localhost ~]# touch /usr/local/mysql/logs/mysql-slow/slow.log
[root@localhost ~]# chown mysql.mysql /usr/local/mysql/logs/mysql-slow/
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
slow_query_log=1  //开启
slow_query_log_file=/usr/local/mysql/logs/mysql-slow/slow.log
long_query_time=3    //设置慢查询超时间,单位是秒,就是超过3秒的sql查询语句就被认为慢查询sql
[root@localhost ~]# systemctl restart mysqld
//验证查看慢查询日志
mysql> select sleep(6);     //等待 6 秒钟,然后返回结果[root@localhost ~]# cat /usr/local/mysql/logs/mysql-slow/slow.log

二、权限管理(重点)

1.用户登录管理

1.1.本地登录

[root@localhost ~]# mysql -uroot -p'Jianglt@123'

1.2.客户端远程登陆
需要注意的是:远程端也需要有mysql的客户端才行
客户端语法:mysql -u 用户名 -P 端口号 -p 密码 -h ip地址
-P端口号:如果是默认端口号就不用-P指定端口

[root@localhost ~]# mysql -h192.168.17.131 -P 3306 -uroot -p'Jianglt@123'
-bash: mysql: 未找到命令
[root@localhost ~]# yum -y install mysql
[root@localhost ~]# mysql -h192.168.17.131 -P 3306 -uroot -p'Jianglt@123'
ERROR 1130 (HY000): Host '192.168.17.128' is not allowed to connect to this MySQL server
如果报错进入server端服务器,登陆mysql执行授权操作
mysql> use mysql;
mysql> update user set host='%' where user='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> flush privileges;

1.3.免入库的方法执行sql语句

[root@localhost ~]# mysql -h192.168.17.131 -P 3306 -uroot -p'Jianglt@123' -e 'show databases;'

-h 指定主机名 【默认为localhost】
-大P MySQL服务器端口 【默认3306】
-u 指定用户名 【默认root】
-p 指定登录密码 【默认为空密码】
-e 接SQL语句,可以写多条用;隔开

[root@localhost ~]# mysql -h192.168.17.131 -P 3306 -uroot -p'Jianglt@123' -D mysql -e 'select * from user;'
//此处 -D mysql为指定登录的数据库//同时执行2条sql语句
[root@localhost ~]# mysql -h192.168.17.131  -P 3306 -uroot -p'Jianglt@123' -D company -e 'show tables;select  * from employee5;'
+-------------------+
| Tables_in_company |
+-------------------+
| employee5         |
| new_t1            |
| new_t2            |
+-------------------+
+----+---------+--------+------------+------------+-----------------+--------+--------+
| id | name    | sex    | hire_date  | post       | job_description | office | dep_id |
+----+---------+--------+------------+------------+-----------------+--------+--------+
|  3 | jack    | male   | 2018-02-02 | instructor | teach           |    501 |    100 |
|  4 | harry   | male   | 2018-02-02 | hr         | NULL            |    502 |    101 |
|  5 | lili    | female | 2018-02-06 | sale       | salecc          |    503 |    102 |
|  6 | xiaoguo | male   | 2018-02-05 | sale       |                 |    503 |    102 |
+----+---------+--------+------------+------------+-----------------+--------+--------+

​1.4.修改端口(rpm安装)

[root@localhost ~]# vim /etc/my.cnf
port=2222
[root@localhost ~]# systemctl restart mysqld
//在到【mysqld】标签下面添加port=指定端口重启服务

2.创建用户及授权

2.1.方法一:CREATE USER语句创建

#创建用户为tom,并设置密码
mysql> create user tom@'localhost' identified by 'Jianglt@123';#更新授权表
mysql> flush privileges; 

#查询现有的用户
mysql> select host,user from mysql.user;
+-----------+---------------+
| host      | user          |
+-----------+---------------+
| %         | root          |
| localhost | mysql.session |
| localhost | mysql.sys     |
| localhost | tom           |
+-----------+---------------+
4 rows in set (0.00 sec)
注:
identified by 是设置密码的
在用户tom@'  ' 这里可以选择:
%:允许所有主机远程登陆包括localhost。也可以指定某个ip,允许某个ip登陆。也可以是一个网段。
localhos:只允许本地用户登录

客户端登录的方式:
            %                       所有主机远程登录
            192.168.246.%           192.168.246.0网段的所有主机
            192.168.246.252         指定主机
            localhost               只允许本地用户登录
mysql> create user jack@'192.168.17.%' identified by'Jianglt@123';
Query OK, 0 rows affected (0.00 sec)
​
mysql> select host,user from mysql.user;
+--------------+---------------+
| host         | user          |
+--------------+---------------+
| %            | root          |
| 192.168.17.% | jack          |
| localhost    | mysql.session |
| localhost    | mysql.sys     |
| localhost    | tom           |
+--------------+---------------+
5 rows in set (0.00 sec)

2.2.方法二:GRANT 创建用户并同时授权
(注:mysql 8.0必须是先创建用户再授权)
语法:grant 权限列表 on 库名.表名 to '用户名'@'客户端主机' IDENTIFIED BY '口令';
all privileges:授予所有权限,包括SELECT、INSERT、UPDATE、DELETE 等所有权限
on *.*:代表对所有数据库( * )下所有表(.*)

权限列表:

all所有权限(不包括授权权限)
select,update查询,更新的权限
select,insert查询,插入的权限

数据库.表名:

*.*所有库下的所有表
web.*web库下的所有表
web.student_infoweb库下的student_info表

单独授权

#给刚才创建的用户tom授权:
mysql> grant select,insert on *.* to 'tom'@'localhost' identified by 'Jianglt@123';
mysql> flush privileges;
案例:
#创建test用户,并授权所有权限,只允许本地登录,密码为ABcabc123.com@
mysql> grant all privileges on *.* to 'test'@'localhost' IDENTIFIED BY 'ABcabc123.com@';

#如果用户已存在,则会修改test用户的登录方式(改成所有主机)和修改登陆密码;如果用户不存在,则会创建
mysql> grant all privileges on *.* to test@'%' identified by 'Jianglt@123';
mysql> flush privileges;

备注
1.无用户时可以创建用户并指定口令
2.口令有密码复杂性要求
3.%表示任意主机
口令复杂性要求出错提示:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
需要执行两个参数来把mysql默认的密码强度的取消

mysql> set global validate_password_policy=0; 
mysql> set global validate_password_mixed_case_count=2;
set global validate_password_policy=0;

控制MySQL密码强度验证的级别:
0 - 低级别,不做任何密码强度验证
1 - 中等级别,密码必须长度为8字节且不能和用户名相同
2 - 高级别,密码必须符合 medum 级别并且包括数字、大小写字母和特殊字符等
set global validate_password_mixed_case_count=2;
控制密码中必须包含的大小写字符数;设置为2表示要求密码中至少包含2个大小写字符

#修改远程登陆:将原来的localhost修改为%或者ip地址
mysql> select host,user from mysql.user;
+--------------+---------------+
| host         | user          |
+--------------+---------------+
| %            | root          |
| 192.168.17.% | jack          |
| localhost    | mysql.session |
| localhost    | mysql.sys     |
| localhost    | test          |
| localhost    | tom           |
+--------------+---------------+
7 rows in set (0.00 sec)
​
mysql> use mysql
mysql> update user set host = '192.168.17.%' where user = 'tom';
mysql> flush privileges;
​
mysql> select host,user from mysql.user;
+--------------+---------------+
| host         | user          |
+--------------+---------------+
| %            | root          |
| %            | test          |
| 192.168.17.% | jack          |
| 192.168.17.% | tom           |
| localhost    | mysql.session |
| localhost    | mysql.sys     |
| localhost    | test          |
+--------------+---------------+
7 rows in set (0.00 sec)

3.刷新权限

修改表之后需要刷新权限

mysql > flush privileges;

4.权限简介

权限权限级别权限说明
CREATE数据库、表或索引创建数据库、表或索引权限
DROP数据库或表删除数据库或表权限
GRANT OPTION数据库、表或保存的程序赋予权限选项
ALTER更改表,比如添加字段、索引等
DELETE删除数据权限
INDEX索引权限
INSERT插入权限
SELECT查询权限
UPDATE更新权限
LOCK TABLES服务器管理锁表权限
CREATE USER服务器管理创建用户权限
REPLICATION SLAVE服务器管理复制权限
SHOW DATABASES服务器管理查看数据库权限

5.查看权限

5.1.看自己的权限

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

5.2.看别人的权限

mysql> show grants for tom@'localhost';
+--------------------------------------------------+
| Grants for tom@localhost                         |
+--------------------------------------------------+
| GRANT SELECT, INSERT ON *.* TO 'tom'@'localhost' |
+--------------------------------------------------+
1 row in set (0.00 sec)
​
mysql> show grants for tom@'localhost'\G
*************************** 1. row ***************************
Grants for tom@localhost: GRANT SELECT, INSERT ON *.* TO 'tom'@'localhost'  

6.移除用户权限
语法:REVOKE 权限 ON 数据库.数据表 FROM '用户'@'IP地址';
被回收的权限必须存在,否则会出错
整个数据库,使用 ON datebase.*;
特定的表:使用 ON datebase.table;
6.1.回收指定的权限

#先查看一下tom的权限
mysql> show grants for tom@'localhost';
+--------------------------------------------------+
| Grants for tom@localhost                         |
+--------------------------------------------------+
| GRANT SELECT, INSERT ON *.* TO 'tom'@'localhost' |
+--------------------------------------------------+
1 row in set (0.00 sec)#回收指定的权限
mysql> revoke select,insert on *.* from tom@'localhost';#回收完后再次查看
mysql> show grants for tom@'localhost';
+-----------------------------------------+
| Grants for tom@localhost                |
+-----------------------------------------+
| GRANT USAGE ON *.* TO 'tom'@'localhost' |
+-----------------------------------------+
1 row in set (0.00 sec)
#USAGE的意思:该用户仅被分配了最小的USAGE权限,只允许访问,但无法操作数据
mysql> flush privileges;

6.2.回收所有权限

#​先查看一下test的权限
mysql> show grants for test@'%';
+-------------------------------------------+
| Grants for test@%                         |
+-------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' |
+-------------------------------------------+
1 row in set (0.00 sec)#回收所有权限
mysql> revoke all privileges on *.* from test@'%'; 
mysql> show grants for test@'%';
+----------------------------------+
| Grants for test@%                |
+----------------------------------+
| GRANT USAGE ON *.* TO 'test'@'%' |
+----------------------------------+
1 row in set (0.00 sec)
mysql> flush privileges;

7.修改密码

7.1.root用户修改自己密码

方法一:#123为旧密码
mysql> mysqladmin  -uroot -p'Jianglt@123' password 'Jianglt@123!'
方法二:
mysql> SET PASSWORD='new_password';
报错:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
​
#你需要执行两个参数来把mysql默认的密码强度的取消了才行
mysql> set global validate_password_policy=0; 
mysql> set global validate_password_mixed_case_count=2;
#这时你再执行
SET PASSWORD = PASSWORD('12345678');

7.2.root修改其他用户密码

mysql> use mysql
#mysql> SET PASSWORD FOR test@'localhost'='new_password'
#用户     =  新密码                                
mysql> set password for test@'localhost'='12345678';
Query OK, 0 rows affected (0.00 sec) 

8、删除用户

8.1.方法一:DROP USER语句删除

mysql> drop user test;
Query OK, 0 rows affected (0.00 sec)

8.2.方法二:DELETE语句删除

mysql> DELETE FROM mysql.user  WHERE user='tom' AND host='localhost';#更新授权表:
mysql> FLUSH PRIVILEGES;

9、查看密码复杂度

MySQL 默认启用了密码复杂度设置,插件名字叫做 validate_password,初始化之后默认是安装的
如果没有安装执行下面的命令会返回空或者没有值,这时需要安装该插件

#启用validate_password插件
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
#如果存在,会报错
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
ERROR 1125 (HY000): Function 'validate_password' already exists

9.1.查看密码复杂度

mysql> show variables like 'validate%';  #validate:验证
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | OFF    |
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+

参数解释
validate_password_length :密码最少长度,默认值是8最少是0
validate_password_dictionary_file:用于配置密码的字典文件,字典文件中存在的密码不得使用。
validate_password_policy: 代表的密码策略,默认是MEDIUM(中等强度)
LOW: 不进行任何密码强度检查,任何密码都可以被接受。
MEDIUM: 密码长度至少8个字符,并且不能与用户名相同。
STRONG: 除了满足 MEDIUM 之外,密码还必须包含至少一个大写字母,一个小写字母,一个数字和一个特殊字符。

validate_password_number_count :最少数字字符数,默认1最小是0
validate_password_mixed_case_count :最少的大写字符和小写字符数(同时有大写和小写),默认为1最少是0
validate_password_special_char_count :最少特殊字符数,默认1最小是0

​9.2.查看密码策略

mysql> select @@validate_password_policy;
+----------------------------+
| @@validate_password_policy |
+----------------------------+
| MEDIUM                     |
+----------------------------+
1 row in set (0.00 sec)

策略
0 or LOW 设置密码长度(由参数validate_password_length指定)
1 or MEDIUM 满足LOW策略,同时还需满足至少有1个数字,小写字母,大写字母和特殊字符
2 or STRONG 满足MEDIUM策略,同时密码不能存在字典文件(dictionary file)中

9.3.查看密码的长度

mysql> select @@validate_password_length; 
+----------------------------+
| @@validate_password_length |
+----------------------------+
|                          8 |
+----------------------------+
1 row in set (0.00 sec)

​9.4.设置密码复杂度

mysql> set global validate_password_length=1;   #设置密码长度为1个
mysql> set global validate_password_number_count=2;  #设置密码数字最少为2个

9.5.设置密码复杂性策略

mysql> set global validate_password_policy=LOW;     #设置密码策略,数字也可以
mysql> flush privileges; #刷新授权
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TA548464

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值