SQL在MySQL数据库中是怎样施行的
发布时间:12/01 来源:未知 浏览:
关键词:
今天和mysql视频教程栏目一起看看一条更新语句又是怎么一个施行流程。
我们可以看到最后的时候,写redolog的时候分了两步,prepare和commit,这就是我们常说的“两阶段提交”。
为何日志需要“两阶段提交”?
因为redo log和binlog离别是存储引擎和施行器的日志,是两个独立的逻辑,要是不消两阶段提交,不管先提交哪个后提交哪个都会存在一些题目。我们这里也借助上边的例子看一下,假如目前ID=2的这一行值为0 ,在update的历程中写完了首先个日志后,第二个日志还没写期间产生了crash,会怎么样?
- 先写redolog后写binlog。假如redolog写完,binlog还没写完,MySQL进程异样重新启动了。我们晓得,redolog写完今后,系统即便解体了,也可以将数据恢复,所以在MySQL重新启动后,这一行回被恢复成1。因为binlog没写完就crash,这时候binlog里面是没有这个语句的,因而之后备份日志的的时候,存起来的binlog日志也没有这一条语句。当我们需要通过binlog来恢复数据的时候,因为binlog遗失了这条语句,恢复出来的这一行的值就是0,与原库的值不同啦。
- 先写binlog后写redo log。要是写完buglog之后,redo log还没写完的时候产生 crash,要是这个时候数据库奔溃了,恢复今后这个事务无效,所以这一行的值还是0,但是binlog里已经记录了这条更新语句的日志,在今后需要用binlog来恢复数据的时候,就会多了一个事务出来,施行这条更新语句,将值从0更新成1,与原库中的0就不一样了。
我们可以看到要是不运用“两阶段提交",那么数据库的状态就会和用日志恢复出来的库纷歧致。虽然平时用日志恢复数据的概率比拼低,但是用日志最多的还是扩容的时候,用全量备份和binlog来实现的,这个时候就可能致使线上的主从数据库纷歧致的状况。
相干免费学习举荐:mysql视频教程
以上就是SQL在MySQL数据库中是怎样施行的的细致内容,更多请关注 百分百源码网 其它相干文章!