データウェアハウス001-タイムジッパーの完全バックアップ

mysqlのデモ

mysqlデモ時間でのジッパーの完全バックアップ:

1.1番目と2番目の完全バックアップを示します。

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を使用してビジネステーブルのデータを抽出し、2つのフィールド情報(開始時間と

終了時間)、次にbakはすべてのデータを履歴テーブルに直接挿入します。

//开始时间的业务数据的当天,这里我们假设时间为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.最初の完全バックアップ後のデータを表示します

ここに写真の説明を挿入

フルバックアップかインクリメンタルバックアップかに関係なく、最初のバックアップは時間情報を追加した後にすべてのビジネスデータを履歴テーブルに挿入することであり、次の2番目のフルバックアップが焦点になります。

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;

改訂されたビジネステーブルのデータは次のとおりです。

ここに写真の説明を挿入

重要なのは、「昨日」のデータと「今日」のデータを比較することです。

5.最初の完全バックアップが作成されたとき、一時テーブルbakには、「昨日」のビジネスデータと時刻情報がすでに格納されています。したがって、bakテーブルのデータをold_tempテーブルに挿入し、「今日」のビジネスデータをtimeフィールドを追加して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 ;

この時点で、新しいテーブルと古いテーブルのデータを別々に確認できます。最初に古いテーブルのデータを確認します。

ここに写真の説明を挿入

新しいテーブルのデータを確認してください。

ここに写真の説明を挿入

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のデータを古いテーブルに挿入し、ビジネステーブルが新しいテーブルにフィールドを追加するというコアステップがあります。このステップの後、この時点での新しいテーブルの情報を一時テーブルbakに挿入する必要があります。もちろん、ターゲットテーブルにデータを挿入する前に、ターゲットテーブル内のすべてのデータをクリアする必要があります。この時点でのbakテーブルは、次の完全バックアップの「昨日」のデータです。

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

bakテーブルデータを表示します。

ここに写真の説明を挿入

8. 2番目の完全バックアップの最後のステップはここにあります。これは、新しく追加されたデータを履歴テーブルに挿入し、変更されたデータを履歴テーブルで変更することです。

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

彼のテーブルのデータを見る

ここに写真の説明を挿入

新しく追加または変更されたデータを履歴テーブルに正常にバックアップします。

2.次に、3番目の完全バックアップを開始します。

1.まず、「昨日」のビジネスデータである2008-01年のビジネスデータを見てみましょう。

ここに写真の説明を挿入

ここで、ユーザーID1のユーザー情報がusdate = 3に変更され、ユーザーID4のユーザー情報が8に変更されたと仮定します。

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

「今日」のビジネスデータを表示します。

ここに写真の説明を挿入

2. 2回目の完全バックアップでは、一時テーブルbakのデータが3回目の完全バックアップの「昨日」のデータであることが示されています。ここで再度確認できます。

ここに写真の説明を挿入

次に、古いテーブルのデータを空にして「昨日」のデータを古いテーブルに挿入し、次に新しいテーブルのデータを空にして、今日のビジネスデータの時間フィールドを新しいテーブルに挿入します。

//清空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テーブルデータを空にして、新しいテーブルデータを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 /時間zip017.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';

ここに写真の説明を挿入

3番目の完全バックアップは成功しました。

おすすめ

転載: blog.csdn.net/wankao/article/details/109295235