模擬利用MV進行資料遷移
物化檢視[@more@]利用MV的資料遷移最大的特點是比較靈活,可以實現跨平臺,跨資料庫版本遷移,而且能夠實現資料的重組最佳化。該方式的實現原理要求在源表物件有一個主鍵,用於MV重新整理。在源表上建立MV日誌,再在目標資料庫建立結構一樣的表,然後在目標資料庫上採用prebuilt方式建立MV,第一次採用完全重新整理,然後一直採用增量重新整理,等到要切換的時候,只要重新整理增量的日誌,刪除MV,保留目標表即可。
--建立源表
SQL> create table from_table(id number,num number);
Table created.
--新增主鍵
SQL> alter table from_table add constraint pk_from primary key(id);
Table altered.
--建立目標表
。然後在該表上建立主鍵或者非空的唯一約束。
SQL> create table to_table(id number,num number);
Table created.
SQL> alter table to_table add constraint pk_to primary key(id);
Table altered.
SQL> insert into from_table select rownum,rownum*100 from dba_objects where rownum <=10;
10 rows created.
SQL> commit;
Commit complete.
--在源表建立MV日誌
SQL> create materialized view log on from_table;
Materialized view log created.
--在目標表上採用prebuilt方式建立MV
SQL> create materialized view to_table on prebuilt table refresh fast as select * from from_table;
Materialized view created.
SQL> select count(*) from to_table;
COUNT(*)
----------
0
--執行完全重新整理
SQL> exec dbms_mview.refresh('TO_TABLE',method =>'Complete');
PL/SQL procedure successfully completed.
SQL> select count(*) from to_table;
COUNT(*)
----------
10
--執行一次增量重新整理。增量重新整理之前一定要保證源表和目標表上都存在主鍵,否則無法完成增量重新整理
SQL> exec dbms_mview.refresh('TO_TABLE');
PL/SQL procedure successfully completed.
SQL> select * from to_table;
ID NUM
---------- ----------
1 100
2 200
3 300
4 400
5 500
6 600
7 700
8 800
9 900
10 1000
10 rows selected.
--建立自動重新整理的作業,每30秒同步一次增量日誌。
SQL> @create_program
附:cat create_program.sql
begin
dbms_scheduler.create_program
(
program_name =>'refresh_to_table',
program_type =>'PLSQL_BLOCK',
program_action =>'begin dbms_mview.refresh(''TO_TABLE'');end;',
enabled =>TRUE
);
end;
/
PL/SQL procedure successfully completed.
SQL> @create_scheduler
附:cat create_scheduler.sql
begin
dbms_scheduler.create_schedule
(
schedule_name =>'every_30_seconds',
start_date =>systimestamp,
repeat_interval =>'FREQ=SECONDLY;INTERVAL=30'
);
end;
/
PL/SQL procedure successfully completed.
SQL> @create_job
附:cat create_job.sql
begin
dbms_scheduler.create_job
(
job_name =>'secondly_refresh',
program_name =>'refresh_to_table',
schedule_name =>'every_30_seconds',
enabled =>TRUE
);
end;
/
PL/SQL procedure successfully completed.
--執行作業
SQL> exec dbms_scheduler.run_job('secondly_refresh');
PL/SQL procedure successfully completed.
--對源表繼續操作
SQL> insert into from_table values (11,1);
1 row created.
SQL> commit;
Commit complete.
SQL> select count(*) from to_table;
COUNT(*)
----------
11
SQL> insert into from_table select rownum+11,rownum*1000 from dba_objects where rownum <=9;
9 rows created.
SQL> commit;
Commit complete.
SQL> select count(*) from to_table;
COUNT(*)
----------
20
SQL> select * from to_table;
ID NUM
---------- ----------
1 100
2 200
3 300
4 400
5 500
6 600
7 700
8 800
9 900
10 1000
11 1
ID NUM
---------- ----------
13 2000
14 3000
20 9000
17 6000
18 7000
12 1000
15 4000
16 5000
19 8000
20 rows selected.
SQL> update from_table set num = 1500 where id = 11;
1 row updated.
SQL> commit;
Commit complete.
SQL> select * from to_table;
ID NUM
---------- ----------
1 100
2 200
3 300
4 400
5 500
6 600
7 700
8 800
9 900
10 1000
11 1500
ID NUM
---------- ----------
13 2000
14 3000
20 9000
17 6000
18 7000
12 1000
15 4000
16 5000
19 8000
20 rows selected.
SQL> exec dbms_scheduler.drop_job('secondly_refresh');
PL/SQL procedure successfully completed.
SQL> delete from to_table where rownum = 1;
delete from to_table where rownum = 1
*
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view
--等重新整理完成,刪除MV log與MV。在目標資料庫上,刪除MV後,表和資料仍然存在
SQL> drop materialized view to_table;
Materialized view dropped.
SQL> drop materialized view log on from_table;
Materialized view log dropped.
SQL> select * from to_table;
ID NUM
---------- ----------
1 100
2 200
3 300
4 400
5 500
6 600
7 700
8 800
9 900
10 1000
11 1500
ID NUM
---------- ----------
13 2000
14 3000
20 9000
17 6000
18 7000
12 1000
15 4000
16 5000
19 8000
20 rows selected.
--最後建立與表有依賴關係的物件
--建立源表
SQL> create table from_table(id number,num number);
Table created.
--新增主鍵
SQL> alter table from_table add constraint pk_from primary key(id);
Table altered.
--建立目標表
。然後在該表上建立主鍵或者非空的唯一約束。
SQL> create table to_table(id number,num number);
Table created.
SQL> alter table to_table add constraint pk_to primary key(id);
Table altered.
SQL> insert into from_table select rownum,rownum*100 from dba_objects where rownum <=10;
10 rows created.
SQL> commit;
Commit complete.
--在源表建立MV日誌
SQL> create materialized view log on from_table;
Materialized view log created.
--在目標表上採用prebuilt方式建立MV
SQL> create materialized view to_table on prebuilt table refresh fast as select * from from_table;
Materialized view created.
SQL> select count(*) from to_table;
COUNT(*)
----------
0
--執行完全重新整理
SQL> exec dbms_mview.refresh('TO_TABLE',method =>'Complete');
PL/SQL procedure successfully completed.
SQL> select count(*) from to_table;
COUNT(*)
----------
10
--執行一次增量重新整理。增量重新整理之前一定要保證源表和目標表上都存在主鍵,否則無法完成增量重新整理
SQL> exec dbms_mview.refresh('TO_TABLE');
PL/SQL procedure successfully completed.
SQL> select * from to_table;
ID NUM
---------- ----------
1 100
2 200
3 300
4 400
5 500
6 600
7 700
8 800
9 900
10 1000
10 rows selected.
--建立自動重新整理的作業,每30秒同步一次增量日誌。
SQL> @create_program
附:cat create_program.sql
begin
dbms_scheduler.create_program
(
program_name =>'refresh_to_table',
program_type =>'PLSQL_BLOCK',
program_action =>'begin dbms_mview.refresh(''TO_TABLE'');end;',
enabled =>TRUE
);
end;
/
PL/SQL procedure successfully completed.
SQL> @create_scheduler
附:cat create_scheduler.sql
begin
dbms_scheduler.create_schedule
(
schedule_name =>'every_30_seconds',
start_date =>systimestamp,
repeat_interval =>'FREQ=SECONDLY;INTERVAL=30'
);
end;
/
PL/SQL procedure successfully completed.
SQL> @create_job
附:cat create_job.sql
begin
dbms_scheduler.create_job
(
job_name =>'secondly_refresh',
program_name =>'refresh_to_table',
schedule_name =>'every_30_seconds',
enabled =>TRUE
);
end;
/
PL/SQL procedure successfully completed.
--執行作業
SQL> exec dbms_scheduler.run_job('secondly_refresh');
PL/SQL procedure successfully completed.
--對源表繼續操作
SQL> insert into from_table values (11,1);
1 row created.
SQL> commit;
Commit complete.
SQL> select count(*) from to_table;
COUNT(*)
----------
11
SQL> insert into from_table select rownum+11,rownum*1000 from dba_objects where rownum <=9;
9 rows created.
SQL> commit;
Commit complete.
SQL> select count(*) from to_table;
COUNT(*)
----------
20
SQL> select * from to_table;
ID NUM
---------- ----------
1 100
2 200
3 300
4 400
5 500
6 600
7 700
8 800
9 900
10 1000
11 1
ID NUM
---------- ----------
13 2000
14 3000
20 9000
17 6000
18 7000
12 1000
15 4000
16 5000
19 8000
20 rows selected.
SQL> update from_table set num = 1500 where id = 11;
1 row updated.
SQL> commit;
Commit complete.
SQL> select * from to_table;
ID NUM
---------- ----------
1 100
2 200
3 300
4 400
5 500
6 600
7 700
8 800
9 900
10 1000
11 1500
ID NUM
---------- ----------
13 2000
14 3000
20 9000
17 6000
18 7000
12 1000
15 4000
16 5000
19 8000
20 rows selected.
SQL> exec dbms_scheduler.drop_job('secondly_refresh');
PL/SQL procedure successfully completed.
SQL> delete from to_table where rownum = 1;
delete from to_table where rownum = 1
*
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view
--等重新整理完成,刪除MV log與MV。在目標資料庫上,刪除MV後,表和資料仍然存在
SQL> drop materialized view to_table;
Materialized view dropped.
SQL> drop materialized view log on from_table;
Materialized view log dropped.
SQL> select * from to_table;
ID NUM
---------- ----------
1 100
2 200
3 300
4 400
5 500
6 600
7 700
8 800
9 900
10 1000
11 1500
ID NUM
---------- ----------
13 2000
14 3000
20 9000
17 6000
18 7000
12 1000
15 4000
16 5000
19 8000
20 rows selected.
--最後建立與表有依賴關係的物件
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11676357/viewspace-1052297/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用prebuild mv 方法遷移資料Rebuild
- 模擬Oracle行遷移和行連結Oracle
- 使用RMAN進行資料遷移
- 今天晚上進行資料遷移
- 一次利用mv線上遷移資料、切換系統的過程
- 利用RMAN Convert database特性進行跨平臺遷移資料Database
- 用python進行資料庫資料遷移Python資料庫
- 使用RMAN進行Oracle資料庫遷移Oracle資料庫
- rman進行跨平臺資料遷移
- Oracle 利用RMAN 完成資料遷移Oracle
- koa,koa-router進行資料模擬
- 使用KepServerEx進行資料模擬Server
- 利用sqlldr工具進行資料遷移時發現的問題解決方法SQL
- 海量資料處理_使用外部表進行資料遷移
- 利用MV+EXP+TRIGGER動態遷移資料庫碰到的一些問題資料庫
- 使用dbeaver 用csv 檔案進行資料遷移
- 【概念】行連結和行遷移的概念、模擬及甄別
- Azure Storage 利用 azCopy 複製遷移資料
- 利用RMAN跨平臺遷移資料庫資料庫
- 按使用者進行資料庫邏輯遷移資料庫
- Long型別的資料,利用COPY命令遷移型別
- Oracle進行模擬測試資料的一個例子Oracle
- 一個利用傳輸表空間和分割槽交換技術進行資料遷移的案例
- 利用WebClient進行資料抓取Webclient
- 遷移資料.
- 利用offline datafile檔案方式遷移資料
- 【遷移】使用rman遷移資料庫資料庫
- 使用impdp,expdp資料泵進入海量資料遷移
- Oracle Expdp/Impdp 進行資料遷移的 幾點注意事項Oracle
- 應用RMAN Transportable Database進行資料庫跨平臺遷移Database資料庫
- 模擬11G單例項到12C的資料遷移過程單例
- 使用資料庫冷備份方式進行資料庫遷移,資料庫檔案遷移到不同的目錄資料庫
- 【Redis 技術探索】「資料遷移實戰」手把手教你如何實現線上 + 離線模式進行遷移 Redis 資料實戰指南(scan模式遷移)Redis模式
- 資料庫上雲實踐:使用Ora2pg進行資料庫遷移資料庫
- oracle11g_如何模擬產生行連結或行遷移chained_rowsOracleAI
- Oracle資料庫中資料行遷移與行連結Oracle資料庫
- 【資料遷移】使用傳輸表空間遷移資料
- 利用Easy Mock簡單模擬開發資料介面Mock