日志的类型
MySQL有不同类型的日志文件,用来存储不同类型的日志,分为二进制日志
、错误日志
、通用查询日志
和慢查询日志
,这也是常用的4种。使用这些日志文件,可以查看MySQL内部发生的事情。
- 慢查询日志(slow query log):记录所有执行时间超过long_query_time的sql语句,方便我们对查询进行优化。
- 通用查询日志(general_log):记录所有连接的起始时间和终止时间,以及连接发送给数据库服务器的所有指令,对我们复原操作的实际场景、发现问题,甚至是对数[据库操作的审计都有很大的帮助。
- 错误日志(error log):记录MySQL服务的启动、运行或停止MySQL服务时出现的问题,方便我们了解服务器的状态,从而对服务器进行维护。
- 二进制日志(bin log):记录所有更改数据的语句,可以用于主从服务器之间的数据同步,以及服务器遇到故障时数据的无损失恢复。
存放路径:日志存放在数据目录下/data/mysql 目录下
日志的弊端
- 日志功能会降低MySQL数据库的性能。
- 日志会占用大量的磁盘空间。
慢查询日志(slow query log)
文件名:主机名-slow.log
作用:记录消耗时间比较长的SQL语句,为提升数据库性能提供了线索
在数据库里启用慢日志,找到运行时间较长的SQL语句,并对该语句进行优化,从而提升数据库性能。
show variables like "%long_query%";
查看执行指令()时间较慢的设定标准时间,若超过该设定的时间,,则判定为慢SQL语句,会写入慢日志。(默认为10【毫秒】)
show variable like "slow";
查看慢日志是否开启,默认关闭
开启慢日志
临时修改:set global slow_query_log = 1
永久修改:vim /etc/my.cnf
#slow log
slow_query_log = 1 # 设置开启
long_query_time = 0.01 # 设置标准时间0.01秒
log_slow_admin_statements = 1 # 记录管理语句,默认情况管理语句超时是不记录的。
测试慢日志
select sleep(0.01);
select sleep(0.0001);
通用查询日志(general_log)
show variables like "%general%";
查看通用日志是否开启,默认关闭,文件放在/data/mysql/主机名.log
作用:记录所有的SQL操作。
缺点:消耗大量的磁盘空间、cpu、内存、磁盘资源
开启通用日志
临时修改:set global general_log = 1
永久修改:vim /etc/my.cnf
general_log
# general_log_file=指定路径目录
错误日志(error log)
主机名.err ( 如:localhos t.err,wanglianfang.err)
错误日志是默认开启
记录内容:登录失败、配置文件出错、启动过程出现问题都会记录到错误日志
查看错误日志的路径 show variables like "log_error";
二进制日志(bin log)
路径:/data/mysql/主机名-bin.index文件
保存了有多少个二进制日志的文件名 (二进制文件索引)
作用:可以用来恢复数据和主从复制。记录了DML、DDL、DCL等修改了数据的操作
show variables like "%log_bin%";
查看二进制日志是否开启,默认没有开启
show binary logs;
查看所有的二进制文件及其大小
show master status;
查看当前正在使用哪个二进制日志
show variables like "%max_binlog_size%";
查看二进制日志文件最大值,默认1G
show variables like "%binlog_format%";
查看是二进制日志内容是什么格式
statment level 记录用户输入的每句SQL,MariaDB默认
row level 记录操作的每一行数据(表里面的哪些行的数据发生了变化) ==>mysql (这种格式更好)
mixed level 混合的
开启二进制日志
永久修改 vim /etc/my.cnf
log_bin
# server_id = 1 # id 用于主从复制时,区分主服务和从服务
service mysqld restart
刷新服务
产生新二进制日志的情况
- service mysqld restart; 刷新服务
- flush logs; 不会中断mysqld进程
- 当日志达到最大值1G时。
以上三种情况都可能产生新的二进制文件,因此开启二进制日志后,我们很容易在/data/mysql下看到很多个二进制文件(及时清理不需要的二进制内存,否则占大量内存)
删除二进制日志
reset master;
删除所有的二进制日志
purge binary logs before '2022-07-28 21:30:00';
指定时间之前的日志清理
purge binary logs to 'wanglianfang-bin.000002';
指定日志文件之前的日志清理
清理超过3天的日志(一次性) set global expire_logs_days = 3
、
配置自动清理
vim /etc/my.cnf
expire_logs_days = 3 # 日志超过3天自动清理
查看二进制日志
mysqlbinlog
命令 , 在Linux里(不是mysql内)
mysqlbinlog wanglianfang-bin.00000