mysql 日志之redo log (重做日志)

redo log ,具体来说,当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log(文件)里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做。MySQL 里经常说到的 WAL 技术,WAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。

redo log 写入机制

        事务在执行过程中,生成的 redo log 是要先写到 redo log buffer 的。redo log的三种状态

1  在 redo log buffer 中,物理上是在 MySQL 进程内存中

2  写到磁盘 (write),但是没有持久化(fsync),物理上是在文件系统的 page cache 里面

3  持久化到磁盘,对应的是 hard disk

为了控制 redo log 的写入策略,InnoDB 提供了 innodb_flush_log_at_trx_commit 参数,它有三种可能取值:

1、设置为 0 的时候,表示每次事务提交时都只是把 redo log 留在 redo log buffer 中 ;

2、设置为 1 的时候,表示每次事务提交时都将 redo log 直接持久化到磁盘;

3、设置为 2 的时候,表示每次事务提交时都只是把 redo log 写到 page cache。

InnoDB 有一个后台线程,每隔 1 秒,就会把 redo log buffer 中的日志,调用 write 写到文件系统的 page cache,然后调用 fsync 持久化到磁盘。

redo log 设置

innodb_file_per_table = 1
innodb_buffer_pool_size = 2048M  #inodb数据缓存
innodb_log_file_size = 512M ##一般来说,日志文件的全部大小,应该足够容纳服务器一个小时的活动内容

innodb_log_files_in_group =4  ##日志文件数。默认值为2
innodb_log_buffer_size = 8M   ##默认8MB,InnoDB在写事务日志的时候,为了提高性能,也是先将信息写入Innofb Log Buffer中,当满足innodb_flush_log_trx_commit参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件 (或者同步到磁盘)中
innodb_flush_log_at_trx_commit = 2  #表示每次事务提交时都只是把 redo log 写到 page cache

你可能感兴趣的:(数据库)