数据库日志基础
世上无难事,只要有日志。
本文以Mysql为例,研究支持的日志。
数据库日志类型
记录方式分类:
- 逻辑日志:可以简单理解为记录的就是sql语句 。
- 物理日志:mysql 数据最终是保存在数据页中的,物理日志记录的就是数据页变更 。
日志类型分类:
- 二进制日志(binlog)
- 错误日志
- 通用查询日志
- 慢查询日志
- 中继日志(relay-log)
- 数据定义语句日志
其中,后两种是Mysql 8 新增的日志。除二进制日志外,其他日志都是文本文件。
|
|
此外,还有文章(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文件的大小,当文件大小达到给定值之后,会生成新的文件来保存日志。
使用场景:
|
|
二进制日志格式:
- 基于语句的格式(STATEMENNT):仅记录使用的sql
- 基于行的格式(ROW):记录每个改变的行
- 混合模式(MIXED):一般的用STATEMENNT,STATEMENNT无法复制的操作用ROW
删除binlog方式:可根据文件名、时间或设置自动过期天数来删除,详情用到时再搜索即可。
通用查询日志
通用查询日志(General Query Log)用来记录用户的所有操作,包括启动和关闭 MySQL 服务、更新语句和查询语句等。当我们的数据发生异常时,查看通用查询日志,还原操作时的具体场景,可以帮助我们准确定位问题。
该功能默认不开启,查看是否开启:
|
|
慢查询日志
-
记录条件:所有执行时间超过
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