oracle 冷備及恢復

邱東陽發表於2014-06-03

 

冷備:

資料庫在關閉的狀態下完成物理系統拷貝的過程。冷備更適用於非歸檔模式下。

 

冷備的步驟:

首先,在執行的庫中得到資料庫執行的所有的物理檔案。

然後,在計劃內關閉資料庫,在執行拷貝物理檔案到備份路徑/裝置

備份完成後立即啟動資料庫,讓其提供正常服務。

 

 

備份前的查詢工作

 

 

SQL> show user

USER is "SYS"

當前庫名

SQL> select name from v$database;

 

NAME

---------

ORCL

例項名

SQL> select instance_name from v$instance;

 

INSTANCE_NAME

----------------

orcl

當前所有資料檔案及狀態

  SQL> select file_name,tablespace_name,status,online_status from dba_data_files;

 

    FILE_NAME                                               TABLESPACE STATUS    ONLINE_

    ------------------------------------------------------- ---------- --------- -------

    /u01/app/oracle/oradata/orcl/undotbs01.dbf              UNDOTBS1   AVAILABLE ONLINE

    /u01/app/oracle/oradata/orcl/system01.dbf               SYSTEM     AVAILABLE SYSTEM

    /u01/app/oracle/oradata/orcl/sysaux01.dbf               SYSAUX     AVAILABLE ONLINE

    /u01/app/oracle/oradata/orcl/users01.dbf                USERS      AVAILABLE ONLINE

    /u01/app/oracle/oradata/orcl/example01.dbf              EXAMPLE    AVAILABLE ONLINE

 

SQL>

檢視資料檔案位置

 SQL> select name from v$datafile;

 

    NAME

    --------------------------------------------------------------------------------

    /u01/app/oracle/oradata/orcl/system01.dbf

    /u01/app/oracle/oradata/orcl/undotbs01.dbf

    /u01/app/oracle/oradata/orcl/sysaux01.dbf

    /u01/app/oracle/oradata/orcl/users01.dbf

    /u01/app/oracle/oradata/orcl/example01.dbf

 

臨時檔案位置

SQL> select name from v$tempfile;

 

NAME

--------------------------------------------------------------------------------

 /u01/app/oracle/oradata/orcl/temp01.dbf

SQL>

日誌檔案位置

SQL> select member from v$logfile;

 

MEMBER

--------------------------------------------------------------------------------

    /u01/app/oracle/oradata/orcl/redo2a.rdo

    /u01/app/oracle/oradata/orcl/redo2b.rdo

    /u01/app/oracle/oradata/orcl/redo1a.rdo

    /u01/app/oracle/oradata/orcl/redo3a.rdo

    /u01/app/oracle/oradata/orcl/redo3b.rdo

    /u01/app/oracle/oradata/orcl/redo1b.rdo

 

6 rows selected.

 

SQL>

控制檔案位置

SQL> select name from v$controlfile;

 

NAME

--------------------------------------------------------------------------------

  /u01/app/oracle/oradata/orcl/control01.ctl

    /u01/app/oracle/oradata/orcl/control02.ctl

 

SQL>

引數檔案可以直接通過建立指定一個目錄

SQL> create pfile='/u01/app/....'  from spfile;

 

密碼檔案位置

SQL> ho ls $ORACLE_HOME/dbs/orapw$ORACLE_SID

/u01/app/oracle/product/10.2.0/db_1/dbs/orapworcl

 

SQL>

 

建立備份指令碼

 

建立備份存放路徑

SQL> ho mkdir /u02/orcl

 

SQL>

連線符生成命令

SQL> select 'ho cp '||name||' /u02/orcl' from v$controlfile;

 

'HOCP'||NAME||'/U02/ORCL'

--------------------------------------------------------------------------------

ho cp /u01/app/oracle/oradata/orcl/control01.ctl  /u02/orcl

ho cp /u01/app/oracle/oradata/orcl/control02.ctl  /u02/orcl

 

SQL>

儲存前一命令以文字形式到/u02/bakorcl.sql

SQL> save /u02/bakorcl.sql

Created file /u02/bakorcl.sql

SQL>

 

編寫指令碼

[oracle@yang /]$ vi /u02/bakorcl.sql

 

spool /u02/bak.sql

select 'ho cp '||name||' /u02/orcl' from v$controlfile

union all

