mysql的常见日志文件

1、错误日志

对mysql的启动、运行、关闭进行记录,主要作用是帮助mysql在遇到问题时快速定位问题。该文件不仅记录了所有的错误信息,也记录了一些警告信息以及普通信息

错误日志是默认开启的,默认路径为datadir,错误日志的简单配置如下:

# 设置错误日志log-err存储路径及文件名前缀 log-error = /usr/local/mysql/logs/mysql-error

2、二进制日志(binlog)

记录了mysql数据库执行更改的所有操作,但是不包括select和show语句,其中包含所有的DDL和DML语句,主要作用是对旧数据进行恢复。

二进制日志默认是关闭状态的,需要在mysql配置文件中进行开启,并设置二进制日志文件的日志文件形式

二进制文件的配置:

# 设置二进制日志log-bin存储路径及文件名前缀 # 若不指定具体路径,则是存放在datadir路径下 log-bin = /usr/local/mysql/logs/mysql-bin # 设置binlog日志记录格式 binlog-format = STATEMENT

一般二进制日志文件包括二进制日志索引文件和二进制日志文件,其中二进制日志文件记录的是所有二进制日志文件的文件名,是直接可阅读的,而二进制日志文件记录的是二进制日志,不可以直接阅读的

二进制日志记录格式

1、statement

在此记录下,二进制日志文件记录的是对数据库造成修改的逻辑sql语句

2、ROW

二进制日志文件中不再是记录简单的sql语句,而是记录表的更改情况,即记录的是每个修改数据(每一行)的具体内容,包括前后修改的值,是目前mysql的默认二进制文件格式。

3、Mixed格式

这种格式结合了前两个格式的特点,在该格式中,mysql会根据具体sql语句采用哪种格式进行记录。对于那些无法通过Statement格式记录准确变更的情况,MySQL会选择Row格式。

利用二进制日志的数据恢复:

Mysql提供了mysqlbinLog命令行工具不仅可以查看binlog日志文件,还可以基于binlog二进制文件日志对数据库中的数据进行恢复

binlog使用场景

在实际应用中,binlog的主要使用场景有两个,分别是主从复制和数据恢复。

1)主从复制:在Master端开启binlog,然后将binlog发送到各个Slave端,Slave端重放binlog从而达到主从数据一致。

2) 数据恢复:通过使用mysqlbinlog工具来恢复数据。

3、Redo log(重写日志)

在数据库的ACID中,有一个持久性,具体是说只要数据库事务提交成功,那么数据库做的修改就会被永久保存

事务在运行中,都是在内存中的Buffer Pool(缓冲池)修改页面,但是页面被修改后并不会会立刻被刷盘(因为有时我们修改数据只是修改几列,将整个页面刷盘是不恰当的,另一个方面是一个事务会涉及不同的页面,如果将这些页面都刷盘,那么可能会进行大量的随机IO)

不建议立刻刷盘有两点:

1、因为修改数据页可能只是修改一部分数据,那么将整个页都刷盘到磁盘上,是非常耗费性能的

2、事务提交可能会涉及多个数据页,在内存分配上,这些数据页在物理上是不连续的,所以会进行随机IO读取,也是非常耗费性能的

但是如果不采取措施,那么在事务提交后mysql发生故障,导致内存数据丢失,那么就会导致修改的数据丢失!

那么mysql是如何保证磁盘和内存的一致性?

在这里就要引入redo log日志,即重写日志文件,用于记录事务的操作,记录的是数据修改之后的值,不管事务是否提交都会记录修改后的值。

最重要的是,一个redo log是按顺序写入磁盘的,是顺序IO。

那么如果事务在未提交事务前,数据库发生故障,那么此时redo log已经记录好了数据修改后的值,那么就可以进行刷盘

由于redo log是顺序IO,那么在刷盘上又大大减少了IO读取时间,提高了性能

Redo Log的组成部分

由两部分组成:

1、内存中的日志缓冲;mysql每执行一条DML语句,那么就会记录到内存中的日志缓冲,先记录一部分,后续再某个设置的时间点上去和磁盘上的日志文件进行同步刷盘

2、磁盘上的日志文件;

redo log的记录形式

记录哪个表空间哪个数据页从哪个位置开始的多少个字节要修改什么

如何刷盘?

在我们OS上,刷盘都是需要从用户态转换到内核态的;具体的刷盘步骤:

1、用户态已经准备好数据在redo log buffer上;并转为内核态,将数据同步到os的缓冲池中

2、内核态通过开启fsync()将数据刷盘到redo log file

3、undo log

回滚日志主要是实现原子性的重要手段

undo log主要记录的是数据的逻辑变化,比如一条insert,undo log会记录其delete,又比如一个update,会对应一条相反的update语句。这样在发生错误时,就能用该日志进行回滚

作用:

1、事务回滚:当某个事务要进行回滚,就可以利用undo log进行逆向操作,从而使数据恢复到事务前的状态。

2、多版本并发控制(mvcc):在mvcc中,在数据库的数据发生修改时,旧的数据版本会保存到undo log中,那么要进行当前数据和旧数据比较时,就可以在undo log上进行读取,这也方便其他事务读取旧版本数据

undo log怎么实现逆向操作的?

为了支持事务回滚和多版本并发控制,undo log中的每个记录通常会包含指向前一个undo log记录的指针或者链表。这是为了确保 Undo Log 记录可以按照事务执行的顺序进行遍历,以便在回滚事务时按照相反的顺序执行操作。具体结构如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值