【MYSQL】MySql数据库WAL(Write-Ahead Logging)机制

简介

  WAL 的全称是 Write-Ahead Logging,中文称预写式日志,是一种数据安全写入机制。就是先写日志,然后在写入磁盘,这样保证数据的安全性。Mysql中的Redo Log就是采用WAL机制。

WAL作用

  Mysql中如果为了保证数据的持久性,在每提交一个事务就将日志刷新到磁盘上,这样效率就太低了,严重影响性能,所以就有了Write-Ahead 。
  Write-Ahead工作机制:
    先在内存中提交事务,然后写日志(在InnoDB中就是Redo Log,日志是为了防止宕机导致内存数据丢失),然后再后台任务中把内存中的数据异步刷到磁盘。


WAL优缺点

  使用WAL代替回滚日志有其优点和缺点。

  优点:
    1. 在大多数情况下,WAL的速度要快得多。

    2. WAL提供了更多的并发性,因为读卡器不会阻塞写卡器,而写卡器也不会阻塞读卡器。读和写可以同时进行。

    3. 使用WAL,磁盘I/O操作往往更为连续。

    4. WAL使用的fsync()操作更少,因此在fsync()系统调用中断的系统上不易受到问题的攻击。

   缺点: 

    1. 一般情况下需要VFS支持共享内存模式(shared-memory primitives)。

    2. 操作数据库文件的进程必须在同一台主机上,不能用在网络操作系统。

    3. 持有多个数据库文件的数据库连接对于单个数据库时原子的,对于全部数据库是不原子的。

    4. 进入WAL模式以后不能修改page的size。

    5. 不能打开只读的WAL数据库(Read-Only Databases),这进程必须有"-shm"文件的写权限。

    6. 对于只进行读操作,很少进行写操作的数据库,要慢那么1到2个百分点。

    7. 会有多余的"-wal"和"-shm"文件。

    8. 需要开发者注意checkpointing检查点。

参考来源

  http://www.sqlite.org/draft/wal.html

原文地址:https://www.cnblogs.com/songgj/p/11192776.html