Oracle

MySQL

PostgreSQL

Redo log files are filled with redo records. A redo record, also called a redo entry, is made up of a group of change vectors, each of which is a description of a change made to a single block in the database.

Change vectors = a smallest unit which describing the changes made for the database blocks。



在执行commit之前,Oracle已完成如下工作:

  1. 生成undo信息,undo信息包含了事务中被修改掉的旧数据
  2. 在SGA中的redo log buffer中生成redo log entries 。这些redo log record包含了数据块的change以及回滚块的change。在commit之前,这些记录有可能已被刷到磁盘
  3. 数据change已在SGA的data buffer中完成。这些change有可能在commit之前已被刷到磁盘  


在执行commit时,进行如下工作:

  1. 关联undo表空间的内部事务表,将该事务标记为已提交,并以SCN号来标记
  2. LGWR将SGA中的redo log entries写入到redo log file。同时也会将事务的SCN写入到redo log file
  3. Oracle释放行和表上持有的锁
  4. Oracle标记这个事务已完成

两个可配置的相关参数,两种数据库日志

innodb_flush_log_at_trx_commit

0) 每秒written & flush to disk

1)每次commit,都written & flush to disk

2)每次commit都written,每秒进行flush to disk

这里的log是redolog,也就是inndo的log

Sync_binlog

0 )MySQL不控制binlog的同步,像普通文件一样由操作系统处理

1 )事务commit前,将binlog同步到disk。但是如果有大事务的话,这个时候就稍微类似设置为0的情况,当这个事务提交时,需要更长的时间来同步binlog。如果设置了expired_log_days,在同步binlog的时候,还会进行purge log的操作。

N 累计到N次binlog提交之后,再进行binlog同步操作

 配置参数  synchronous_commit

1)        off

提交动作不会等待transaction record刷新到硬盘就完成。

2)        local

提交动作会等到transaction record flush到本地硬盘后再完成。

3)        on (默认)

如果该参数设置为on,并且通过synchronous_standby_names配置了同步备库,那么COMMITs将等待同步备库确认数据被flush到硬盘后才会完成。目的是确保数据被保存在了两个或更多的地方。

但是如果备库停止响应,那么主库的COMMITs将会hang住,直到手动处理这种故障。为了防止这种情况,可以添加第三个数据库作为同步备库,当第一个备库发生故障,主库可以使用第二个备库。

4)        remote_write

此参数值表示,主库事务将等待备库上数据写入到disk cache后才会完成。如果持久化这个数据,应该将这个data cache flush到硬盘。所以,这个参数配置存在一定的丢失数据风险。

不建议配置此参数,除非对性能的要求大于丢失数据的风险。

5)        remote_apply

此参数表示,COMMITs等待同步备库将事务写入到硬盘,并且applied后才会完成。绝对安全、绝对同步。

LGWR写触发情形 :

当commit时;

每三秒一次;

当redo log buffer使用了1/3时;

当DBWn将脏块写入disk时(如果需要)


 

  • No labels