`
丁林.tb
  • 浏览: 797225 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MySQL源码学习:InnoDB的ib_logfile写入策略

阅读更多

ib_logfileInnoDB的事务日志文件。本文简要说明其写入时机、写入策略及如何保证数据安全。

 

 

1、              基本概念

a)        ib_logfile文件个数由innodb_log_files_in_group配置决定,若为2,则在datadir目录下有两个文件,命令从0开始,分别为ib_logfile0ib_logfile.

b)        文件为顺序写入,当达到最后一个文件末尾时,会从第一个文件开始顺序复用。

c)        lsn: Log Sequence Number,是一个递增的整数。 Ib_logfile中的每次写入操作都包含至少1log,每个log都带有一个lsn。在内存page修复过程中,只有大于page_lsnlog才会被使用。

d)        lsn的保存在全局变量log_sys中。递增数值等于每个log的实际内容长度。即如果新增的一个log长度是len,则log_sys->lsn += len.

e)        ib_logfile每次写入以512OS_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时同时更新lsnbuf_free 每次写ib_logfile时同时更新written_to_all_lsnbuf_next_to_write

c)        每次写ib_logfile时以512字节为对齐,如需写入600字节,则实际写入1k。写到最后一个文件末尾则从第一个文件重复使用。

d)         从上述流程看到,在ad过程中若出现异常关闭,由于没有写入到磁盘中,因此整个事务放弃;若在e刚完成时出现异常关闭,虽然事务内容已经写盘,但没有提交。在重启恢复的时候,发现这个事务还没有提交,逻辑上整个事务放弃。      (重启日志中会有Found 1 prepared transaction(s) in InnoDB字样)。在g完成后出现异常关闭,则能够在重启恢复中正常提交。

    ef之间会写mysqlbin-log,若bin-log写完前异常关闭,事务无效,bin-log写入成功后,则异常重启后能够根据bin-log恢复事务的修改。

 

e)        若涉及到索引更新,在步骤c之后会增加索引更新的log。由于索引可能有merge过程,因此在merge过程中会另外增加写入一个log。但事务完全提交仍在步骤g中。索引的更新由于已经写盘,并不会因此丢失。

 

3
1
分享到:
评论
6 楼 babaoqi 2011-12-19  
konglonggongzhu 写道
redo log 写入到ib_logfile内
undo log 写入到表空间中


如果启用innodb_file_pre_table:每一个新数据表创建一个表空间文件
undo log是写入共享表空间的
5 楼 konglonggongzhu 2011-03-31  
我这样理解对吗?
4 楼 konglonggongzhu 2011-03-31  
redo log 写入到ib_logfile内
undo log 写入到表空间中
3 楼 konglonggongzhu 2011-03-16  
谢谢您的回复!
2 楼 丁林.tb 2011-03-16  
konglonggongzhu 写道
看到很多资料上提到undo log 与redo log!
redo log 是每次commit的时候flush到磁盘上,那undo log 是什么时候flush到磁盘上?
是不是每个事务开始的时候undo log 自动建立在磁盘上?


这两个是一起刷的。
上面流程中a,b是undo log, c是redo log
1 楼 konglonggongzhu 2011-03-14  
看到很多资料上提到undo log 与redo log!
redo log 是每次commit的时候flush到磁盘上,那undo log 是什么时候flush到磁盘上?
是不是每个事务开始的时候undo log 自动建立在磁盘上?

相关推荐

    :innodb_flush_log_at_trx_commit 和 sync_binlog1

    首先,`innodb_flush_log_at_trx_commit` 参数是 InnoDB 存储引擎特有的,它控制着事务日志(redo log 和 undo log)何时以及如何被刷新到磁盘上的 ib_logfile 文件。此参数有三个可选值: 1. 当设置为 0 时,...

    完美解决mysql启动后随即关闭的问题(ibdata1文件损坏导致)

    5. **日志分析**:分析InnoDB的日志文件(ib_logfile*),可能有更多关于异常关闭的记录。 6. **重新创建表空间**:在极端情况下,如果上述方法都无效,可能需要删除并重新创建InnoDB表空间,但这会丢失所有InnoDB...

    MySQL和IO 上1

    首先,MySQL的文件系统包含多种类型的文件,如数据文件(*.frm, *.ibd)、数据字典(ibdata1, ibdata2)、事务日志(ib_logfile0, ib_logfile1)、回滚日志、归档日志(binlog)和中继日志(relaylog),以及各种...

    Mysql数据库的使用总结之ERROR 1146.pdf

    在MySQL中,表结构和数据存储在不同的文件中,如`.frm`文件存储表结构,`ibdata1`文件存储InnoDB的数据,而`ib_logfile0`和`ib_logfile1`则包含事务日志信息。 当从其他源复制数据库目录时,特别是包含InnoDB表的...

    mysql 误删除ibdata1之后的恢复方法

    在确认所有必要的flush和后台线程工作完成后,可以考虑复制备份的`ibdata1`和`ib_logfile*`文件回原位置,以替换已删除的文件。 但是,这种方法并不总是安全的,因为它依赖于数据库的当前状态和内存中的数据。如果...

    MySQL的有哪些日志文件,都有什么作用?

    日志文件默认为ib_logfile1和ib_logfile2,可以通过`innodb_log_file_size`和`innodb_log_files_in_group`等参数配置。 2. **回滚日志(undo log)**:undo log用于回滚事务和实现多版本并发控制(MVCC),在事务...

    详解MySQL 重做日志(redo log)与回滚日志(undo logo)

    重做日志文件通常有两个,默认名为ib_logfile0和ib_logfile1。 - 参数配置: - innodb_log_files_in_group:定义重做日志文件的数量。 - innodb_log_file_size:设置单个重做日志文件的大小。 - innodb_log_...

    Mysql基础:数据库数据文件

    - ib_logfile0和ib_logfile1:这些是重做日志文件,记录了所有事务的更改,用于在系统崩溃时恢复数据。 2. MyISAM表格式文件: - .frm文件:包含表结构信息。 - .MYD(MYData):存储表的实际数据。 - .MYI...

    处理MySQL访问异常故障.pdf

    然而,在检查MySQL安装路径时,发现关键的InnoDB表空间文件(`ibdata1`、`ib_logfile0`、`ib_logfile1`)缺失。 #### 故障分析与处理流程 1. **确定故障原因**: - **文件丢失**:初步怀疑是人为误删导致。 - **...

    MySQL 日志详解(超详细)

    它的两个文件通常命名为ib_logfile0和ib_logfile1。 6. 重做日志(InnoDB Redo Log) 重做日志与redo log是同义词,主要为了保证事务的持久性和一致性。 7. 二进制日志组提交(Group Commit) 为了提高效率,...

    mysql数据库my.cnf配置文件

    不论事务是否已经提交)默认的日志文件是ib_logfile0,ib_logfile1 # 1:当设为默认值1的时候,每次提交事务的时候,都会将log buffer刷写到日志。 # 2:如果设为2,每次提交事务都会写日志,但并不会执行刷的操作。每...

    Mysql5.5 InnoDB存储引擎配置和优化

    此时,需要删除旧的日志文件,如`ib_logfile0`和`ib_logfile1`,然后再启动MySQL服务。 除了上述配置参数,还有其他一些优化措施,如调整InnoDB表空间、启用并行读取、调整锁等待超时时间等。同时,监控系统资源...

    MySQL不支持InnoDB的解决方法

    这些文件包括`ibdata1`(InnoDB的数据文件)以及`ib_logfile0`和`ib_logfile1`(InnoDB的日志文件)。删除这些文件不会导致数据丢失,因为它们会在MySQL重启时自动重建。 3. 删除文件后,重启MySQL服务。在OpenSUSE...

    MySQL中二进制与重做日志文件的基本概念学习教程

    它包含两份循环使用的文件,如`ib_logfile0`和`ib_logfile1`,在事务提交时记录对InnoDB表的改动。如果发生崩溃,重做日志可以用来恢复未完成的事务。影响重做日志的参数包括: - `innodb_log_file_size`:设定单个...

    cdh5-MariaDB 配置

    - `/var/lib/mysql/ib_logfile0` - `/var/lib/mysql/ib_logfile1` #### 四、定位并编辑MariaDB配置文件 MariaDB的主要配置文件通常位于`/etc/my.cnf`。接下来,我们将详细介绍如何对该文件进行必要的调整。 #### ...

    MYSQL迁移或者升级的故障解决大全[归纳].pdf

    如果日志文件大小与预期不同,如“Error: log file ./ib_logfile0 is of different size 0 5242880 bytes”,这表明InnoDB日志文件的配置与实际大小不符。这可能源于my.cnf配置文件的更改。解决方法是删除旧的日志...

    MySql体系结构

    ibdata1和ib_logfile0/1是InnoDB存储引擎的系统表空间和日志文件,它们对于事务的恢复至关重要;mysql-bin.000001和mysql-relay-bin.000001是二进制日志文件,记录了数据库的变更操作,用于数据复制和恢复等。 逻辑...

    碰到MySQL无法启动1067错误问题解决方法

    - **删除数据文件与日志文件**:首先,你需要停止MySQL服务,然后找到MySQL的数据目录(datadir),删除受影响的数据库文件以及InnoDB的日志文件(通常是`ib_logfile0`和`ib_logfile1`)。这些文件记录了InnoDB引擎...

Global site tag (gtag.js) - Google Analytics