ORACLE---恢復

1、徹底恢復
控制文件,數據文件,表空間丟失,且是物理上的丟失sql

2、不徹底恢復
聯機日誌,表空間丟失使用居於時間點的不徹底恢復
3、克隆技術
數據庫是7*24小時運行,drop table,drop user
4、閃回技術
誤dml操做數據庫

 

 

1、徹底恢復


數據庫發生結構上的丟失,丟表空間,數據文件,控制文件丟失,參數文件丟失,可將數據庫恢復到誤操做最近的時刻點
不適用與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;


 網絡

2、不徹底恢復



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 進行文件路徑的轉化

居於時間克隆(使用於7*24小時的數據庫)----

假若是丟告終構的咱們就不可使用可能,只可以使用徹底恢復,或者不徹底恢復
日誌挖掘---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
相關文章
相關標籤/搜索