数据仓库001- 时间拉链的全量备份

mysql中演示

在mysql演示时间拉链的全量备份:

一、演示第一次及第二次全量备份。

1、首先存在业务系统表。

//进入test数据库。
use test
//创建业务表user_data,并赋予最初的业务数据。
create table user_data(
userid int,
ustate varchar(4)
);
insert into user_data values(1,'1');
insert into user_data values(2,'2');
insert into user_data values(3,'3');
insert into user_data values(4,'4');
insert into user_data values(5,'5');

2、第一次的全量备份:用临时表bak抽取业务表中的数据,添加两个字段信息(开始时间和

结束时间),然后由bak直接将所有的数据插入历史表his中。

//开始时间的业务数据的当天,这里我们假设时间为2007-01,并将结束时间取为最大。
//在这里,我们的记录的begin_date和end_date都是varchar类型。
create table bak as select u.*,'200701' begin_date,'299901' end_date from user_data u ;
//将bak表的数据插入历史表中。
create table his as select * from bak;

3、查看第一次全量备份后的数据

在这里插入图片描述

不管是全量备份还是增量备份,第一次备份都是将所有的业务数据添加时间信息后插入历史表,接下来的第二次全量备份才是重点。

4、我们假设在2008-01时,将业务表中的数据修改,修改如下:

update user_data set ustate = 2 where userid = 1;
update user_data set ustate = 4 where userid = 3;
update user_data set ustate = 6 where userid = 5;

修改后的业务表数据如下:

在这里插入图片描述

扫描二维码关注公众号,回复: 12082084 查看本文章

重点来了,我们的核心步骤之一就是:将“昨天”的数据和“今天”的数据作比较。

5、第一次全量备份的时候,临时表bak就已经存了“昨天”的业务数据和时间信息。所以我们要将bak表中的数据插入old_temp表中,将“今天”的业务数据添加时间字段插入new_temp表中。

create table old_temp as select * from bak;

create table new_temp as select u.*,'200801' begin_date,'299901' end_date from user_data u ;

此时可以分别查看一下new表和old表的数据,先看old表的数据。

在这里插入图片描述

再查看new表的数据。

在这里插入图片描述

6、运用时间拉链算法,new-old得出新增的数据,old-new得出改变的数据。这里要注意,我们说的新增或修改的数据不是说对业务表做的新增或修改,而是针对于历史表我们将要做出的新增或修改。

//查看新增的数据
select a.* from new_temp a left join old_temp b on a.userid = b.userid and a.ustate = b.ustate where  b.userid is null;

在这里插入图片描述

//查看修改的数据
select b.* from new_temp a right join old_temp b on a.userid = b.userid and a.ustate = b.ustate where  a.userid is null;

在这里插入图片描述

7、有一个核心步骤,就是在临时表bak的数据插入old表中,业务表添加字段插入new表中这一步骤后,需要将此时new表的信息插入到临时表bak中。当然,将数据插入目标表之前都要将目标表的数据先全清除干净。此时的bak表就是下一次全量备份时的“昨天”的数据了。

//清空bak表的数据
truncate table bak;
//将new表的数据全部插入bak中
insert into bak select * from new_temp;

查看bak表数据。

在这里插入图片描述

8、第二次全量备份的最后一步到了,就是将新增的数据插入到历史表中,将修改的数据在历史表中修改。

//将新增的数据插入历史表
insert into his select a.* from new_temp a left join old_temp b on a.userid = b.userid and a.ustate = b.ustate 
where b.userid is null;

查看his表的数据

在这里插入图片描述

//将修改的数据在历史表中修改
update his t1 inner join (select b.* from new_temp a 
right join old_temp b on a.userid = b.userid and a.ustate = b.ustate 
where a.userid is null) t2 on t1.userid = t2.userid and 
t1.ustate = t2.ustate set t1.end_date = '200801';

查看his表的数据

在这里插入图片描述

成功的将新增或修改的数据备份到历史表中。

二、接下来开始第三次全量备份。

1、首先我们看一下时间为2008-01的业务数据,也就是“昨天”的业务数据。

在这里插入图片描述

现在我们假设在时间为2008-02将userid为1的用户信息改为ustate=3,userid为4的用户信息改为8。

update user_data set ustate = 3 where userid = 1;
update user_data set ustate = 8 where userid = 4;

查看“今天”的业务数据。

在这里插入图片描述

2、在第二次全量备份的时候就说明了临时表bak的数据就是在第三次全量备份时的“昨天”数据,这里我们可以再查看一下。

在这里插入图片描述

然后我们将old表的数据清空并将“昨天”的数据插入old表,再清空new表的数据并将今天的业务数据添加时间字段插入new表。

//清空old表和new表的数据
truncate table new_temp;
truncate table old_temp;
//将bak表的数据插入old表
insert into old_temp select * from bak;
//将今天的业务数据添加时间字段插入new表
insert into new_temp select u.*,'200802' begin_date,'299901' end_date from user_data u ;

在这里插入图片描述

在这里插入图片描述

3、别忘了将bak表的数据清空并将new表的数据插入bak表,让bak表保存下一次全量备份时的“昨天”的数据。再次通过时间拉链算法计算新增的数据和修改的数据。

//清空bak表的数据
truncate table bak;
insert into bak select * from new_temp;

在这里插入图片描述

查看新增的数据

//查看新增的数据
select a.* from new_temp a left join old_temp b on a.userid = b.userid and a.ustate = b.ustate where  b.userid is null;

在这里插入图片描述

查看修改的数据

//查看修改的数据
select b.* from new_temp a right join old_temp b on a.userid = b.userid and a.ustate = b.ustate where  a.userid is null;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PKP05hJ2-1603707069462)(/img/时间拉链017.png)]

4、将新增的数据插入历史表,将修改的数据修改历史表。

//将新增的数据插入历史表
insert into his select a.* from new_temp a left join old_temp b on a.userid = b.userid and a.ustate = b.ustate 
where b.userid is null;

在这里插入图片描述

//将修改的数据在历史表中修改
update his t1 inner join (select b.* from new_temp a 
right join old_temp b on a.userid = b.userid and a.ustate = b.ustate 
where a.userid is null) t2 on t1.userid = t2.userid and 
t1.ustate = t2.ustate set t1.end_date = '200802';

在这里插入图片描述

第三次全量备份成功。

猜你喜欢

转载自blog.csdn.net/wankao/article/details/109295235