码迷,mamicode.com
首页 > 其他好文 > 详细

日志和索引的相关问题

时间:2018-12-17 14:20:54      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:一个   阶段   写入   重启   begin   mys   not   tab   value   

一:日志相关问题.

技术分享图片

这里的commit 步骤在事务提交之后执行的。

在A 阶段数据库奔溃重启后,binlog没有写入,那么从库没有数据。主库也会回滚。

在B阶段数据库奔溃重启后,redolog会拿着xid去binlog中去找,如果找到就提交。就可以崩溃恢复

(1)mysql如何知道binlog的完整性? binlog有一定的语句格式

(2)redo log binlog如何关联?俩阶段提交流程,还有xid

(3)binlog不支持数据恢复,只是用来归档 ,它没有记录数据页的相关信息。

(4)redo log提交了就不能回滚 了。它是循环写,起不了归档的作用

(5)先写redolog buffer ,还是redo log? 事务提交的时候才写redo log ,首先是在redo log buffer中记录下来 ,事务提交的时候,从buffer中写入到 redo log 中。

 

一个有趣的问题

CREATE TABLE `like` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `liker_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_id_liker_id` (`user_id`,`liker_id`)
) ENGINE=InnoDB;

CREATE TABLE `friend` (
  id` int(11) NOT NULL AUTO_INCREMENT,
  `friend_1_id` int(11) NOT NULL,
  `firned_2_id` int(11) NOT NULL,
  UNIQUE KEY `uk_friend` (`friend_1_id`,`firned_2_id`)
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

 

技术分享图片

 

 

 mysql> begin; /* 启动事务 */
insert into `like`(user_id, liker_id, relation_ship) values(A, B, 1) on duplicate key update relation_ship=relation_ship | 1;
select relation_ship from `like` where user_id=A and liker_id=B;
/* 代码中判断返回的 relation_ship,
  如果是 1,事务结束,执行 commit
  如果是 3,则执行下面这两个语句:
  */
insert ignore into friend(friend_1_id, friend_2_id) values(A,B);
commit;

mysql> begin; /* 启动事务 */
insert into `like`(user_id, liker_id, relation_ship) values(B, A, 2) on duplicate key update relation_ship=relation_ship | 2;
select relation_ship from `like` where user_id=B and liker_id=A;
/* 代码中判断返回的 relation_ship,
  如果是 1,事务结束,执行 commit
  如果是 3,则执行下面这两个语句:
*/
insert ignore into friend(friend_1_id, friend_2_id) values(B,A);
commit;

 

日志和索引的相关问题

标签:一个   阶段   写入   重启   begin   mys   not   tab   value   

原文地址:https://www.cnblogs.com/hanguocai/p/10130718.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!