MySQL 的七种日志总结
文章转载自:https://mp.weixin.qq.com/s/ewv7HskHvH3O7kFyOmoqgw
一、MySQL 日志分类
日志类别 | 说明 | 备注 |
---|---|---|
错误日志 | 错误日志记录了当MySQL启动、停止或者服务器运行过程中发生任何严重错误时的相关信息,当数据库出现任何故障导致无法正常使用时,可以首先查看此日志; | 默认开启 |
二进制日志(binlog日志) | 记录了所有的DDL和DML语句,但不包括数据查询语句,此日志对于灾难恢复时非常重要,并且MySQL的主从复制、增量恢复,也是通过该binlog 实现的。 | 默认未开启,需要手动开启 |
查询日志 | 它记录了客户端的所有操作语句,包括增删改查所有语句; | 默认未开启,需要手动开启,注意,高并发场景企业里普通查询日志一般是关闭的(默认也是关闭的),主要是因为IO性能问题; |
慢查询日志 | 它是用来记录查询效率较低的SQL语句的日志,慢查询日志记录所有执行时间超过参数long_query_time设置值,默认值为10s, | 默认未开启,需要手动开启 |
审计日志 | 根据国家等保审计合规要求,数据库要开启审计功能,它主要记录用户登录,对数据库的操作管理,对数据库受到的风险行为进行告警,对攻击行为及时阻断,通过审计日志可以对用户访问数据库行为进行记录、分析和汇报,用来帮助用户事后生成合规报告、事故追根溯源,同时加强内外部数据库网络行为记录,提高数据资产安全。 | MySQL企业版有此功能,属于收费组件,此测试社会版使用第三方开源插件。 |
redo log | 重做日志,提供前滚操作,通常是物理日志,记录的是数据页的物理修改,而不是某一行或者某几行修改成怎样,它用来恢复提交后的物理数据页,数据数据页,并且只能恢复到最后一次提交的位置; | undo log不是redo log的逆向过程,他们都是用来恢复的日志; |
undo log | 回滚日志,提供回滚操作,用来回滚到某个版本,undo log一般是逻辑日志,根据每行记录进行回滚; |
二、错误日志
记录mysqld启动和停止时,以及服务器在运行过程中发生的任何严重错误时的相关信息。
1. 查看错误日志
mysql> show variables like 'log_error%';
2. 配置文件说明
log-error=/data/mysql/3306/data/k8svip.err
log_error_verbosity=3
log-error:开启错误日志,并记录到日志文件中;
log_error_verbosity:从MySQL 5.7.2开始,首选 log_error_verbosity 系统变量,而不是使用 log_warnings 系统变量,这个参数从MySQL 8.0.3开始被移除了,它分别对应:1 错误信息;2 错误信息和告警信息;3:错误信息、告警信息和通知信息;
log_warnings:5.7.2 之前的版本可以使用,0: 表示不记录告警信息;1: 表示告警信息写入错误日志,大于1, 表示各类告警信息,例如有关网络故障的信息和重新连接信息写入错误日志,注意不同的版本中,默认值不一样。
三、二进制日志
二进制日志只记录了所有DDL与DML语句,不包括查询语句。
1. 查看二进制日志配置
mysql> show variables like 'log_bin%';
mysql> show variables like 'binlog%';
2. 配置文件说明
log_bin=ON 表示开启binlog日志;
log_bin_basename:binlog文件前缀
log_bin_index:log_bin日志索引文件;
log_bin_trust_function_creators:因为二进制日志的一个重要功能是用于主从复制,而存储函数有可能导致主从的数据不一致,所以当开启二进制日志后,参数log_bin_trust_function_creators就会生效,限制存储函数的创建、修改、调用;
log_bin_use_v1_row_events:binlog版本信息,从mysql 5.6 开始,默认为 version2,默认值为OFF,ON的话,为使用binlog 版本v1;
binlog_cache_size:默认是32K,建议设置大一些比如1M或者4M,在一个事务中 binlog 为了记录 sql 状态所持有的 cache 大小,如果你经常使用大的事务,可以增加此值来获取更大的性能,所有从事务中来的状态都会被缓冲在 binlog 缓冲中,然后待提交后一次性写入到 binlog 中,如果事务比此值大,会使用磁盘上的临时文件来替代,此缓冲在每个链接的事务第一次更新状态时被创建;
max_binlog_cache_size:最大的二进制 Cache 日志缓冲尺寸;
max_binlog_size:二进制日志文件的最大长度(默认设置1GB),一个二进制文件信息超过1G前,MySQL服务器会自动提供一个新的二进制日志文件接续上;
expire_logs_days:超过7天的binlog,mysql程序自动删除(如果数据重要,建议不要开启该选项);
sync_binlog:即每提交一次事务同步写到磁盘中;
innodb_flush_log_at_trx_commit:即每提交一次事务都写到磁盘中;
3. 日志文件格式
binlog日志格式 | 格式说明 | 备注 |
---|---|---|
STATEMENT | 日志文件中记录的是SQL语句,每一条对数据进行修改的SQL都会记录在日志文件中,通过MySQL提供的mysqlbinlog工具,可以清晰的查看每条语句的文本,主从复制时,从库会将日志解析为原文本,然后在从库重新执行一次;不记录每行数据变行,日志量少,节约IO,提高性能;由于它是记录的执行语句,所以为了让这些语句在slave端也能正确执行,那么它还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端执行的时候得到和master端执行时候相同的结果; | 手动配置 |
ROW | 它在日志中记录的是每一行的数据变更,而不是记录SQL语句。例如:update test4 set name="aa"; 如果是STATEMENT,在日志中会记录一行SQL语句,如果是ROW,由于是对全表更新,也就是每一行记录都会发生变更,ROW格式的日志中会记录每一行数据的变更,这样可以会产生大量的日志内容,影响IO,但不记录上下文信息。 | 手动配置 |
MIXED | 兼容上面两种格式,默认情况下采用STATEMENT,但是在一些特殊情况下采用ROW来进行记录。MIXED格式量利用两种模式的优点,避开他们的缺点。 | 默认开启 |
4. 日志文件读取
可以使用mysqlbinlog 工作进行日志查看,但如果是ROW格式的日志,可以使用-v或-vv参数进行读取。
5. 日志删除
四、查询日志
客户端的所有查询语句,而二进制日志中不包括查询数据的语句,如果对访问频繁的数据库来讲,此日志对系统性能影响较大,建议一般情况下关闭。
1. 查询日志配置
mysql> show variables like 'log_output%';
mysql> show variables like 'general_log%';
2. 配置文件说明
log_output = FILE|TABLE|None,这个参数同时控制查询日志和慢查询日志记录位置形式,是记录在表中,还是在文件中,为了性能,建议保存在文件中;注意可以同时设置FILE和TABLE,用(,)逗号分隔即可,如果有None的时候,由于其优先级最高,所以就不会记录查询日志或慢查询日志。
general_log = OFF|ON,用于控制是否开启查询日志,开启即为ON,不开启为OFF,对于读多写少,大量查询的请求,为了性能建议关闭。
general_log_file,记录查询日志的路径及文件名;
3. 日志文件读取
由于查询日志记录的是纯文件形式,所以可直接使用cat| more|less|head|tail
进行读取。
五、慢查询日志
慢查询日志中记录了所有执行时间超过设置值(long_query_time)的日志。注意获得表锁定的时间不算作执行时间,并且默认情况下不记录管理语句和不使用索引进行查询的语句,如果想监控这两种情况的慢查询日志,可以使用log_slow_admin_statements,log_queries_not_using_indexes 进行设置。
慢查询日志对发现应用中有性能问题的SQL语句,很有帮助,虽然也有一定的开销,建议在生产环境中,打开此日志。
1. 慢查询日志配置
mysql> show variables like '%slow%';
mysql> show variables like 'long_query_time';
mysql> show variables like '%log_output%';
2. 慢查询日志说明
log_output 这个参数对查询日志和慢查询日志同时生效,上面已经解释了;
log_query_time 这个参数是控制查询时间,超过这个设置值就会记录在文件或表中,这个可以设置微秒级别;
slow_query_log 开启慢查询日志的开关;
slow_query_log_file 慢查询日志的文件名,日志默认写入datadir目录下面;
log_slow_admin_statements 由于默认不记录管理语句,如果有需要,可以打开此开关;
log_queries_not_using_indexes 没有索引的慢查询默认不会记录在日志中,打开此开关,可以记录没有索引的慢查询语句。
3. 日志文件读取
可以使用more|cat|less|head|tail
来查看日志文件,文件格式如下:
这里记录了时间、用户和主机、Id、SQL执行时间、examined_row_count,用于统计每次执行过程中实际扫描的记录数、SQL语句等。
如果慢查询日志记录内容很多时,还可以使用mysqldumpslow mysql-slow.log查看,这个工具对慢查询日志进行分类汇总,如下:
六、审计日志
mysql审计日志是第三方提供的插件,MySQL官方并没有把它并入自己的代码仓库中,需要自己下载 https://github.com/mcafee/mysql-audit/releases ,由于我是5.7 的 mysql,这里下载 audit-plugin-mysql-5.7-1.1.10-980-linux-x86_64.zip ,解压并授权。
# 1. 下载
[root@master01 ~]# wget https://github.com/mcafee/mysql-audit/releases/download/v1.1.10/audit-plugin-mysql-5.7-1.1.10-980-linux-x86_64.zip
# 2. 解压
[root@master01 ~]# unzip audit-plugin-mysql-5.7-1.1.10-980-linux-x86_64.zip
#3. cp 到 mysql 库文件
[root@master01 lib]# chmod 755 libaudit_plugin.so
[root@master01 lib]# cp libaudit_plugin.so /usr/local/mysql/lib/plugin/
[root@master01 lib]# ls -l /usr/local/mysql/lib/plugin/libaudit_plugin.so
-rwxr-xr-x 1 root root 1558434 Jan 21 16:24 /usr/local/mysql/lib/plugin/libaudit_plugin.so
[root@master01 lib]# chown mysql:mysql /usr/local/mysql/lib/plugin/libaudit_plugin.so
[root@master01 lib]#
1. 生成审计offsets
[root@master01 utils]# pwd
/root/audit-plugin-mysql-5.7-1.1.10-980/utils
[root@master01 utils]# ./offset-extract.sh /usr/local/mysql/bin/mysqld
//offsets for: /usr/local/mysql/bin/mysqld (5.7.34)
{"5.7.34","a91c2beda7d58ad2d2ff29def630a130", 7832, 7880, 3640, 4800, 456, 360, 0, 32, 64, 160, 544, 7996, 4368, 3648, 3656, 3660, 6080, 2072, 8, 7064, 7104, 7088, 13480, 148, 672, 0},
[root@master01 utils]#
2. 配置审计日志
(1)修改 my.cnf 配置文件(重启服务)
# 审计操作命令
audit_record_cmds='insert,delete,update,create,drop,alter,grant,truncate'
# 审计开关
audit_json_file=on
# 加载审计第三方库
plugin-load=AUDIT=libaudit_plugin.so
# 审计日志路径
audit_json_log_file=/data/logs/mysql/mysql_audit.json
# 审计offsets 不要乱配置
audit_offsets=7832, 7880, 3640, 4800, 456, 360, 0, 32, 64, 160, 544, 7996, 4368, 3648, 3656, 3660, 6080, 2072, 8, 7064, 7104, 7088, 13480, 148, 672, 0
(2) 动态加载
3. 审计日志
{"msg-type":"activity","date":"1642755571375","thread-id":"11","query-id":"40","user":"root","priv_user":"root","ip":"","host":"localhost","_os":"linux-glibc2.12","_client_name":"libmysql","_pid":"707916","_client_version":"5.7.34","_platform":"x86_64","program_name":"mysql","pid":"707916","os_user":"root","appname":"./mysql","status":"0","cmd":"show_tables","objects":[{"db":"information_schema","name":"/data/mysql/mysql3306/mysql-tmp/#sql_9908a_0","obj_type":"TABLE"}],"query":"show tables"}
{"msg-type":"activity","date":"1642755571387","thread-id":"11","query-id":"41","user":"root","priv_user":"root","ip":"","host":"localhost","_os":"linux-glibc2.12","_client_name":"libmysql","_pid":"707916","_client_version":"5.7.34","_platform":"x86_64","program_name":"mysql","pid":"707916","os_user":"root","appname":"./mysql","status":"0","cmd":"create_table","objects":[{"db":"test","name":"test1","obj_type":"TABLE"}],"query":"create table test1 (id int,name varchar(11), PRIMARY KEY(id))"}
{"msg-type":"activity","date":"1642755571670","thread-id":"11","query-id":"42","user":"root","priv_user":"root","ip":"","host":"localhost","_os":"linux-glibc2.12","_client_name":"libmysql","_pid":"707916","_client_version":"5.7.34","_platform":"x86_64","program_name":"mysql","pid":"707916","os_user":"root","appname":"./mysql","rows":"2","status":"0","cmd":"insert","objects":[{"db":"test","name":"test1","obj_type":"TABLE"}],"query":"insert into test1 values(11,'zhangshan'),(12,'lishi')"}
{"msg-type":"activity","date":"1642755574005","thread-id":"11","query-id":"43","user":"root","priv_user":"root","ip":"","host":"localhost","_os":"linux-glibc2.12","_client_name":"libmysql","_pid":"707916","_client_version":"5.7.34","_platform":"x86_64","program_name":"mysql","pid":"707916","os_user":"root","appname":"./mysql","cmd":"Quit","query":"Quit"}
七、redo log 和 undo log
详见:undo、redo日志, 参考地址:https://www.cnblogs.com/sanduzxcvbnm/p/15841885.html
八、总结:
- 错误日志主要记录系统故障、启动故障;
- binlog日志记录数据变更、用于数据备份、数据复制等操作;
- 查询日志记录所有操作,不建议开启;
- 慢查询日志用于查看性能问题,方便优化SQL语句;
- 审计日志,这个是由第三方提供的插件实现,用于国家等保审计合规等;
- redo log 用于保障已提交事务的ACID特性;
- undo log 用于当事务回滚或者数据库崩溃时,撤销未提交的事务。
MySQL 的七种日志总结的更多相关文章
- mysql中有多少种日志
Mysql的日志包括如下几种日志: 错误日志 普通查询日志 二进制日志 慢查询日志 Mysql版本 此文档测试mysql的版本为 mysql -V 错误日志 error log Mysql错误日志主要 ...
- MySQL的两种日志类型,redo log,binlog
文章内容学习:极客时间-林晓彬老师-MySQL实战45讲 整理而得 我们知道MySQL数据库在发生意外宕机的情况下,可以将数据恢复到历史的某个时间点,能实现这个功能依靠的是日志,MySQL提供两种类型 ...
- 【日志】MySQL中有多少种日志
redo 重做日志 作用:确保事务的持久性,防止在发生故障,脏页未写入磁盘.重启数据库会进行redo log执行重做,到达事务一致性 undo 回滚日志 作用:保证数据的原子性,记录事务发生之前的数据 ...
- MySQL的七种join
转载 原文地址 建表 在这里我们先建立两张有外键关联的两张表: CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`tbl_dept` ...
- MySQL 的七种 join
建表 在这里呢我们先来建立两张有外键关联的张表. CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`tbl_dept`( `id` ...
- MYSQL 的七种join
建表 在这里呢我们先来建立两张有外键关联的张表. CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`tbl_dept`( `id` ...
- 【知识库】-数据库_MySQL 的七种 join
掘金作者:haifeisi 文章出处: MySQL 的七种 join Learn [已经过测试校验] 一.内连接 二.左外连接 三.右外连接 四.左连接 五.右连接 六.全连接 七.两张表中都没有出现 ...
- Mysql表的七种引擎类型,InnoDB和MyISAM引擎对比区别总结
InnoDB和MyISAM区别总结 我用MySQL的时候用的是Navicat for MySQL(Navicat for mysql v9.0.15注册码生成器)操作库.表操作的,默认的表就是Inno ...
- MySQL常用的七种表类型(转)
MySQL常用的七种表类型(转) 其实MySQL提供的表类型截至到今天已经有13种,各有各的好处,但是民间流传的常用的应该是7种,如果再细化出来,基本上就只有两种:InnoDB.MyIASM两种. ...
随机推荐
- C语言-数据结构-结构体
一.结构体的定义 数组(Array)是一组具有相同类型的数据的集合.但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组 ...
- 霍普菲尔得神经网络(Hopfield Neural Network)
设计一个反馈网络存储下列目标平衡点: T = [ 1 -1; -1 1 ]; 并用6组任意随机初始列矢量,包括一组在目标平衡点连线的垂直平分线上的一点作为输入矢量对所设计的网络的平衡点进行测试,观 ...
- Properties集合中的方法store和Properties集合中的方法load
Properties集合中的方法store public class Demo01Properties { public static void main(String[] args) throws ...
- golang拾遗:自定义类型和方法集
golang拾遗主要是用来记录一些遗忘了的.平时从没注意过的golang相关知识. 很久没更新了,我们先以一个谜题开头练练手: package main import ( "encoding ...
- java------JRE和JDK
JDK(Java Development kit):Java开发工具包 包括 JVM(Java Virtual Machine):java虚拟机,真正运行java程序的地方(Java语言在运行时并不是 ...
- firewall 命令简单操作
Firewalld 是维护防火墙策略的守护程序的名称.使用 firewall-cmd 命令与防火墙配置进行交互, 使用区域概念对与系统交互的流量进行分段.网络接口分配给一个或多个区域,每个区域都包含允 ...
- this关键字和构造方法
构造方法: 构造方法的定义:构造方法是类的一个特殊成员,它会在类实例化对象的时候被自动调用 作用:可以在实例化对象的同时对这个对象的属性进行赋值 案例:Student student = new St ...
- 趣味问题《寻人启事》的Python程序解决
偷懒了很久,今天我终于又来更新博客了~ 最近,我看到了一个趣味问题,或者说是数学游戏:<寻人启事>. 在表述这个问题前,我们需要了解一下"冰雹猜想": 对于任意一个正整 ...
- 技术分享 | check(col_name<>'')为何把空格拒之门外
1.问题描述 前两天在群里看到同事反馈一个空格问题,大致现象如下: mysql> select @@version; +-----------+ | @@version | +--------- ...
- Flutter 检测报错 Unable to locate Android SDK.
安装好 Flutter SDK 之后,官方建议使用flutter doctor检查 Flutter SDK 的相关配置信息. 如果 Android Studio 安装 Android SDK 的时候选 ...