当前位置: 首页 > wzjs >正文

网站上怎么做动图百度一下搜索引擎

网站上怎么做动图,百度一下搜索引擎,网站建设 学校,织梦网站调用工具binlog 和 redo log: 有binlog了为什么还要有redo log: 历史原因,MyISAM不支持崩溃恢复,而InnoDB在加入MySQL前就已经支持崩溃恢复了InnoDB使用的是WAL技术,事务提交后,写完内存和日志,就算事…

binlog 和 redo log:

有binlog了为什么还要有redo log:

  1. 历史原因,MyISAM不支持崩溃恢复,而InnoDB在加入MySQL前就已经支持崩溃恢复了
  2. InnoDB使用的是WAL技术,事务提交后,写完内存和日志,就算事务完成了,脏页有没有落盘不在乎!没有redo的情况下,奔溃恢复后如果binlog是残缺的,说明事务没成功,可以通过undo回滚;如果binlog是完整的,却并不能确定崩溃前脏页有没有落盘,这就无法以binlog是否完整判断事务在数据库崩溃前是否已经持久化、脏页是否落盘,而引入redo后,配合两阶段提交,加上redo是物理日志,就可以进行崩溃恢复了。而且binlog本身因为内容格式的原因,并不适合做崩溃恢复,更适合主从同步或备份恢复。

能不能只用redo,不用binlog:

不考虑主从集群、备份恢复,只从崩溃恢复和高效写WAL角度考虑的话,可以把binlog关闭。binlog本身默认就是关闭

为什么 binlog cache 是每个线程自己维护的,而 redo log buffer 是全局共用的:

binlog 是不能“被打断的”。一个事务的 binlog 必须连续写(主从同步要求,不然可能会出错),因此要整个事务完成后,再一起写到文件里。而 redo log 并没有这个要求(redo用于崩溃恢复,物理日志,先修改哪个后修改哪个无所谓),中间有生成的日志可以写到 redo log buffer 中。redo log buffer 中的内容还能“搭便车”,其他事务提交的时候可以被一起写到磁盘中。

两阶段提交

两阶段提交只有在开启了binlog的情况下才会有,而binlog默认是关闭的,那么默认情况下就是

将事务的数据变更记录到redo(prepare状态的redo),当事务提交时,进入到commit阶段,先把redo的状态更改为commit,然后根据innodb_flush_log_at_trx_commit参数有不同行为:

参数为0,啥也不干

参数为1,write + fsync

参数为2,write

崩溃恢复时,如果redo是commit,那么直接用来做数据恢复,如果是prepare,结合redo的完整性决定是恢复还是回滚事务

在开启了binlog的情况下,需要考虑redo log 和 binlog的一致性:

  • 如果在将 redo log 刷入到磁盘之后, MySQL 突然宕机了,而 binlog 还没有来得及写入。MySQL 重启后,通过 redo log 能崩溃恢复,但是 binlog 里面没有该事务的记录,在主从架构中,binlog 会被复制到从库,由于 binlog 丢失了记录,主从发生了不一致;
  • 如果在将 binlog 刷入到磁盘之后, MySQL 突然宕机了,而 redo log 还没有来得及写入。由于 redo log 还没写,崩溃恢复以后这个事务无效,而 binlog 里面记录了这条记录,在主从架构中,binlog 会被复制到从库,从库更新了这条记录,主从发生了不一致;

MySQL 为了避免出现两份日志之间的逻辑不一致的问题,使用了「两阶段提交」来解决:

prepare 阶段:将 XID(内部 XA 事务的 ID) 写入到 redo log,同时将 redo log 对应的事务状态设置为 prepare,然后将 redo log 持久化到磁盘(innodb_flush_log_at_trx_commit = 1 的作用,如果是0,不会持久化);

commit 阶段:把 XID 写入到 binlog,然后将 binlog 持久化到磁盘(sync_binlog = 1 的作用),接着调用引擎的提交事务接口,将 redo log 状态设置为 commit,此时该状态并不需要持久化到磁盘,只需要 write 到文件系统的 page cache 中就够了,因为只要 binlog 写磁盘成功,就算磁盘里的 redo log 的状态还是 prepare 也没有关系,一样会被认为事务已经执行成功;

