MySQL的日志文件
MySQL日志文件有很多,包括 :
-
错误日志(error log):错误日志文件对
MySQL的启动、运行、关闭过程进行了记录,能帮助定位MySQL问题。 -
慢查询日志(slow query log):慢查询日志是用来记录执行时间超过 long_query_time 这个变量定义的时长的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。
-
一般查询日志(general log):一般查询日志记录了所有对
MySQL数据库请求的信息,无论请求是否正确执行。 -
二进制日志(bin log):关于二进制日志,它记录了数据库所有执行的
DDL 和 DML语句(除了数据查询语句 select、show 等),以事件形式记录并保存在二进制文件中。binlog即binary log,二进制日志文件,也叫作变更日志(update log)。它记录了数据库所有执行的DDL和DML等数据库更新事件的语句,但是不包含没有修改任何数据的语句(如数据查询语句select、show等)。它以
事件形式记录并保存在二进制文件中。通过这些信息,我们可以再现数据更新操作的全过程。
还有两个 InnoDB 存储引擎特有的日志文件:
- 重做日志(redo log):重做日志至关重要,因为它们记录了对于 InnoDB 存储引擎的事务日志。
- 回滚日志(undo log): undo log是保存的是数据的历史版本,通过历史版本让数据在任何时候都可以回滚到某一个事务开始之前的状态。undo log除了进行事务回滚的日志外还有一个作用,就是为数据库提供MVCC多版本数据读的功能 ,回滚日志同样也是 InnoDB 引擎提供的日志,顾名思义,回滚日志的作用就是对数据进行回滚。当事务对数据库进行修改,InnoDB 引擎不仅会记录 redo log,还会生成对应的 undo log 日志;如果事务执行失败或调用了 rollback,导致事务需要回滚,就可以利用 undo log 中的信息将数据回滚到修改之前的样子。
数据定义语言(DDL)、数据查询语言(DQL)、数据操纵语言(DML)、数据控制语言(DCL)
DDL : 主要就是对表的数据的结构进行修改创建等,比如create ,alter 还有索引的创建修改等。
DML: 主要是对表中的数据进行修改和删除操作,比如 insert, update, delete等。
从上面我们可以知道 bin log日志和 redo log日志都是修改日志。
binlog和 redo log 有什么区别?
- redo log 是
InnoDB引擎特有的,binlog是MySQL的 Server 层实现的,所有引擎都可以使用。 - 这两者使用方式不一样
binlog会记录表所有更改操作,包括更新删除数据,更改表结构等等,主要用于人工恢复数据,而 redo log 对于我们是不可见的,它是InnoDB用于保证 crash-safe 能力的,也就是在事务提交后MySQL崩溃的话,可以保证事务的持久性,即事务提交后其更改是永久性的。 ==一句话概括:binlog是用作人工恢复数据,redo log 是MySQL自己使用,用于保证在数据库崩溃时的事务持久性。== - bin log 记录 是逻辑日志,我们是将
SQL语句进行存储,而 redo log是物理日志,记录的是数据记录。 - 写入的方式也不相同,redo log 是循环写入和擦除,bin log 是追加写入,不会覆盖已经写的文件
redo log怎么写入磁盘
redo log 的写入不是直接落到磁盘,而是在内存中设置了一片称之为redo log buffer的连续内存空间,也就是redo 日志缓冲区。
redo logo鞋服磁盘的时机
-
log buffer 空间不足时
log buffer 的大小是有限的,如果不停的往这个有限大小的 log buffer 里塞入日志,很快它就会被填满。如果当前写入 log buffer 的 redo 日志量已经占满了** log buffer 总容量的大约一半左右**,就需要把这些日志刷新到磁盘上。
-
事务提交时
在事务提交时,为了保证持久性,会把 log buffer 中的日志全部刷到磁盘
-
后台线程输入时
有一个后台线程,大约每秒都会刷新一次
log buffer中的redo log到磁盘 -
checkpoint规则
它的写入方式是从头到尾开始写,写到末尾又回到开头循环写。 通过两个指针:检查指针和写入指针。当写指针追上检查指针的时候,就需要将buffer日志输入到磁盘上。