【MYSQL】MySql数据库WAL(Write-Ahead Logging)机制
简介
WAL 的全称是 Write-Ahead Logging,中文称预写式日志,是一种数据安全写入机制。就是先写日志,然后在写入磁盘,这样保证数据的安全性。Mysql中的Redo Log就是采用WAL机制。
WAL作用
Mysql中如果为了保证数据的持久性,在每提交一个事务就将日志刷新到磁盘上,这样效率就太低了,严重影响性能,所以就有了Write-Ahead 。
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检查点。
参考来源