select 'ho cp '||name||' /u02/orcl' from v$datafile

union all

select 'ho cp '||name||' /u02/orcl' from v$tempfile

union all

select 'ho cp '||member||' /u02/orcl' from v$logfile

/

create pfile='/u02/orcl/initorcl.ora' from spfile;

ho cp /u01/app/oracle/product/10.2.0/db_1/dbs/orapworcl  /u02/orcl/

pool off

shutdown immediate

ho sed -n '/^ho cp/p'  /u02/bak.sql  >/u02/bakstart.sql

start /u02/bakstart.sql

startup

執行指令碼

 

SQL> @/u02/bakorcl.sql

查詢結果

[oracle@yang ~]$ ls /u02/orcl

    control01.ctl  orapworcl   redo2b.rdo    system01.dbf   users01.dbf

    control02.ctl  redo1a.rdo  redo3a.rdo   

    example01.dbf  redo1b.rdo  redo3b.rdo    

    initorcl.ora   redo2a.rdo  sysaux01.dbf  undotbs01.dbf

 

 

 

冷備的恢復(非歸檔模式下)

 

1丟失資料檔案

a.丟失system表空間,則需要全備資料庫,然後在使用最近的冷備還原 到目的路徑。最後啟動資料庫完成恢復到冷備時刻。由於是非歸檔只能恢復到最近冷備備份時刻。

b.sysaux輔助表空間丟失, 資料庫的啟動將sysaux資料檔案離線,然後匯出資料,最後在新建資料庫導回資料。還可以使用冷備資料還原,加隱藏引數啟動資料庫忽略一致性驗證。

C. undo 表空間丟失  需要刪除老的表空間 建立新的undo表空間就可以。

d.自己建立的表空間丟失,需要需要離線該資料檔案,啟動資料庫。匯出其他可用資料

e.臨時表空間丟失,直接建立新的

2.日誌檔案丟失

通過resetlogs恢復日誌檔案

3、控制檔案丟失

建立新的控制檔案

4、引數檔案丟失

直接用備份恢復即可

5、密碼檔案丟失

可以用備份恢復,也可以建立新的

 

控制檔案全部丟失

只能重建控制檔案

 

找到冷備路徑

[oracle@yang ~]$ ls /u02/orcl

    control01.ctl  orapworcl   redo2b.rdo    system01.dbf   users01.dbf

    control02.ctl  redo1a.rdo  redo3a.rdo   

    example01.dbf  redo1b.rdo  redo3b.rdo    

    initorcl.ora   redo2a.rdo  sysaux01.dbf  undotbs01.dbf

檢視二進位制控制檔案找到所有資料檔案路徑

[oracle@yang ~]$ strings /u02/orcl/control01.ctl |grep dbf

 /u01/app/oracle/oradata/orcl/system01.dbf

    /u01/app/oracle/oradata/orcl/undotbs01.dbf

    /u01/app/oracle/oradata/orcl/sysaux01.dbf

    /u01/app/oracle/oradata/orcl/users01.dbf

    /u01/app/oracle/oradata/orcl/example01.dbf

 /u01/app/oracle/oradata/orcl/temp01.dbf

 

可以得到建立控制檔案的語句

檢視控制檔案路徑

SQL> show parameter control_files

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

control_files                        string      /u01/app/oracle/oradata/orcl/

                                                 control01.dbf, /u01/app/oracle/oradata/orcl/

                                                  control02.dbf

SQL>

將備份的控制檔案 拷貝到原路徑

SQL> ho cp /u02/orcl/control* /u01/app/oracle/oradata/orcl/

將資料庫啟動到mount狀態

SQL> alter database mount;

得到建立控制檔案語句

SQL> alter database backup controlfile to trace as  '/u02/orcl/ctl.sql';

 

Database altered.

SQL>

刪除拷貝的控制檔案

SQL>ho rm  /u01/app/oracle/oradata/orcl/control*

 

關閉資料庫

 

SQL> shutdown abort

編輯指令碼              (將所有註釋與前面空格都刪除)

[oracle@yang ~]$ vi /u02/orcl/ctl.sql

改成如下格式

STARTUP NOMOUNT

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  NOARCHIVELOG

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 8

MAXLOGHISTORY 292

LOGFILE

GROUP 1 (

'/u01/app/oracle/oradata/orcl/redo1a.log',

'/u01/app/oracle/oradata/orcl/redo1b.log'

) SIZE 50M,

