Entrepôt de données 001 - sauvegarde complète de la fermeture à glissière du temps

Démo dans mysql

Sauvegarde complète de la fermeture à glissière au moment de la démonstration de mysql:

1. Faites une démonstration des première et deuxième sauvegardes complètes.

1. La table du système d'entreprise existe en premier.

//进入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. La première sauvegarde complète: utilisez la table temporaire bak pour extraire les données de la table métier, ajoutez deux informations de champ (heure de début et

Heure de fin), puis bak insère directement toutes les données dans la table d'historique sienne.

//开始时间的业务数据的当天,这里我们假设时间为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. Afficher les données après la première sauvegarde complète

Insérez la description de l'image ici

Qu'il s'agisse d'une sauvegarde complète ou d'une sauvegarde incrémentielle, la première sauvegarde consiste à insérer toutes les données d'entreprise dans la table d'historique après avoir ajouté les informations de temps, et la deuxième sauvegarde complète suivante est au centre.

4. Nous supposons qu'en 2008-01, les données de la table métier seront modifiées comme suit:

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;

Les données révisées du tableau d'activité sont les suivantes:

Insérez la description de l'image ici

Voici le point: l'une de nos étapes fondamentales consiste à comparer les données «d'hier» avec les données «d'aujourd'hui».

5. Lorsque la première sauvegarde complète est effectuée, la table bak temporaire stocke déjà les données professionnelles et les informations d'heure de «hier». Nous devons donc insérer les données de la table bak dans la table old_temp, et insérer les données commerciales "today" dans la table new_temp avec le champ time ajouté.

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 ;

À ce stade, vous pouvez vérifier les données de la nouvelle table et de l'ancienne table séparément, regardez d'abord les données de l'ancienne table.

Insérez la description de l'image ici

Vérifiez les données dans le nouveau tableau.

Insérez la description de l'image ici

6. En utilisant l'algorithme time zipper, new-old obtient les données nouvellement ajoutées, et old-new obtient les données modifiées. Il convient de noter ici que les données nouvelles ou modifiées dont nous parlons ne signifient pas l'ajout ou la modification de la table métier, mais l'ajout ou la modification que nous apporterons à la table historique.

//查看新增的数据
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;

Insérez la description de l'image ici

//查看修改的数据
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;

Insérez la description de l'image ici

7. Il y a une étape principale, qui consiste à insérer les données de la table temporaire bak dans l'ancienne table, et la table métier ajoute des champs dans la nouvelle table. Après cette étape, les informations de la nouvelle table à ce stade doivent être insérées dans la table temporaire bak. Bien entendu, toutes les données de la table cible doivent être effacées avant d'insérer des données dans la table cible. La table bak à ce moment est les données "hier" de la prochaine sauvegarde complète.

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

Afficher les données de la table de cuisson.

Insérez la description de l'image ici

8. La dernière étape de la deuxième sauvegarde complète est ici, qui consiste à insérer les données nouvellement ajoutées dans la table d'historique et à modifier les données modifiées dans la table d'historique.

//将新增的数据插入历史表
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;

Voir les données de sa table

Insérez la description de l'image ici

//将修改的数据在历史表中修改
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';

Voir les données de sa table

Insérez la description de l'image ici

Sauvegardez avec succès les données nouvellement ajoutées ou modifiées dans la table d'historique.

2. Ensuite, démarrez la troisième sauvegarde complète.

1. Regardons d'abord les données commerciales de 2008-01, qui sont les données commerciales d'hier.

Insérez la description de l'image ici

Maintenant, nous supposons que les informations utilisateur avec userid 1 sont changées en usdate = 3, et les informations utilisateur avec userid 4 sont changées en 8.

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

Affichez les données d'entreprise pour «aujourd'hui».

Insérez la description de l'image ici

2. Dans la deuxième sauvegarde complète, il montre que les données de la table temporaire bak sont les données "hier" lors de la troisième sauvegarde complète. Ici, nous pouvons le vérifier à nouveau.

Insérez la description de l'image ici

Ensuite, nous vidons les données de l'ancienne table et insérons les données de «hier» dans l'ancienne table, puis videons les données de la nouvelle table et insérons le champ d'heure des données commerciales d'aujourd'hui dans la nouvelle table.

//清空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 ;

Insérez la description de l'image ici

Insérez la description de l'image ici

3. N'oubliez pas de vider les données de la table bak et d'insérer les nouvelles données de la table dans la table bak, laissez la table bak enregistrer les données "hier" de la prochaine sauvegarde complète. Les nouvelles données et les données modifiées sont à nouveau calculées par l'algorithme de fermeture à glissière temporelle.

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

Insérez la description de l'image ici

Afficher les données nouvellement ajoutées

//查看新增的数据
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;

Insérez la description de l'image ici

Afficher les données modifiées

//查看修改的数据
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;

[Le transfert de l'image du lien externe a échoué, le site source peut avoir un mécanisme de lien anti-sangsue, il est recommandé de sauvegarder l'image et de la télécharger directement (img-PKP05hJ2-1603707069462) (/ img / 时间 zip017.png)]

4. Insérez les nouvelles données dans la table d'historique et modifiez les données modifiées dans la table d'historique.

//将新增的数据插入历史表
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;

Insérez la description de l'image ici

//将修改的数据在历史表中修改
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';

Insérez la description de l'image ici

La troisième sauvegarde complète a réussi.

Je suppose que tu aimes

Origine blog.csdn.net/wankao/article/details/109295235
conseillé
Classement