MySql问题

文章详细介绍了MySQL中的三种重要日志类型:undo-log用于事务回滚和MVCC机制;redo-log实现数据恢复,保证预写式日志的安全性;bin-log记录表结构变更和数据修改,用于数据灾备和同步。这三种日志各有其特定的作用和特点,确保了MySQL的数据一致性和可靠性。
摘要由CSDN通过智能技术生成

1.日志

Bin-log,undo-log ,redo-log

undo-log

1.实现事务回滚和MVCC机制,

也就是当一个事务尝试写某行表数据时,首先会将旧数据拷贝到xx.ibdata文件中,将表中行数据的隐藏字段:roll_ptr回滚指针会指向xx.ibdata文件中的旧数据,然后再写表上的数据。

2.InooDB存储引擎特有,InnoDBMySQL启动时,会在内存中构建一个BufferPool,而这个缓冲池主要存放两类东西,一类是数据相关的缓冲,如索引、锁、表数据等,另一类则是各种日志的缓冲,如Undo、Bin、Redo....等日志。

redo-log

1.用来实现数据的恢复

Redo-log是一种预写式日志,即在向内存写入数据前,会先写日志,当后续数据未被刷写到磁盘、MySQL崩溃时,就可以通过日志来恢复数据,确保所有提交的事务都会被持久化。

2.red-log刷盘策略:参数来控制,默认是处于第二个级别,也就是每次提交事务时都会刷盘,这也就意味着一个事务执行成功后,相应的Redo-log日志绝对会被刷写到磁盘中,因此无需担心会出现丢失风险。

bin-log

1.Bin-log日志也被称之为二进制日志,作用与Redo-log类似,主要是记录所有对数据库表结构变更和表数据修改的操作,对于select、show这类读操作并不会记录。bin-logMySQL-Server级别的日志,也就是所有引擎都能用的日志,而redo-log、undo-log都是InnoDB引擎专享的,无法跨引擎生效。

2.MySQL-Server会给每一条工作线程,都分配一个bin_log_buffer,而并不是放在共享缓冲区中,这是为啥呢?因为MySQL设计时要兼容所有引擎,直接将bin-log的缓冲区,设计在线程的工作内存中,这样就能够让所有引擎通用,并且不同线程/事务之间,由于写的都是自己工作内存中的bin-log缓冲,因此并发执行时也不会冲突!

Bin-logvo-log

MyISAM不支持事务,所以MySQL-Server设计的Bin-log无法用于灾难恢复,因此InnoDB在设计时,又重新设计出Redo-log日志,可以利用该日志实现crash-safe灾难恢复能力,确保任何事务提交后数据都不会丢失。

  • ①生效范围不同,Redo-logInnoDB专享的,Bin-log是所有引擎通用的。
  • ②写入方式不同,Redo-log是用两个文件循环写,而Bin-log是不断创建新文件追加写。
  • ③文件格式不同,Redo-log中记录的都是变更后的数据,而Bin-log会记录变更SQL语句。
  • ④使用场景不同,Redo-log主要实现故障情况下的数据恢复,Bin-log则用于数据灾备、同步。

事务两阶段提交方案,啥叫做事务两阶段提交呢?实则是指Redo-log分两次写入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值