阅读redo log file相关文档

This commit is contained in:
2025-01-31 16:42:45 +08:00
parent 92dc60f7a3
commit db8f9eb5c9

View File

@@ -218,3 +218,111 @@ binlog为动态参数可以在数据库运行时进行修改并且可以
```bash ```bash
mysqlbinlog --start-position=203 ${binlog_path} mysqlbinlog --start-position=203 ${binlog_path}
``` ```
## pid文件
mysql实例启动时会将进程id写入到一个文件中该文件被称为pid文件。
pid文件路径通过`pid_file`参数来进行控制fedora中默认路径为`/run/mysqld/mysqld.pid`
## 表结构定义文件
mysql中数据的存储是根据表进行的每个表都有与之对应的文件。无论表采用何种存储引擎都会存在一个以`frm`为后缀的文件,该文件中保存了该表的表结构定义。
> mysql 8中schema对应目录下不再包含frm文件。
## 表空间文件
innodb采用将存储的数据按照表空间tablespace进行存放的设计。在默认配置下将会有一个初始大小为10MB名称为ibdata1的文件该文件为默认的表空间文件。
### innodb_data_file_path
可以通过`innodb_data_file_path`参数对默认表空间文件进行设置,示例如下:
```sql
innodb_data_file_path=datafile_spec1[;datafile_spec2]...
```
用户可以通过多个文件组成一个表空间,示例如下:
```sql
innodb_data_file_path=/db/ibdata1:2000M;/dr2/db/ibdata2:2000M;autoextend
```
在上述配置中,表空间由`/db/ibdata1``/dr2/db/ibdata2`两个文件组成,如果两个文件位于不同的磁盘上,那么磁盘的负载将会被平均,数据库的整体性能将会被提高。
同时,在上述示例中,为两个文件都指定了后续属性,含义如下:
- ibdata1文件大小为2000M
- ibdata2:文件大小为2000M并且当文件大小被用完后文件会自动增长
`innodb_data_file_path`被设置后所有基于innodb存储引擎的表其数据都会记录到该共享表空间中。
### innodb_file_per_table
如果`innodb_file_per_table`被启用后默认启用则每个基于innodb存储引擎的表都可以有一个独立的表空间独立表空间的命名规则为`表名+.ibd`
通过innodb_file_per_table,用户不需要将所有的数据都放置在默认的表空间中。
> `innodb_file_per_table`所产生的独立表空间文件其仅存储该表的数据、索引和插入缓冲BITMAP信息其余信息仍然存放在默认的表空间中。
## redo log文件
redo log是一个基于磁盘的数据结构用于在crash recovery过程中纠正由`未完成事务写入的错误数据`
> 在一般操作中redo log对那些`会造成表数据发生改变的请求`进行encode操作请求通常由sql statement或地级别api发起。
redo log通常代表磁盘上的redo log file。写入重做日志文件的数据通常基于受影响的记录进行编码。在数据被写入到redo log file中时LSN值也会不断增加。
### 循环写入
innodb会按顺序写入redo log文件例如redo log file group中存在两个文件innodb会先写文件1文件1写满后会切换文件2在文件2写满后重新切换到文件1。
### redo log capacity
从mysql 8.0.30开始,`innodb_redo_log_capacity`参数用于控制redo log file占用磁盘空间的大小。该参数可以在实例启动时进行设置也可以通过`set global`来进行设置。
`innodb_redo_log_capacity`默认值为`104857600`,即`100M`
redo log文件默认位于`datadir`路径下的`#innodb_redo`目录下。innodb会尝试维护32个redo log file每个redo log file文件大小都相同`1/32 * innodb_redo_log_capacity`
redo log file将会使用`#ib_redoN`的命名方式,`N`是redo log file number。
innodb redo log file分为如下两种:
- ordinary正在被使用的redo log file
- spare等待被使用的redo log file
> 相比于ordinary redo log filespare redo log file的名称中还包含了`_tmp`后缀
每个oridnary redo log file都关联了一个制定的LSN范围可以通过查询`performance_schema.innodb_redo_log_files`表里获取LSN范围。
示例如下:
```sql
select file_name, start_lsn, end_lsn from performance_schema.innodb_redo_log_files;
```
查询结果示例如下:
| file\_name | start\_lsn | end\_lsn |
| :--- | :--- | :--- |
| ./#innodb\_redo/#ib\_redo6 | 19656704 | 22931456 |
当执行checkpoint时innodb会将checkpoint LSN存储在文件的header中在recovery过程中所有的redo log文件都将被检查并且基于最大的LSN来执行恢复操作。
常用的redo log状态如下
```bash
# resize operation status
Innodb_redo_log_resize_status
# 当前redo log capacity
Innodb_redo_log_capacity_resized
Innodb_redo_log_checkpoint_lsn
Innodb_redo_log_current_lsn
Innodb_redo_log_flushed_to_disk_lsn
Innodb_redo_log_logical_size
Innodb_redo_log_physical_size
Innodb_redo_log_read_only
Innodb_redo_log_uuid
```
> 重做日志大小设置时,如果设置大小过大,那么在执行恢复操作时,可能需要花费很长时间;如果重做日志文件大小设置过小,可能会导致事务的日志需要多次切换重做日志文件。
>
> 此外重做日志太小会频繁发生async checkpoint导致性能抖动。重做日志存在一个capacity代表了最后的checkpoint不能够超过这个阈值如果超过必须将缓冲区中的部分脏页刷新到磁盘中此时可能会造成用户线程的阻塞。
### redo log和binlog的区别
#### 记录内容
binlog记录的是一个事务的具体操作内容该日志为逻辑日志。
而innodb redo log记录的是关于某个页的修改为物理日志。
#### 写入时机
binlog仅当事务提交前才进行提交即只会写磁盘一次。
redo log则是在事务运行过程中不断有重做日志被写入到redo log file中。
### redo log写入时机
- master thread会每秒将redo log从buffer中刷新到redo log ile中不露内事务是否已经提交
- innodb_flush_log_at_trx_commit控制redo log的刷新时机默认情况下在事务提交前会将数据从redo log buffer刷新到redo log file中