oracle 冷備及恢復
冷備:
資料庫在關閉的狀態下完成物理系統拷貝的過程。冷備更適用於非歸檔模式下。
冷備的步驟:
首先,在執行的庫中得到資料庫執行的所有的物理檔案。
然後,在計劃內關閉資料庫,在執行拷貝物理檔案到備份路徑/裝置
備份完成後立即啟動資料庫,讓其提供正常服務。
備份前的查詢工作
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 、controlfile、spfile|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-01157:canont identify/lock data file 1 –see DBWR trace file
ORA-01110:data 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle冷備恢復Oracle
- Oracle資料庫的冷備份及冷備份異地恢復方法Oracle資料庫
- oracle冷備份、恢復和異機恢復Oracle
- Oracle冷備份級冷備份的不完全恢復Oracle
- Oracle資料庫冷備和恢復Oracle資料庫
- oracle 熱備及恢復Oracle
- Oracle備份恢復之熱備份恢復及異機恢復Oracle
- Oracle資料庫冷備份的異地恢復Oracle資料庫
- 只有冷備和歸檔,能否恢復?
- 資料庫異機冷備恢復資料庫
- 物理冷備份與恢復的操作命令
- 基於歸檔的冷備份恢復
- 冷備份+歸檔日誌的恢復
- oracle 10g RMAN備份及恢復Oracle 10g
- oracle 備用恢復Oracle
- 基於非歸檔的冷備份恢復
- 講解Oracle資料庫冷備份恢復的具體步驟Oracle資料庫
- 冷備手工完全恢復(recover database,recover tablespace,recover datafile)Database
- Oracle 備份恢復概念Oracle
- oracle備份恢復PPTOracle
- Oracle 備份和恢復Oracle
- ORACLE備份&恢復案例Oracle
- Oracle9i RMAN備份及恢復步驟Oracle
- Oracle資料庫備份與恢復之匯出/匯入(EXP/IMP)、熱備份和冷備份Oracle資料庫
- 【備份恢復】Oracle 資料備份與恢復微實踐Oracle
- Oracle 冷備份Oracle
- ORACLE備份&恢復案例(轉)Oracle
- Oracle 備份 與 恢復 概述Oracle
- Oracle 備份恢復之 FlashbackOracle
- Oracle RAC備份與恢復Oracle
- ORACLE備份&恢復案例(3)Oracle
- ORACLE備份&恢復案例(5)Oracle
- ORACLE備份&恢復案例(4)Oracle
- ORACLE備份&恢復案例(7)Oracle
- ORACLE備份&恢復案例(6)Oracle
- ORACLE備份&恢復案例(8)Oracle
- ORACLE備份&恢復案例(1)Oracle
- ORACLE備份&恢復案例(2)Oracle