GROUP 2 (

'/u01/app/oracle/oradata/orcl/redo2a.log ',

'/u01/app/oracle/oradata/orcl/redo2b.log'

) SIZE 50M,

GROUP 3 (

'/u01/app/oracle/oradata/orcl/redo3a.log ',

'/u01/app/oracle/oradata/orcl/redo3b.log '

) SIZE 50M

DATAFILE

    '/u01/app/oracle/oradata/orcl/system01.dbf',

   ' /u01/app/oracle/oradata/orcl/undotbs01.dbf',

   ' /u01/app/oracle/oradata/orcl/sysaux01.dbf',

   ' /u01/app/oracle/oradata/orcl/users01.dbf',

    '/u01/app/oracle/oradata/orcl/example01.dbf',

CHARACTER SET ZHS16GBK

;

RECOVER DATABASE

ALTER SYSTEM ARCHIVE LOG ALL;

ALTER DATABASE OPEN;

ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp01.dbf'

SIZE 20971520  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

 

 

最後執行建立指令碼

SQL> @/u02/orcl/ctl.sql

 

完成後需要在次對資料庫進行備份 (控制檔案重建,以前的備份就無效了)

 

 

日誌檔案的丟失

在執行恢復之前,需要先對資料庫 datafile controlfilespfile|pfile 進行備份,如果恢復失敗可以恢復到恢復失敗前。

 

日誌檔案丟失啟動資料庫 會報錯

ORA-00313

ORA-00312

執行resetlogs也會報錯

SQL> alter database open resetlogs;

ORA-01139

 

可以使用欺騙手段

SQL> recover database using backup controlfile;

Specify log:  回車

再次執行resetlogs

SQL> alter database open resetlogs;

ORA-1113

ORA-1110

這時候就可以使用隱藏引數忽略一致性驗證

SQL> alter system set "_allow_resetlogs_corrution"=true scope=spfile;

將資料庫重啟動到mount狀態

SQL> startup force mount

啟動資料庫到open狀態會提示需要resetlogs啟動

SQL> alter database open;

ORA-01589:must use RESETLOGS or NOSETLOGS….

執行resetlogs啟動資料庫

SQL> alter database open resetlogs;

Database altered.

SQL>

啟動成功後取消隱藏引數

SQL> alter system reset  " _allow_resetlogs_corruption" scope=spfile sid='*';

然會重啟資料庫

SQL>shutdown immediate

SQL> startup

 

系統表空間丟失

resetlogs 之前要做備份否則方法無效

 

 

Startup

ORA-01157canont identify/lock data file 1 –see DBWR  trace file

 

ORA-01110data file 1:’ u01/app/oracle/oradata/orcl/system01.dbf’

首先要先將資料庫全備

將之前備份的資料檔案拷回源地址

SQL> ho cp /u02/orcl/system01.dbf  u01/app/oracle/oradata/orcl/

啟動資料庫會提示需要做的工作

SQL> alter database open;

ORA-01113:file 1 needs media recovery

ORA-01110:data file 1: ’ u01/app/oracle/oradata/orcl/system01.dbf’

