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好 |
(3)事务日志块
记录方式:重做日志缓存和文件都是以块redo log block保存的,每块512字节:
(日志块头12字节+ 内容492字节 + 日志块尾8字节 = 512字节)
(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的空间。如下图
(4)重做日志格式(492KB中怎么记录日志的):参考ref
(5)整个流程,详见ref
(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
|