数据库日志基础
2022-11-21
数据库日志基础
世上无难事,只要有日志。
本文以Mysql为例,研究支持的日志。
数据库日志类型
记录方式分类:
- 逻辑日志:可以简单理解为记录的就是sql语句 。
- 物理日志:mysql 数据最终是保存在数据页中的,物理日志记录的就是数据页变更 。
日志类型分类:
- 二进制日志(binlog)
- 错误日志
- 通用查询日志
- 慢查询日志
- 中继日志(relay-log)
- 数据定义语句日志
其中,后两种是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(数据目录)
默认文件名:
- 二进制日志:hostname-bin.000001(编号依次增加)
- 错误日志:hostname.err
- 通用查询日志:hostname-general.log
- 慢查询日志:hostname.slow.log
- 中继日志:hostname-relay-bin.000001(编号依次增加)
- 数据定义语句日志
二进制日志(binlog)
记录所有的DDL语句和DML语句,但不包括查询语句。binlog 用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。binlog 是通过追加的方式进行写入的,可以通过max_binlog_size 参数设置每个 binlog文件的大小,当文件大小达到给定值之后,会生成新的文件来保存日志。
使用场景:
- 主从复制:在 Master 端开启 binlog ,然后将 binlog发送到各个 Slave 端, Slave 端重放 binlog 从而达到主从数据一致。
- 数据恢复:通过使用 mysqlbinlog 工具来恢复数据。
二进制日志格式:
- 基于语句的格式(STATEMENNT):仅记录使用的sql
- 基于行的格式(ROW):记录每个改变的行
- 混合模式(MIXED):一般的用STATEMENNT,STATEMENNT无法复制的操作用ROW
删除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)
慢查询日志
-
记录条件:所有执行时间超过
long_query_time
(单位为秒,精度可以到微妙)且记录数不小于min_examined_row_limit
的所有SQL语句。 -
默认不开启,可通过
slow_query_log
参数打开慢查询日志 -
管理语句(如alter、create等)和不使用索引查询的语句不会记录到慢查询日志。也可以通过设置
log-slow-admin-statement
参数和log_queries_not_using_indexes
参数增加两者的监控。
事务日志
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