恢復資料庫 (如果能恢復 直接開啟資料庫就可以,不能恢復找不到日誌,可以退出恢復

SQL> recover database;

Specify log:

Cancel

SQL> alter database open;

ORA-01113:file 1 needs media recovery

ORA-01110:data file 1: ’ u01/app/oracle/oradata/orcl/system01.dbf’

還是需要恢復,使用隱藏引數忽略一致性驗證。

SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;

重啟資料庫同樣會報錯

SQL> startup force

ORA-01113:file 1 needs media recovery

ORA-01110:data file 1: ’ u01/app/oracle/oradata/orcl/system01.dbf’

執行取消恢復 輸入cancel

SQL> recover database until cancel;

Specify log:

Cancel

ORA-01547 RECOVER succeeded but OPEN RESETLOGS would……

 

Resetlogs 啟動資料庫

SQL> alter database open resetlogs;

ORA-00603 ORACLE server session terminated by fatal error

退出會話重新連線啟動資料庫

SQL>exit

[oracle@yang ~]$ sqlplus “/ as sysdba”

SQL>startup

 

成功啟動一定要將隱藏引數改掉

SQL> alter system set "_allow_resetlogs_corruption"=false scope=spfile;

SQL> alter system reset "_allow_resetlogs_corruption" scope=spfile sid=’*’;

雖然資料庫啟動成功,但是備份後的資料都將丟失。

 

 

輔助表空間丟失

在冷備以來控制檔案沒有被重建,也沒有執行resetlogs ,則可以使用備份還原,然後使用隱藏引數忽略一致性驗證啟恢復。

 

如果控制檔案被重建,或者執行了resetlogs。那麼只能將資料檔案離線,然後以exp表形式匯出資料,然後新建資料庫,把匯出的資料導回。

還有一種很麻煩的方法,將資料庫啟動到 startup         migrate 狀態,drop tablespace sysaux;根據提示做相應的修改。然後重建。

 

SQL> startup

ORA-01157: canont identify/lock data file 3 –see DBWR  trace file

ORA-01110: data file 3: ‘/u01/app/oracle/oradata/orcl/sysaux01.dbf’

 備份還原

SQL> ho cp /u02/orcl/sysaux01.dbf  /u01/app/oracle/oradata/orcl/

恢復資料庫

SQL> recover database until cancel;

Specify log:

Cancel

ORA-01547 RECOVER succeeded but OPEN RESETLOGS would……

SQL> alter database open resetlogs;

ERROR at line 1:

ORA-01092: ORACLE instance terminated. Sisconnection forced

例項中斷 重連會話啟動資料庫

SQL> exit

 

[oracle@yang ~]$ sqlplus "/ as sysdba"

SQL> startup

 

 

Undo表空間丟失

 

如果有其他可用的undo表空間,則可以修改引數undo_tablespace 改為可用的undo表空間名,把損壞的離線 然後啟動資料庫 ,刪除壞的undo表空間。然後建立新的undo表空間,並修改為預設undo為新建的undo表空間

 

如果沒有其他可用的undo表空間,則可以使用隱藏引數使undo表空間強制離線,然後啟動資料庫,最後刪除undo表空間,建立新的

 

演示沒有其他可用undo

SQL> startup

ORA-01157: canont identify/lock data file 2 –see DBWR  trace file

ORA-01110: data file2: ‘/u01/app/oracle/oradata/orcl/undotbs01.dbf’

修改undo為手動管理

SQL> show parameter undo_

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

undo_management                      string      AUTO

undo_retention                       integer     900

undo_tablespace                      string      UNDOTBS1

SQL>

 

SQL> alter system set undo_management =maunal scope=spfile;                 

 

找到隱藏引數

SQL> select ksppinm from x$ksppi where  ksppinm like '%roll%';

 

KSPPINM

--------------------------------------------------------------------------------

transactions_per_rollback_segment

rollback_segments

_rollback_segment_initial

_rollback_segment_count

_offline_rollback_segments

_corrupted_rollback_segments

_cleanup_rollback_entries

_rollback_stopat

fast_start_parallel_rollback

_mv_rolling_inv

 

10 rows selected.

 

SQL>

使用隱藏引數並重啟資料庫

 

SQL> alter system set "_offline_rollback_segments"=true scope=spfile;

 

SQL>shutdown immediate;

SQL>startup

ORA-01157: canont identify/lock data file 2 –see DBWR  trace file

ORA-01110: data file2: ‘/u01/app/oracle/oradata/orcl/undotbs01.dbf’

undo離線

SQL> alter database datafile 2 offline drop;

 

啟動資料庫到open

SQL> alter database open;

可以檢視undo表空間狀態

SQL> select * from v$rollname;

 

       USN NAME

---------- ------------------------------

         0 SYSTEM

 

SQL> select usn,status from v$rollstat;

 

       USN STATUS

---------- ---------------

         0 ONLINE

 

SQL>

刪除undo表空間並重建

SQL> drop tablespace undotbs1;

SQL> create undo tablespace undotbs1 datafile '/u01/app/oracle/oradata/orcl/undotbs101.dbf' size 250m autoextend on;

 

取消隱藏引數

SQL> alter system set "_offline_rollback_segments"=false scope=spfile;

SQL> alter system reset "_offline_rollback_segments" scope=spfile sid='*';

 

undo_tablespace 引數改回自動管理

SQL> alter system set undo_management =auto scope=spfile;

 

最後重啟資料庫

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29532781/viewspace-1174681/,如需轉載,請註明出處,否則將追究法律責任。

相關文章