MYSQL复习——第三章:文件(日志文件+其他)

3.1 日志文件

  • 错误日志(error log)
  • 查询日志 (log)
  • 慢查询日志 (slow query log)
  • 事务日志 (redo log + undo log)
    • redo log
      • 三种redo_buffer到os_buffer到磁盘的写入规则
      • 基本单位:redo log block
      • log group和redo log file
    • undo log
  • 二进制日志 (binlog)
  • 中继日志

3.2 参数配置文件(my.conf)

3.3 套接字文件

3.4 pid文件:主机名.pid;里面记录了进程ID

3.5 表结构frm文件:frm文件定义表结构

3.6 innodb和myisam文件

3.1 日志文件

(1)错误日志(error log)

记录了错误信息,当数据库无法启动时,应该第一时间查看这个文件。

日志名:  主机名.err

(2)二进制日志(bin log)

记录了对MYSQL数据库执行更改的所有操作,不包括SELECT和SHOW,默认不开启。主要用于:恢复;主从复制;判断是否有注入攻击。

默认情况下并不是每次写都同步到磁盘(可以理解为缓冲写)。需要用mysqlbinlog工具查看二进制文件

三种格式

STATEMENT:记录的是日志的逻辑SQL语句
ROW:记录每行修改情况。性能好,但是占用空间大
MIXED:默认STATEMENT,但是一些情况下会使用ROW(比如UUID()等函数)

与事务日志(redo log)的区别:

1. bin log是一种逻辑日志,基于行的记录方式;事务日志记录的是物理格式,是对每个页的修改

2. bin log是在数据库上层产生的,针对所有存储引擎。而事务日志只针对innodb

3. 记录时间点不一样:bin log只在事务提交完成后一次性写入(对于非事务表的操作,则是每次执行语句成功后就直接写  入),写入前先cache,提交时写入

 而事务日志在事务进行时不断被写入。这表现为重做日志并不是随事务提交的顺序写入的

(3)慢查询日志(slow query log)

默认不启动,需要手动开启。三个参数: long_query_time默认10秒;log_slow_queries默认关闭;log_queries_not_use_indexes控制如果没走索引,是否加入慢查询日志。

(4)查询日志(log)

记录了所有对MySQL数据库请求的信息(比如SELECT和SHOW),默认文件名:主机名.log。高并发下不建议开启,因为查询信息很多,IO非常大影响性能

(5)事务日志

ref: https://www.cnblogs.com/f-ck-need-u/p/9010872.html

redo log undo log
用于事务恢复 用于事务回滚和MVCC
记录的是页的修改 逻辑日志——按行记录,记录完整修改语句
记录在redo log file中 记录在表空间中的 undo segment中

为了保证事务的ACID特性,InnoDB引擎引入事务日志: 重做日志redo和回滚日志undo

redo保证原子性和持久性,通常是物理日志,记录是页的物理修改操作

undo保证一致性(回滚和MVCC),是逻辑日志,根据每行进行记录

redo包括:重做日志缓冲和重做日志文件

5.1 redo log

(1)写入redo log buffer的规则

每次都记录到redo log buffer

(2)redo log buffer写入到文件的规则

三种写入格式将buffer刷到文件中,由参数innodb_flush_log_at_trx_commit决定。见ref

log buffer根据一定规则将内存中(redo log buffer)的log block刷新到磁盘

参数 规则  
0 每秒log_buffer同步到os_buffer(主线程负责) 1秒的丢失
1 每次提交都会写入os_buffer并同步到文件 零丢失,但是每次提交事务都写入磁盘,IO差不推荐
2 每次提交都写入os_buffer,每秒os_buffer同步到文件 建议使用,比0好

MYSQL复习——第三章:文件(日志文件+其他)

(3)事务日志块

记录方式:重做日志缓存和文件都是以块redo log block保存的,每块512字节:

(日志块头12字节+ 内容492字节 + 日志块尾8字节 = 512字节)

MYSQL复习——第三章:文件(日志文件+其他)

(4)log group和redo log file

默认一个group,组内两个file循环写入。

写入方式为append,将block追加到redo log file的最后部分,当一个redo log file被写满时,会接着写入下一个redo log file,方式为round-robin。即先在第一个log file(即ib_logfile0)的尾部追加写,直到满了之后向第二个log file(即ib_logfile1)写。当第二个log file满了会清空一部分第一个log file继续写入。

在每个组的第一个redo log file中,前2KB记录4个特定的部分,从2KB之后才开始记录log block。除了第一个redo log file中会记录,log group中的其他log file不会记录这2KB,但是却会腾出这2KB的空间。如下图

MYSQL复习——第三章:文件(日志文件+其他)

(4)重做日志格式(492KB中怎么记录日志的):参考ref

(5)整个流程,详见ref

MYSQL复习——第三章:文件(日志文件+其他)

(6)恢复

每次Innodb启动,都需进行恢复操作。通过checkpoint和LSN实现

5.2 undo log

undo log有两个作用:提供回滚和MVCC(让用户实现非锁定一致性读取)

内部机制:

当事务提交的时候,innodb不会立即删除undo log,因为后续还可能会用到undo log,如隔离级别为repeatable read时,事务读取的都是开启事务时的最新提交行版本,只要该事务不结束,该行版本就不能删除,即undo log不能删除。

  • delete操作实际上不会直接删除,而是将delete对象打上delete flag,标记为删除,最终的删除操作是purge线程完成的。
  • update分为两种情况:update的列是否是主键列。
    • 如果不是主键列,在undo log中直接反向记录是如何update的。即update是直接进行的。
    • 如果是主键列,update分两部执行:先删除该行,再插入一行目标行。

3.2 参数配置文件(my.conf)

mysql --help | grep my.cnf 查看

查找参数命令:SHOW VARIABLES LIKE 'xxxx%' \G;

静态参数(不可改)和动态参数(global和session)

3.6 innodb和myisam文件

innodb表空间:可以理解为存放所有innodb的idb文件和frm的地方

文件格式 MYISAM:数据和索引是分别存储的,数据.MYD,索引.MYI Innodb:数据即索引,.ibd