在兩個資料庫之間進行資料同步
OLAP的第一步就是從業務系統中抽取資料到資料倉儲系統。
除了ETL工具Kettle,也可以使用PL/SQL
建立Source表,模擬業務系統的資料表。
create table source as select sys_guid() id ,o.* from dba_objects o where rownum<1000;
alter table source add constraint PK_source primary key (id);
建立Target表,模擬資料倉儲中的表。
create table target as select * from source where 1=0;
alter table target add constraint PK_target primary key (id);
建立DB LINK,remote模擬業務系統的資料庫
create database link remote connect to username identified by xxxxxx using 'remote';
因為業務系統的資料是變化的,相較於資料倉儲的表,他可能更新了一些資料,也可能修改了一些資料。
比對業務表和資料倉儲表的資料,
如果ID相同,並且資料有變化
則根據ID更新資料倉儲的表(target)
如果業務系統的資料ID(source),還沒有出現在資料倉儲的表中(target)
則在資料倉儲的表中新增這個記錄。
本質都是Oracle Merge的功能,只不過嘗試另外幾種方法。
1.merge
2.全域性臨時表。
首先將遠端業務系統的資料放入臨時表,
然後根據ID更新資料,如果資料的內容沒有變化,則不更新。
最後插入業務系統中新建的資料。
3.集合處理
為了簡單,沒有進行內容變化的判斷
4.內聯檢視更新
沒有寫更新後插入的步驟,插入的實現是相同的。
5.Minus
先插入業務表中新增的記錄,然後對比修改。
除了ETL工具Kettle,也可以使用PL/SQL
建立Source表,模擬業務系統的資料表。
create table source as select sys_guid() id ,o.* from dba_objects o where rownum<1000;
alter table source add constraint PK_source primary key (id);
建立Target表,模擬資料倉儲中的表。
create table target as select * from source where 1=0;
alter table target add constraint PK_target primary key (id);
建立DB LINK,remote模擬業務系統的資料庫
create database link remote connect to username identified by xxxxxx using 'remote';
因為業務系統的資料是變化的,相較於資料倉儲的表,他可能更新了一些資料,也可能修改了一些資料。
比對業務表和資料倉儲表的資料,
如果ID相同,並且資料有變化
則根據ID更新資料倉儲的表(target)
如果業務系統的資料ID(source),還沒有出現在資料倉儲的表中(target)
則在資料倉儲的表中新增這個記錄。
本質都是Oracle Merge的功能,只不過嘗試另外幾種方法。
1.merge
-
merge into target t using (select * from source@remote) s
-
on(t.id=s.id)
-
when matched
-
then
-
update set t.owner=s.owner,
-
t.object_name=s.object_name,
-
t.subobject_name=s.subobject_name,
-
t.object_id=s.object_id,
-
t.data_object_id=s.data_object_id,
-
t.object_type=s.object_type,
-
t.created=s.created,
-
t.last_ddl_time=s.last_ddl_time,
-
t.timestamp=s.timestamp,
-
t.status=s.status,
-
t.temporary=s.temporary,
-
t.generated=s.generated,
-
t.secondary=s.secondary,
-
t.namespace=s.namespace,
-
t.edition_name=s.edition_name
-
when not matched
-
then
-
insert values
-
(
-
s.id,
-
s.owner,
-
s.object_name,
-
s.subobject_name,
-
s.object_id,
-
s.data_object_id,
-
s.object_type,
-
s.created,
-
s.last_ddl_time,
-
s.timestamp,
-
s.status,
-
s.temporary,
-
s.generated,
-
s.secondary,
-
s.namespace,
-
s.edition_name
- );
首先將遠端業務系統的資料放入臨時表,
然後根據ID更新資料,如果資料的內容沒有變化,則不更新。
最後插入業務系統中新建的資料。
-
create global temporary table tmp
-
on commit preserve rows
-
as
-
select * from target where 1=0;
-
-
insert into tmp select * from source@remote;
-
-
update target t set
-
(
-
t.owner,
-
t.object_name,
-
t.subobject_name,
-
t.object_id,
-
t.data_object_id,
-
t.object_type,
-
t.created,
-
t.last_ddl_time,
-
t.timestamp,
-
t.status,
-
t.temporary,
-
t.generated,
-
t.secondary,
-
t.namespace,
-
t.edition_name
-
)
-
=
-
(select
-
tmp.owner,
-
tmp.object_name,
-
tmp.subobject_name,
-
tmp.object_id,
-
tmp.data_object_id,
-
tmp.object_type,
-
tmp.created,
-
tmp.last_ddl_time,
-
tmp.timestamp,
-
tmp.status,
-
tmp.temporary,
-
tmp.generated,
-
tmp.secondary,
-
tmp.namespace,
-
tmp.edition_name
-
from tmp where t.id=tmp.id)
-
where exists(
-
select * from tmp where tmp.id=t.id and not (
-
tmp.owner=t.owner and
-
tmp.object_name=t.object_name and
-
tmp.subobject_name=t.subobject_name and
-
tmp.object_id=t.object_id and
-
tmp.data_object_id=t.data_object_id and
-
tmp.object_type=t.object_type and
-
tmp.created=t.created and
-
tmp.last_ddl_time=t.last_ddl_time and
-
tmp.timestamp=t.timestamp and
-
tmp.status=t.status and
-
tmp.temporary=t.temporary and
-
tmp.generated=t.generated and
-
tmp.secondary=t.secondary and
-
tmp.namespace=t.namespace and
-
tmp.edition_name=t.edition_name
-
)
-
);
-
-
insert into target
-
select * from tmp where not exists(
- select * from target t where t.id=tmp.id);
為了簡單,沒有進行內容變化的判斷
-
declare
-
type tab is table of target%rowtype;
-
l_row tab;
-
cursor cur is select * from source@remote;
-
begin
-
open cur;
-
fetch cur bulk collect into l_row;
-
close cur;
-
forall i in 1..l_row.count
-
update target set row=l_row(i) where id=l_row(i).id;
-
insert into target select * from source@remote s
-
where not exists (select * from target t where t.id=s.id);
-
commit;
-
end;
- /
沒有寫更新後插入的步驟,插入的實現是相同的。
-
update(
-
select
-
s.id s1,
-
s.owner s2,
-
s.object_name s3,
-
s.subobject_name s4,
-
s.object_id s5,
-
s.data_object_id s6,
-
s.object_type s7,
-
s.created s8,
-
s.last_ddl_time s9,
-
s.timestamp s10,
-
s.status s11,
-
s.temporary s12,
-
s.generated s13,
-
s.secondary s14,
-
s.namespace s15,
-
s.edition_name s16,
-
t.id t1,
-
t.owner t2,
-
t.object_name t3,
-
t.subobject_name t4,
-
t.object_id t5,
-
t.data_object_id t6,
-
t.object_type t7,
-
t.created t8,
-
t.last_ddl_time t9,
-
t.timestamp t10,
-
t.status t11,
-
t.temporary t12,
-
t.generated t13,
-
t.secondary t14,
-
t.namespace t15,
-
t.edition_name t16
-
from target t inner join source@remote s on(s.id=t.id)
-
where
-
not
-
(
-
s.owner=t.owner and
-
s.object_name=t.object_name and
-
s.subobject_name=t.subobject_name and
-
s.object_id=t.object_id and
-
s.data_object_id=t.data_object_id and
-
s.object_type=t.object_type and
-
s.created=t.created and
-
s.last_ddl_time=t.last_ddl_time and
-
s.timestamp=t.timestamp and
-
s.status=t.status and
-
s.temporary=t.temporary and
-
s.generated=t.generated and
-
s.secondary=t.secondary and
-
s.namespace=t.namespace and
-
s.edition_name=t.edition_name
-
)
-
)
-
set
-
t1=s1,
-
t2=s2,
-
t3=s3,
-
t4=s4,
-
t5=s5,
-
t6=s6,
-
t7=s7,
-
t8=s8,
-
t9=s9,
-
t10=s10,
-
t11=s11,
-
t12=s12,
-
t13=s13,
-
t14=s14,
-
t15=s15,
-
t16=s16
- ;
先插入業務表中新增的記錄,然後對比修改。
-
declare
-
type tab is table of target%rowtype;
-
l_row tab;
-
cursor cur is select * from source@remote minus select * from target;
-
begin
-
insert into target select * from source@remote s
-
where not exists (select * from target t where t.id=s.id);
-
open cur;
-
fetch cur bulk cllect into l_row;
-
close cur;
-
forall i in 1..l_row.count
-
update target set row=low(i) where id=l_row(i).id;
-
commit;
-
end;
- /
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-777461/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 同步寫兩個資料庫資料庫
- 同步寫兩個資料庫--多執行緒資料庫執行緒
- 不同Oracle資料庫之間的資料同步Oracle資料庫
- 自動同步整個 MySQL/Oracle 資料庫以進行資料分析MySqlOracle資料庫
- ElasticSearch + Logstash進行資料庫同步Elasticsearch資料庫
- 不同字符集資料庫之間的資料同步問題:資料庫
- 資料庫學習:透過作業定時同步兩個資料庫(轉)資料庫
- 查詢兩個日期之間的資料
- 在資料庫之間移動表空間資料庫
- 不同字符集資料庫之間的資料同步問題-補資料庫
- 使用物化檢視實現在不同字符集的資料庫之間的資料同步資料庫
- 透過作業定時同步兩個資料庫資料庫
- Sqoop解決關係型資料庫與HDFS之間進行資料轉換OOP資料庫
- 解決兩相同資料庫資料同步的問題 (轉)資料庫
- Oracle兩表之間資料更新Oracle
- 利用Kettle進行資料同步(下)
- 利用Kettle進行資料同步(上)
- rac 建立兩個資料庫資料庫
- sql取兩個值之間的資料方法(轉)SQL
- 如何使用 Eloquent 在兩個日期之間進行查詢?
- 基於DataX的資料同步(下)-應用DataX進行資料同步
- 異構資料庫之間資料作業資料庫
- 資料庫中兩表之間相互更新的語法資料庫
- 資料庫同步資料庫
- 在一個資料庫中模擬兩個資料庫(每個資料庫中使用者都建立表的同義詞)資料庫
- SpringBoot整合Canal進行資料庫 快取同步Spring Boot資料庫快取
- 自動檢測兩個資料庫之間物件的儲存過程資料庫物件儲存過程
- 資料庫複製方式進行資料庫恢復資料庫
- [譯] 在 Laravel 應用程式之間共享資料庫Laravel資料庫
- Mysql資料庫單向同步(一主兩從)MySql資料庫
- DataX將MySql資料庫資料同步到Oracle資料庫MySql資料庫Oracle
- 在不同字符集的資料庫之間匯入資料的方法(轉)資料庫
- 用python進行資料庫資料遷移Python資料庫
- 資料庫同步方案資料庫
- DataX將Oracle資料庫資料同步到達夢資料庫Oracle資料庫
- 在SAP WebClient UI裡使用AJAX進行非同步資料讀取WebclientUI非同步
- OGG實現兩臺oracle資料庫的同步Oracle資料庫
- 只有.dbf資料檔案進行資料庫恢復資料庫