2MUCH

数据库日志基础

2022-11-21


数据库日志基础

世上无难事,只要有日志。

本文以Mysql为例,研究支持的日志。

数据库日志类型

记录方式分类:

日志类型分类:

其中,后两种是Mysql 8 新增的日志。除二进制日志外,其他日志都是文本文件。

慢查询日志:记录所有执行时间超过long_query_time的所有查询,方便我们对查询进行优化。
通用查询日志:记录所有连接的起始时间和终止时间,以及连接发送给数据库服务器的所有指令,对我们复原操作的实际场景、发现问题,甚至是对数据库操作的审计都有很大的帮助。
错误日志:记录MysQL服务的启动、运行或停止MysQL服务时出现的问题,方便我们了解服务器的状态,从对服务器进行维护。
二进制日志:记录所有更改数据的语句,可以用于主从服务器之间的数据同步,以及服务器遇到故障时数据的无损失恢复。
中继日志:用于主从服务器架构中,从服务器用来存放主服务器二进制日志内容的一个中间文件。从服务器通过读取中继日志的内容,来同步主服务器上的操作。
数据定义语句日志:记录数据定义语句执行的元数据操作。
来自:https://blog.csdn.net/xiaowanziddd/article/details/125963915

此外,还有文章(https://www.cnblogs.com/shengruxiahuaya/p/16602850.html)提到事务日志(重做日志redo log和回滚日志undo log):

​ binlog日志和回滚日志undo log日志都属于逻辑日志,记录的是sql语句。而redo log 重做日志属于物理日志,记录的是数据页的变更。

默认日志文件名

如果不进行额外指定的话,mysql日志会有默认的存放路径和文件名。

默认存放路径:DATADIR(数据目录)

默认文件名:

二进制日志(binlog)

记录所有的DDL语句和DML语句,但不包括查询语句。binlog 用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。binlog 是通过追加的方式进行写入的,可以通过max_binlog_size 参数设置每个 binlog文件的大小,当文件大小达到给定值之后,会生成新的文件来保存日志。

使用场景:

- 主从复制:在 Master 端开启 binlog ,然后将 binlog发送到各个 Slave 端, Slave 端重放 binlog 从而达到主从数据一致。
- 数据恢复:通过使用 mysqlbinlog 工具来恢复数据。

二进制日志格式:

删除binlog方式:可根据文件名、时间或设置自动过期天数来删除,详情用到时再搜索即可。

通用查询日志

通用查询日志(General Query Log)用来记录用户的所有操作,包括启动和关闭 MySQL 服务、更新语句和查询语句等。当我们的数据发生异常时,查看通用查询日志,还原操作时的具体场景,可以帮助我们准确定位问题。

该功能默认不开启,查看是否开启:

mysql> show global variables like "%general_log%";
+------------------+-------------------------------+
| Variable_name    | Value                         |
+------------------+-------------------------------+
| general_log      | OFF                           | # 处于关闭状态OFF
| general_log_file | /data/mysql_data/zbx-db01.log | # 日志文件路径是/data/mysql_data/zbx-db01.log
+------------------+-------------------------------+
2 rows in set (0.00 sec)

慢查询日志

事务日志

undo log

与“原子性”相关:

原子性底层就是通过 undo log 实现的。undo log主要记录了数据的逻辑变化,比如一条 INSERT 语句,对应一条DELETE 的 undo log ,对于每个 UPDATE 语句,对应一条相反的 UPDATE 的 undo log ,这样在发生错误时,就能回滚到事务之前的数据状态。

redo log

与“持久性”相关:

那么mysql是如何保证一致性的呢?最简单的做法是在每次事务提交的时候,将该事务涉及修改的数据页全部刷新到磁盘中。但是这么做会有严重的性能问题。因此mysql设计了redo log,具体来说就是只记录事务对数据页做了哪些修改,这样就能完美地解决性能问题了(相对而言文件更小并且是顺序IO)。

中继日志

原理:

1、 从数据库io线程读取主数据库的二进制日志(binlog),读取后写入从数据库的中继日志中保存

2、从数据库sql线程读取从数据库的中继日志,重新执行一遍sql

参考链接

https://blog.csdn.net/xiaowanziddd/article/details/125963915

https://www.cnblogs.com/shengruxiahuaya/p/16602850.html

http://c.biancheng.net/view/7780.html

https://blog.csdn.net/m0_46284149/article/details/126655898

https://cdn.modb.pro/db/519648