ib_logfile是InnoDB的事务日志文件。本文简要说明其写入时机、写入策略及如何保证数据安全。
1、 基本概念
a) ib_logfile文件个数由innodb_log_files_in_group配置决定,若为2,则在datadir目录下有两个文件,命令从0开始,分别为ib_logfile0和ib_logfile.
b) 文件为顺序写入,当达到最后一个文件末尾时,会从第一个文件开始顺序复用。
c) lsn: Log Sequence Number,是一个递增的整数。 Ib_logfile中的每次写入操作都包含至少1个log,每个log都带有一个lsn。在内存page修复过程中,只有大于page_lsn的log才会被使用。
d) lsn的保存在全局变量log_sys中。递增数值等于每个log的实际内容长度。即如果新增的一个log长度是len,则log_sys->lsn += len.
e) ib_logfile每次写入以512(OS_FILE_LOG_BLOCK_SIZE)字节为单位。实际写入函数 log_group_write_buf (log/log0log.c)
f) 每次写盘后是否flush,由参数innodb_flush_log_at_trx_commit控制。
2、 log_sys介绍
log_sys是一个全局内存结构。以下说明几个成员的意义。
lsn
|
表示已经分配的最后一个lsn的值。
|
written_to_all_lsn
|
n表示实际已经写盘的lsn。需要这个值是因为并非每次生成log后就写盘。
|
flushed_to_disk_lsn
|
表示刷到磁盘的lsn。需要这个值是因为并非每次写盘后就flush。
|
buf
|
待写入的内容保存在buf中
|
buf_size
|
buf的大小。由配置中innodb_log_buffer_size决定,实际大小为innodb_log_buffer_size /16k * 16k。
|
buf_next_to_write
|
buf中下一个要写入磁盘的位置
|
buf_free
|
buf中实际内容的最后位置。当buf_free> buf_next_to_write时,说明内存中还有数据未写盘。
|
3、相关更新
用一个简单的更新语句来说明log_sys以及ib_logfile的更新内容的过程。假设我们的更新只涉及到非索引的固定长度字段。
a) 在bufferpool中写入undo log。 对于一个单一的语句,需要先创建一个undolog头。
b) 在bufferpool中写入undo log的实际内容。
c) 在log_sys->buf中写入buffer page的更新内容。此处保存了更新的完整信息。
d) 在log_sys->buf中写入启动事务(trx_prepare)的日志
e) 将c、d更新的log内容写入ib_logfile中。
f) 在log_sys->buf中写入事务结束(trx_commit)的日志
g) 将f步骤的log内容写入ib_logfile中。
4、 说明
a) 完成上述所有操作时,数据文件还没有更新。
b) 每次写入log_sys->buf时同时更新lsn和buf_free。 每次写ib_logfile时同时更新written_to_all_lsn和buf_next_to_write;
c) 每次写ib_logfile时以512字节为对齐,如需写入600字节,则实际写入1k。写到最后一个文件末尾则从第一个文件重复使用。
d) 从上述流程看到,在a~d过程中若出现异常关闭,由于没有写入到磁盘中,因此整个事务放弃;若在e刚完成时出现异常关闭,虽然事务内容已经写盘,但没有提交。在重启恢复的时候,发现这个事务还没有提交,逻辑上整个事务放弃。 (重启日志中会有Found 1 prepared transaction(s) in InnoDB字样)。在g完成后出现异常关闭,则能够在重启恢复中正常提交。
在e和f之间会写mysql的bin-log,若bin-log写完前异常关闭,事务无效,bin-log写入成功后,则异常重启后能够根据bin-log恢复事务的修改。
e) 若涉及到索引更新,在步骤c之后会增加索引更新的log。由于索引可能有merge过程,因此在merge过程中会另外增加写入一个log。但事务完全提交仍在步骤g中。索引的更新由于已经写盘,并不会因此丢失。
分享到:
相关推荐
首先,`innodb_flush_log_at_trx_commit` 参数是 InnoDB 存储引擎特有的,它控制着事务日志(redo log 和 undo log)何时以及如何被刷新到磁盘上的 ib_logfile 文件。此参数有三个可选值: 1. 当设置为 0 时,...
5. **日志分析**:分析InnoDB的日志文件(ib_logfile*),可能有更多关于异常关闭的记录。 6. **重新创建表空间**:在极端情况下,如果上述方法都无效,可能需要删除并重新创建InnoDB表空间,但这会丢失所有InnoDB...
首先,MySQL的文件系统包含多种类型的文件,如数据文件(*.frm, *.ibd)、数据字典(ibdata1, ibdata2)、事务日志(ib_logfile0, ib_logfile1)、回滚日志、归档日志(binlog)和中继日志(relaylog),以及各种...
在MySQL中,表结构和数据存储在不同的文件中,如`.frm`文件存储表结构,`ibdata1`文件存储InnoDB的数据,而`ib_logfile0`和`ib_logfile1`则包含事务日志信息。 当从其他源复制数据库目录时,特别是包含InnoDB表的...
在确认所有必要的flush和后台线程工作完成后,可以考虑复制备份的`ibdata1`和`ib_logfile*`文件回原位置,以替换已删除的文件。 但是,这种方法并不总是安全的,因为它依赖于数据库的当前状态和内存中的数据。如果...
日志文件默认为ib_logfile1和ib_logfile2,可以通过`innodb_log_file_size`和`innodb_log_files_in_group`等参数配置。 2. **回滚日志(undo log)**:undo log用于回滚事务和实现多版本并发控制(MVCC),在事务...
重做日志文件通常有两个,默认名为ib_logfile0和ib_logfile1。 - 参数配置: - innodb_log_files_in_group:定义重做日志文件的数量。 - innodb_log_file_size:设置单个重做日志文件的大小。 - innodb_log_...
- ib_logfile0和ib_logfile1:这些是重做日志文件,记录了所有事务的更改,用于在系统崩溃时恢复数据。 2. MyISAM表格式文件: - .frm文件:包含表结构信息。 - .MYD(MYData):存储表的实际数据。 - .MYI...
然而,在检查MySQL安装路径时,发现关键的InnoDB表空间文件(`ibdata1`、`ib_logfile0`、`ib_logfile1`)缺失。 #### 故障分析与处理流程 1. **确定故障原因**: - **文件丢失**:初步怀疑是人为误删导致。 - **...
它的两个文件通常命名为ib_logfile0和ib_logfile1。 6. 重做日志(InnoDB Redo Log) 重做日志与redo log是同义词,主要为了保证事务的持久性和一致性。 7. 二进制日志组提交(Group Commit) 为了提高效率,...
不论事务是否已经提交)默认的日志文件是ib_logfile0,ib_logfile1 # 1:当设为默认值1的时候,每次提交事务的时候,都会将log buffer刷写到日志。 # 2:如果设为2,每次提交事务都会写日志,但并不会执行刷的操作。每...
此时,需要删除旧的日志文件,如`ib_logfile0`和`ib_logfile1`,然后再启动MySQL服务。 除了上述配置参数,还有其他一些优化措施,如调整InnoDB表空间、启用并行读取、调整锁等待超时时间等。同时,监控系统资源...
这些文件包括`ibdata1`(InnoDB的数据文件)以及`ib_logfile0`和`ib_logfile1`(InnoDB的日志文件)。删除这些文件不会导致数据丢失,因为它们会在MySQL重启时自动重建。 3. 删除文件后,重启MySQL服务。在OpenSUSE...
它包含两份循环使用的文件,如`ib_logfile0`和`ib_logfile1`,在事务提交时记录对InnoDB表的改动。如果发生崩溃,重做日志可以用来恢复未完成的事务。影响重做日志的参数包括: - `innodb_log_file_size`:设定单个...
- `/var/lib/mysql/ib_logfile0` - `/var/lib/mysql/ib_logfile1` #### 四、定位并编辑MariaDB配置文件 MariaDB的主要配置文件通常位于`/etc/my.cnf`。接下来,我们将详细介绍如何对该文件进行必要的调整。 #### ...
如果日志文件大小与预期不同,如“Error: log file ./ib_logfile0 is of different size 0 5242880 bytes”,这表明InnoDB日志文件的配置与实际大小不符。这可能源于my.cnf配置文件的更改。解决方法是删除旧的日志...
ibdata1和ib_logfile0/1是InnoDB存储引擎的系统表空间和日志文件,它们对于事务的恢复至关重要;mysql-bin.000001和mysql-relay-bin.000001是二进制日志文件,记录了数据库的变更操作,用于数据复制和恢复等。 逻辑...
- **删除数据文件与日志文件**:首先,你需要停止MySQL服务,然后找到MySQL的数据目录(datadir),删除受影响的数据库文件以及InnoDB的日志文件(通常是`ib_logfile0`和`ib_logfile1`)。这些文件记录了InnoDB引擎...