不管是时刻 A(redo log 已经写入磁盘, binlog 还没写入磁盘),还是时刻 B (redo log 和 binlog 都已经写入磁盘,还没写入 commit 标识)崩溃,此时的 redo log 都处于 prepare 状态。

在 MySQL 重启后会按顺序扫描 redo log 文件,碰到处于 prepare 状态的 redo log,就拿着 redo log 中的 XID 去 binlog 查看是否存在此 XID:

  • 如果 binlog 中没有当前内部 XA 事务的 XID,说明 redolog 完成刷盘,但是 binlog 还没有刷盘,则回滚事务。对应时刻 A 崩溃恢复的情况。
  • 如果 binlog 中有当前内部 XA 事务的 XID,说明 redolog 和 binlog 都已经完成了刷盘,则提交事务(使用prepare的redo进行崩溃恢复,虽然是prepare,但redo是完整的)。对应时刻 B 崩溃恢复的情况。

可以看到,对于处于 prepare 阶段的 redo log,既可以提交事务,也可以回滚事务,这取决于是否能在 binlog 中查找到与 redo log 相同的 XID,如果有就提交事务,如果没有就回滚事务。这样就可以保证 redo log 和 binlog 这两份日志的一致性了。

所以说,两阶段提交是以 binlog 写成功为事务提交成功的标识,因为 binlog 写成功了,就意味着能在 binlog 中查找到与 redo log 相同的 XID。

两阶段缺点:

  • 磁盘 I/O 次数高:对于“双1”配置,每个事务提交都会进行两次 fsync(刷盘),一次是 redo log 刷盘,另一次是 binlog 刷盘。
  • 锁竞争激烈:两阶段提交虽然能够保证「单事务」两个日志的内容一致,但在「多事务」的情况下,却不能保证两者的提交顺序一致,因此,在两阶段提交的流程基础上,还需要加一个锁来保证提交的原子性,从而保证多事务的情况下,两个日志的提交顺序一致。在早期的 MySQL 版本中,通过使用 prepare_commit_mutex 锁来保证事务提交的顺序,在一个事务获取到锁时才能进入 prepare 阶段,一直到 commit 阶段结束才能释放锁,下个事务才可以继续进行 prepare 操作。
http://www.dtcms.com/wzjs/30629.html

相关文章:

  • 区块链的网站怎么做自助建站系统源码
  • 海洋承德网站建设公司电商网页
  • 青岛网站设计软件电商网站开发平台
  • 做体育直播网站今日十大热点新闻头条
  • 用wordpress建立学校网站网页怎么优化
  • 网站文件保护怎么做seo技巧
  • 建设银行网站首页公司机构搜索引擎优化的实验结果分析
  • 渭南哪里做网站百度网站提交入口网址
  • 昆山市建设工程质量检测中心网站百度推广时间段在哪里设置
  • 做政府网站的公司推荐windows优化大师有哪些功能
  • 武汉网站群发网络营销工具分析
  • 平台网站建设有哪些seo入门基础知识
  • 网站任务界面凡科建站登录官网
  • 新化网站建设网站免费高清素材软件
  • 衡阳公司做网站爱站网关键词工具
  • 爱情树表白网页在线制作东莞网站制作十年乐云seo
  • 做c2b的网站手机营销推广方案
  • 音乐APP网站开发郑州seo优化外包公司
  • 网站项目建设方案seo还能赚钱吗
  • 网站建设行业前景如何必应搜索引擎下载
  • 哪里有网站开发平台如何优化网站
  • 培训网站建设进入百度
  • 威海网站优化推广拉新app哪几个靠谱
  • 手机销售网站的建设注册安全工程师
  • wordpress系统教程 pdf什么是seo
  • 如何查询一个网站是那家公司做的seo方案怎么做
  • 铁盒 东莞网站建设福建省人民政府
  • 影院网站模板浏览器网站进入口
  • 招聘网站咋做媒介
  • 推动品牌建设的网站网络广告推广平台