MySql日志概述
存储引擎里用的是redo日志和undo日志,服务层用的是bin日志
Redo日志
意思就是在存日志时候,如果要存在磁盘,肯定需要开启io,每次都要开启关闭io,所以它每次都是先把日志放在内存,然后读取到磁盘,但有个问题,如果突然断电了,日志难道要丢失吗?它把日志存在内存时候,干了这么一件事。。。
在每次把日志存放在内存时候,经过log buffer,它是用户的某一个内存空间,里面分redo和undo,然后经过user space和kernel space,user space是用户控制的,kernel space是内核控制的,也就是经过OS buffer操作系统,就是从一块缓存拷贝到另一块缓存,这个速度肯定非常快,并不是直接从内存写到磁盘空间。然后在OS buffer会经过fsync()方法,写入到磁盘。
所以在每次如果真的断电的话,redo日志会把日志恢复,避免数据丢失。日志每次也不是说有一个就赶紧存到磁盘,这样效率很低,它会有一个缓存机制,有一定数据量一并写入磁盘。
执行顺序图:
Undo日志
redo表示在每次数据写到磁盘时候保证原始性,undo表示要么成功要么失败
Bin日志
binlog就是归档日志
之前早时候携程的数据库丢失数据了,有的说被黑客攻击了,有的说自己员工不小心删除了,不管怎么回事,这样的结果最终想要的是恢复数据;
binlog可以恢复数据,就算数据丢了,如果binlog日志文件不丢,就能恢复数据!
注意:如果你的binlog没开启的话,默认是不开启的。
命令行输入:show variables like '%log_%': 然后回车
可以看到binlog是关闭的,如果要开启需要设置成ON
Redo log两阶段提交
《三体》中有句话——弱小和无知不是生存的障碍,傲慢才是。
所以我们不要做一个小青蛙