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