10gocm->session4->數據倉庫


一 當有數據文件被誤刪除時如何恢復

RMAN規劃
host target庫 catalog庫
ocm01 ocmdb  
ocm02   ocmdb02

模擬ocmdb庫system01.dbf 數據文件丟失,利用catalogue庫omcdb02進行RMAN恢復。



構造場景
shutdown immediate
rm -f /u01/oracle/oradata/ocmdb/disk1/system01.dbf 
sqlplus / as sysdba
startup
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/u01/oracle/oradata/ocmdb/disk1/system01.dbf'
alert日誌中同樣記錄了報錯信息(現在數據庫處於異常關閉狀態),從告警日誌中就可以知道是system文件沒有了 --alert日誌位置:/u01/oracle/admin/ocmdb/bdump/alert_ocmdb.log
將數據庫啓動到mount狀態,才能restore  and  recover 恢復
shutdown abort
startup mount
exit
登錄RMAN
rman target sys/sys@ocmdb1521 catalog catalog_admin/catalog_admin@ocmdb021521
用原來的RMAN備份來還原和恢復
restore datafile 1;
recover datafile 1;
alter database open;
select file_name,tablespace_name,status from dba_data_files where tablespace_name='SYSTEM';


二 物化視圖


物化視圖規劃
host 基表&日誌 物化視圖 dblink
ocm01   mv_t  dblink_to_ocm02
ocm02 t_mv_ocm02,MLOG$_T_MV_OCM02    

物化視圖:執行sql並保留結果,直接放在數據文件中,不放在內存中方便重用【空間換時間】
場合:同步數據,過濾數據並兩次利用


1.要求創建跨庫物化視圖並可手動更新
官方文檔:PL/SQL Packages and Types Reference -> 61 DBMS_MVIEW
基表和物化視圖不在同一個庫上,基表和日誌在ocm02上,物化視圖在ocm01上,在ocm01上可手動刷新物化視圖

ocm02


create user mv_ocm02 identified by mv_ocm02 ;
grant connect,resource to mv_ocm02 ;
conn mv_ocm02 /mv_ocm02 
create table t_mv_ocm02(a varchar2(10));           
insert into t values ('test01');
commit;

select * from t_mv_ocm02;


創建物化視圖日誌,基表在哪個庫,日誌就在哪個庫,用於記錄基表所有變化,實時刷新物化視圖,完全刷新不需要物化視圖日誌,快速刷新需要物化視圖日誌

create materialized view log on t with rowid;   基於rowid變化記錄到日誌中 --創建MLOG$_T_MV_OCM02對象


ocm01


創建dblink
sqlplus / as sysdba@ocmdb
create public database link dblink_to_ocm02 connect to mv_ocm02 identified by mv_ocm02 using 'ocmdb021521';  
注:global_names參數爲FALSE  才允許DB link名字與我遠程連接實例名不一致
create user mv_ocm01 identified by mv_ocm01 ;
grant dba to mv_ocm01 ;
conn mv_ocm01 /mv_ocm01 
創建跨庫可刷新物化視圖

create materialized view mv_t refresh fast with rowid as select * from t_mv_ocm02@dblink_to_ocm02;   


sqlplus mv_ocm02 /mv_ocm02 @ocmdb021521
insert into t values ('test02');
commit;
select * from t_mv_ocm02;
sqlplus mv_ocm01 /mv_ocm01 @ocmdb

select * from mv_t;


快速刷新方法:增量刷新 或 完全刷新方法:全表刷新
exec dbms_mview.refresh('mv_t','f');      手動刷新物化視圖
exec dbms_mview.refresh('mv_t','c');

select * from mv_t;


2.要求創建物化視圖具有自動快速刷新功能
sqlplus mv_ocm01 /mv_ocm01 @ocmdb
注:grant connect,resource,create materialized view to mv_ocm01 ; 如果是普通用戶需要授予創建物化視圖權限 
drop table t1 purge;
create table t1 (x int,y int,z int);  
insert into t1 values (1,2,3);
insert into t1 values (4,5,6);
commit;
select * from t1;
create materialized view log on t1 with sequence,rowid (x,y,z) including new values;
我們只看x和y列信息
drop materialized view mv_t1;
create materialized view mv_t1 build immediate refresh with rowid fast on commit enable query rewrite as select x,y from t1;
參數說明:
build immediate:創建物化視圖時,立即刷新基表
fast on commit:支持基於commit動作的自動刷新
enable query rewrite:啓動查詢重寫功能
refresh with rowid:物化視圖默認是基於主鍵PK方式來刷新的,由於基表沒有主鍵,因此我們基於ROWID刷新
select * from mv_t1;
驗證物化視圖是否隨記錄增加而更新  
insert into t1 values (7,8,9);
select * from t1;
select * from mv_t1;            mv_t1隨記錄增加而木有刷新,必須commit之後才觸發物化視圖刷新
commit; 
select * from mv_t1;
delete from t1 where x=1;
select * from t1;
commit;
select * from mv_t1;


三 外部表


官方文檔:Administrator’s Guide -> 15 Managing Tables -> Managing External Tables
Utilities->Part III External Tables –> 14 The ORACLE_DATAPUMP Access Driver
外部表:把數據保存在操作系統層面上,並不保存在表空間上,即可以把數據寫入外部表又可以讀取外部表到數據庫(只讀到內存裏)。外部表就是操作系統上的一個二進制文件不是純文本文件。可用strings查看

場合:導出的數據可用於二次開發。數據遷移

要求使用oracle數據泵導出外部表並跨庫加載
過程:ocm01卸載數據,傳輸到ocm02加載數據

外部表實驗規劃
步驟 ocm01 ocm02 說明
1 創建dir_dmp    位置:ocm01:/home/oracle
2 導出t2_part1.dat,t2_part2.dat到dir_dmp    
3   創建dir_dmp  位置:ocm02:/home/oracle
4   拷貝t2_part1.dat,t2_part2.dat到dir_dmp scp把文件從ocm01拷貝到ocm02
5   加載到數據庫  


創建directory
sqlplus / as sysdba@ocmdb
create user ext identified by ext;
grant dba to ext;
conn ext/ext
create directory dir_dmp as '/home/oracle';
grant read,write on directory dir_dmp to public; 授予讀/寫權限給目錄對象,把目錄對象給所有用戶
創建外部表,使用數據泵工具卸載數據,使用2個cup並行卸載,加快速度
create table t2                   
organization external
(type oracle_datapump                
default directory dir_dmp               
location ('t2_part1.dat','t2_part2.dat') 
)
parallel 2                      
as               
select owner,object_id,object_name from dba_objects where owner='SYSTEM';
strings命令可以讀取卸載得到的二進制文件內容

strings  t2_part1.dat


在ocm02創建外部表t3讀取t2_part1.dat和t2_part2.dat
scp t2_part1.dat t2_part2.dat ocm02:/home/oracle
sqlplus / as sysdba@ocmdb02
create user ext identified by ext;
grant dba to ext;
conn ext/ext
create directory dir_dmp as '/home/oracle';
grant read,write on directory dir_dmp to public; 
加載數據到t3
create table t3 (owner varchar2(100),object_id varchar2(100),object_name varchar2(100))   
organization external                  
(type oracle_datapump               
default directory dir_dmp         
location ('t2_part1.dat','t2_part2.dat'));  
select count(*) from t3;
到此我們的外部表方式數據遷移完成。











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章