一 當有數據文件被誤刪除時如何恢復
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
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
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;
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;
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;
三 外部表
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
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;
到此我們的外部表方式數據遷移完成。