1、徹底恢復
控制文件,數據文件,表空間丟失,且是物理上的丟失sql
2、不徹底恢復
聯機日誌,表空間丟失使用居於時間點的不徹底恢復
3、克隆技術
數據庫是7*24小時運行,drop table,drop user
4、閃回技術
誤dml操做數據庫
數據庫發生結構上的丟失,丟表空間,數據文件,控制文件丟失,參數文件丟失,可將數據庫恢復到誤操做最近的時刻點
不適用與7*24小時數據庫,由於須要當機
1.參數文件丟失
在rman中能夠在沒有參數文件的狀態下,啓動到nomount狀態
rman>>crosscheck backup ; //檢查備份是否可用
rman>>list backup of spfile; //不能查找到spfile的路徑,咱們只能在物理位置上找到
rman>>restore spfile from '/備份參數文件的路徑' ;//還原參數文件
rman>>startup force nomount;
rman>>sql 'alter database mount';
rman>>alter database open ;
能夠將上面的恢復步驟寫到一個run裏面vim
run { restore spfile from '/'; startup foece nomount ; sql 'alter database mount '; sql 'alter database open '; }
2.控制文件丟失
rman>>startup nomount;
rman>>restore controlfile from '/';
rman>>alter database mount ;
rman>>alter database open;
也能夠寫入run 當中
若是用alter database open reserlogs 打開了數據庫,必定要再進行備份。
3.數據文件丟失
1)不可離線表空間丟失
只能在mount狀態下恢復
rman>>startup mount
rman>>restore tablespace users ; //使用於數據文件較多的表空間
restore datafile <編號>; //適用於表空間下的數據文件較少的狀況
rman>>recover database ;
rman>>later database open;
2)可離線表空間丟失
在數據庫open:
>>>alter database datafile 4/路徑 offline; //將表空間下的數據文件離線
rman>>restore datafile <>;
rman>>recover datafile <>;
>>>alter database datafile <> online;
在數據庫mount:---能夠與不能離線的表空間同樣的操做
>>>startup mount;
>>>alter database datafile 4 offline immediate;
>>>alter database open;
>>>restore datafile <>;
>>>recover datafile <>;
>>>alter database datafile <> online;
網絡
1.基於時間點不徹底恢復
誤操做模擬:
drop table <>
drop user
drop tablespace test --- 11:00 誤刪---<此間有操做>---14:00發現
a>確認有誤操做以前的備份,在關機以後作數據庫的冷備
b>啓動到nomount ,使用之前的控制文件恢復,使用基於時間點的不玩全恢復,恢復到11點
restore controlfile from '/u01/oracle/fast_recovery_area/MAXDB/backupset/2016'
c> 使用導出的方式將表空間導出,使用冷備份恢復數據庫,再將表空間導入
sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"';//轉化時間格式
set until time '2016-12-13 10:56:46'; //基於時間點的不徹底恢復
restore database ;
recover database ;session
SQL> create tablespace test datafile '/opt/u01/oracle/oradata/maxdb/test01.dbf' size 20m; Tablespace created. SQL> create table test1 tablespace test as select * from dept; SQL> create table test2 tablespace test as select * from emp; [oracle@up12 maxdb]$ rman target / rman>backup database //備份數據庫 [oracle@up12 2016_12_13]$ pwd /opt/u01/oracle/fast_recovery_area/MAXDB/backupset/2016_12_13 /在目錄下會生成相應的備份文件 [oracle@up12 2016_12_13]$ ls o1_mf_ncsnf_TAG20161213T164210_d4zf4o47_.bkp o1_mf_nnndf_TAG20161213T164210_d4zf34kt_.bkp SQL> select group#,member from v$logfile; GROUP# MEMBER ---------- -------------------------------------------------- 4 /opt/u01/oracle/oradata/maxdb/redo04.log 5 /opt/u01/oracle/oradata/maxdb/redo05.log 6 /opt/u01/oracle/oradata/maxdb/redo06.log SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; //記下刪除的時間 TO_CHAR(SYSDATE,'YY ------------------- 2016-12-13 16:50:40 SQL> drop tablespace test including contents and datafiles; Tablespace dropped. 再進行一些相應的dml操做 將咱們的數據庫,控制文件進行冷備份 RMAN> startup nomount restore controlfile from '/opt/u01/oracle/fast_recovery_area/MAXDB/backupset/2016_12_13/o1_mf_ncsnf_TAG20161213T164210_d4zf4o47_.bkp‘ RMAN> startup mount RMAN> run { sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"'; set until time '2016-12-13 14:05:35'; restore database; recover database; } SQL> alter tablespace test read only; [oracle@up12 maxdb]$ exp \'/ as sysdba\' file='/tmp/test33.dump' transport_tablespace=y tablespaces=test; 關閉數據庫 還原咱們剛纔冷備的控制文件和數據文件 打開數據庫 [oracle@up12 maxdb]$ imp \'/ as sysdba \' file='/tmp/test33.dump' tablespaces=test transport_tablespace=y datafile='/opt/u01/oracle/oradata/maxdbbak/test01.dbf'; //這裏的數據文件來自於咱們冷備以後的數據文件 SQL> alter tablespace test read write; 到這一步咱們的數據庫就徹底恢復了
基於scn號的恢復
run{
set until scn 1580608;
restore database;
recover database;
}
基於日誌序號的恢復
run{
set until sequece 2;
restore database;
recover database;
}
drop table <>purge;
drop user <> cascade;
2.數據克隆
解決對user、table、dml的誤操做,還有備庫的搭建
10g:--克隆步驟
1) 目標庫作備份
2)新庫中
a.建立密碼文件,參數文件 (可從目標庫備份過來,或手動建立)
b.準備要存放數據庫的目錄
c.目標庫所作的備份同步到數據庫中,包括歸檔
rsync -avLR -e ssh ip:/ ./ //不能使用拷貝的方式
d.使用備份還原一個數據出來
啓動到nomount ,恢復控制文件,
啓動到mount ,恢復數據文件
alter database open resetlogs ;
11g---在線克隆,但須要配置網絡
兩個數據庫都須要準備密碼文件
duplicate target database <> to <> nofilenamecheck from active database; //支持在線克隆 from active database --徹底克隆
目標庫
1).配置監聽 listener.ora ---放在grid目錄下
vim /opt/u01/11.2.0/grid/network/admin/listener.oraoracle
#listener.ora Network Configuration File: /opt/u01/11.2.0/grid/network/admin/listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = max.com) (ORACLE_HOME = /opt/u01/oracle/11g) (SID_NAME = maxdb) ) (SID_DESC = (GLOBAL_DBNAME = dupdb) (ORACLE_HOME = /opt/u01/oracle/11g) (SID_NAME = dupdb) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = up12.up.com)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) ADR_BASE_LISTENER = /opt/u01/oracle ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON # line added by Agent
2).配置tnsnames.ora ----放在oracle目錄下
vim /opt/u01/oracle/11g/network/admin/tnsnames.orassh
MAXDB = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.153)(PORT = 1521)) ) (CONNECT_DATA = (SERVER=DEDICATED) (SERVICE_NAME = max.com) ) ) DUPDB = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.153)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = dupdb) ) )
3).重啓監聽
. .grid //在grid環境變量下重啓
lsnrctl stop
lsnrctl start
新庫
1).準備參數文件
vim /opt/u01/oracle/11g/dbs/initdupdb.ora工具
control_files='/opt/u01/oracle/oradata/dupdb/control01.ctl','/opt/u01/oracle/fast_recovery_area/dupdb/control02.ctl' db_block_size=8192 db_name='dupdb' db_recovery_file_dest='/opt/u01/oracle/fast_recovery_area' db_recovery_file_dest_size=4g undo_tablespace='UNDOTBS2' //這裏的表空間必須和源庫的表空間位置一致
2).準備密碼文件
cd /u01/oracle/11g/dbs
orapwd file=orapwdupdb password=oracle
3).建立存放數據庫的目錄
mkdir /u01/oracle/oradata/dupdb
mkdir /u01/oracle/fast_recovery_area/dupdb
mkdir /u01/oracle/admin/dupdb/{a,dp}dump -p //建立審計文件
4).配置監聽,tnsname.ora
同目標數據庫一致
tnsping dupdb //檢驗監聽是否啓動
tnsping maxdb
兩個庫都要能夠遠程登陸才能夠用
rlwrap sqlplus sys/oracle@dupdb as sysdba
rlwrap sqlplus sys/oracle@maxdb as sysdba
5).執行在線克隆 ---在線克隆時,兩個庫都是打開的
啓動到nomount狀態
export ORACLE_SID=dupdb
sqlplus / as sysdba
startup nomount
rman target sys/oracle@updb auxiliary sys/oracle@dupdb
spa
rman>>duplicate target database to dupdb nofilenamecheck from active database db_file_name_convert=('/opt/u01/oracle/oradata/maxdb','/opt/u01/oracle/oradata/dupdb') logfile group 1 ('/opt/u01/oracle/oradata/dupdb/redo01.log') size 100m,group 2 ('/opt/u01/oracle/oradata/dupdb/redo02.log') size 100m; //db_file_name_convert 進行文件路徑的轉化
假若是丟告終構的咱們就不可使用可能,只可以使用徹底恢復,或者不徹底恢復
日誌挖掘---logmnr
dbms_logmnr //這個工具主要用來分析日誌文件記錄的數據
SQL> desc dbms_logmnr
1>將日誌傳到logmnr
2>分析日誌
3>釋放內存
日誌分析完後的結果放在v$logmnr_contents
打開附加日誌supplemental,將用戶所作的全部操做都記錄到日誌當中,不作日誌挖掘是不會打開的
附加日誌的分類
supplemental:min //用戶所作的DML操做,全部字段均可以記錄
primary key //記錄用戶對主鍵的操做
unique
foregin key
all //上面的全部信息均可以記錄
開打附加日誌
alter database add supplemental log data all ; //以全部方式打開
alter database add supplemental log data ; //以最小的方式打開 ,工做中通常用這種
alter database add supplemental log data (primary key)columns;
select supplemental_log_data_pk from v$database
關閉附加日誌
alter database drop supplemental log data
exec dbms_logmnr.add_logfile(logfilename=>'/u01/oracle/oradata/maxdb/redo06.log'); //11g纔可使用
exec dbms_logmnr.add_logfile('/u01/oracle/oradata/maxdb/redo06.log');
exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog); //分析日誌
select * from v$logmnr_contents; //查看咱們挖掘的內容
select sql_redo ,sql_undo,scn ,start_scn ,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') timestamp from v$logmgr_contents where table_name='表名' ;//sql_undo 裏記錄的是反操做,sql_redo裏面記錄的是用戶的操做
exec dbms_logmnr.end_logmnr //結束後釋放內存
模擬刪表誤操做,經過基於時間點的方式恢復
先備份數據庫
rest
SQL> alter database add supplemental log data; //打開咱們的最小附加日誌文件 Database altered. SQL> select supplemental_log_data_min from v$database; //查看咱們的附加日誌文件是否打開 SUPPLEME -------- YES 能夠刪表了,咱們刪除的是A10,A11,A12 drop table <>purge ; SQL> select group# ,status,member from v$logfile; GROUP# STATUS MEMBER ---------- ------- ---------------------------------------- 4 /opt/u01/oracle/oradata/maxdb/redo04.log 5 /opt/u01/oracle/oradata/maxdb/redo05.log 6 /opt/u01/oracle/oradata/maxdb/redo06.log SQL> select group# ,status ,members from v$log; //工做中由於不知道當前使用的是哪一個日誌文件,咱們只能加入歸檔日誌分析。查看咱們當前使用的日誌主要是爲節約時間,工做中就一個一個的去找吧 GROUP# STATUS MEMBERS ---------- ---------------- ---------- 4 CURRENT 1 5 INACTIVE 1 6 INACTIVE 1 SQL> exec dbms_logmnr.add_logfile(logfilename=>'/opt/u01/oracle/oradata/maxdb/redo04.log'); //傳入日誌文件 PL/SQL procedure successfully completed. SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog); //進行日誌分析 PL/SQL procedure successfully completed. SQL> select sql_redo ,scn,start_scn,commit_scn from v$logmnr_contents where table_name='A10' ; //找到咱們刪除表的scn號 SQL_REDO -------------------------------------------------------------------------------- SCN START_SCN COMMIT_SCN ---------- ---------- ---------- ALTER TABLE "SCOTT"."A10" RENAME TO "BIN$Q5oqz6hbP6XgU5kBqMCOIw==$0" ; 2022773 drop table A10 AS "BIN$Q5oqz6hbP6XgU5kBqMCOIw==$0" ; 2022775
執行克隆數據庫的準備工做
目標庫 (監聽的庫也能夠用netmgr配置)
1).配置監聽 listener.ora ---放在grid目錄下
vim /opt/u01/11.2.0/grid/network/admin/listener.ora
# listener.ora Network Configuration File: /opt/u01/11.2.0/grid/network/admin/listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = max.com) (ORACLE_HOME = /opt/u01/oracle/11g) (SID_NAME = maxdb) ) (SID_DESC = (GLOBAL_DBNAME = dupdb) (ORACLE_HOME = /opt/u01/oracle/11g) (SID_NAME = dupdb) ) (SID_DESC = (GLOBAL_DBNAME = nupdb) (ORACLE_HOME = /opt/u01/oracle/11g) (SID_NAME = nupdb) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = up12.up.com)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) ADR_BASE_LISTENER = /opt/u01/oracle ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON # line added by Agent
2).配置tnsnames.ora ----放在oracle目錄下
vim /opt/u01/oracle/11g/network/admin/tnsnames.ora
MAXDB = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.153)(PORT = 1521)) ) (CONNECT_DATA = (SERVER=DEDICATED) (SERVICE_NAME = max.com) ) ) DUPDB = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.153)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = dupdb) ) ) NUPDB = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.153)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = nupdb) ) )
3).重啓監聽
. .grid //在grid環境變量下重啓
lsnrctl stop
lsnrctl start
新庫
1).準備參數文件
vim /opt/u01/oracle/11g/dbs/initnupdb.ora
control_files='/opt/u01/oracle/oradata/nupdb/control01.ctl','/opt/u01/oracle/fast_recovery_area/nupdb/control02.ctl' db_block_size=8192 db_name='nupdb' db_recovery_file_dest='/opt/u01/oracle/fast_recovery_area' db_recovery_file_dest_size=4g undo_tablespace='UNDOTBS2'
2).準備密碼文件
cd /u01/oracle/11g/dbs
orapwd file=orapwnupdb password=oracle
3).建立存放數據庫的目錄
mkdir /u01/oracle/oradata/nupdb
mkdir /u01/oracle/fast_recovery_area/nupdb
mkdir /u01/oracle/admin/nupdb/{a,dp}dump -p //建立審計文件
4).配置監聽,tnsname.ora
同目標數據庫一致
tnsping nupdb //檢驗監聽是否啓動,要在.db環境變量下驗證
tnsping maxdb
兩個庫都要能夠遠程登陸才能夠用
rlwrap sqlplus sys/oracle@nupdb as sysdba
rlwrap sqlplus sys/oracle@maxdb as sysdba
5).執行在線克隆 ---在線克隆時,兩個庫都是打開的
啓動到nomount狀態
export ORACLE_SID=nupdb
sqlplus / as sysdba
startup nomount
rlwrap rman target sys/oracle@maxdb auxiliary sys/oracle@nupdb
run { set until scn 2022774; //也能夠用時間,此次咱們用從日誌挖掘裏找到的scn號,回到誤操做的前一步即scn-1 duplicate target database to nupdb nofilenamecheck db_file_name_convert=('/opt/u01/oracle/oradata/maxdb','/opt/u01/oracle/oradata/nupdb') logfile group 1 ('/opt/u01/oracle/oradata/nupdb/redo01.log') size 100m,group 2 ('/opt/u01/oracle/oradata/nupdb/redo02.log') size 100m; }
再來進行咱們的表恢復
[oracle@up12 ~]$ . .db [oracle@up12 ~]$ export ORACLE_SID=nupdb [oracle@up12 ~]$ exp scott/tiger file=/tmp/A121.dmp tables=A12 [oracle@up12 ~]$ . .db [oracle@up12 ~]$ imp scott/tiger file=/tmp/A121.dmp tables=A12