Oracle冷備份級冷備份的不完全恢復
一、Oracle 冷備份通常步驟:
今天看到一個非常好冷備份的博文,一目瞭然:http://space.itpub.net/12778571/viewspace-166613
1 正常關閉資料庫
2 備份所有重要的檔案到備份目錄(資料檔案、控制檔案、重做日誌檔案等)
3 完成備份後啟動資料庫
用冷備份進行恢復時,只需要將所有檔案恢復到原有位置,就可以啟動資料庫了 。
1 進入資料庫#sqlplus "/as sysdba"
2 如果沒有啟動則要啟動:SQL>startup
3 查詢資料檔案datafile的所在目錄:
SQL>SELECT name FROM v$datafile;
查詢控制檔案controlfile的所在目錄:
SQL>SELECT name FROM v$controlfile;
查詢重做日誌檔案的所在目錄:
SQL>SELECT member FROM v$logfile;
4 關閉資料庫
SQL>shutdown
5 備份檔案到備份的目錄
#cp /u01/app/oracle/oradata/orcl/*.dbf /home/mzl/BackupDatabase
#cp /u01/app/oracle/oradata/orcl/*.ctl /home/mzl/BackupDatabase
#cp /u01/app/oracle/oradata/orcl/*.log /home/mzl/BackupDatabase
6 然後啟動資料庫
#sqlplus "/as sysdba"
SQL>startup
2 備份所有重要的檔案到備份目錄(資料檔案、控制檔案、重做日誌檔案等)
3 完成備份後啟動資料庫
用冷備份進行恢復時,只需要將所有檔案恢復到原有位置,就可以啟動資料庫了 。
1 進入資料庫#sqlplus "/as sysdba"
2 如果沒有啟動則要啟動:SQL>startup
3 查詢資料檔案datafile的所在目錄:
SQL>SELECT name FROM v$datafile;
查詢控制檔案controlfile的所在目錄:
SQL>SELECT name FROM v$controlfile;
查詢重做日誌檔案的所在目錄:
SQL>SELECT member FROM v$logfile;
4 關閉資料庫
SQL>shutdown
5 備份檔案到備份的目錄
#cp /u01/app/oracle/oradata/orcl/*.dbf /home/mzl/BackupDatabase
#cp /u01/app/oracle/oradata/orcl/*.ctl /home/mzl/BackupDatabase
#cp /u01/app/oracle/oradata/orcl/*.log /home/mzl/BackupDatabase
6 然後啟動資料庫
#sqlplus "/as sysdba"
SQL>startup
二、oracle冷備份下的不完全恢復
完全恢復:基於三種情況
一 冷備份.
建立表空間test,使用者test,表名test 插入資料
insert into test.test(a,b) values(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate,'yyyy-mm-dd hh24:mi’));
commit;
alter system archive log current;
進行了兩個事務(commit)和日誌切換
commit;
alter system archive log current;日誌切換同時歸檔
select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
1 984675 983549 984675 初始備份時的scn
此時進行冷備份
執行shutdown immediate
複製所有的資料檔案,控制檔案,線上日誌檔案,歸檔日誌檔案,如果需要,spfile,密碼檔案
最好多複製幾份,以便反覆測試使用。
二、新增資料檔案
startup
開啟資料庫
刪除test.test 表中的所有資料
然後插入資料
insert into test.test(a,b) values(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate,'yyyy-mm-dd hh24:mi’));
commit;
alter system archive log current;
進行了兩個事務(commit)和日誌切換
commit;
前14條每兩個進行一個commit,同時alter system archive log current;
後面的
每一個進行commit;
alter system archive log current;
select * from test.test
產生scn的歷史記錄是
select * from V$log_History
21 21 577298563 1 21 988328 2005-12-17 16:42:08 988445
此時
select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
1 987945 987670 987945
shutdown immediate ;
再次完全冷備份當前的資料檔案、控制檔案、日誌檔案,歸檔日誌檔案(沒有歸檔日誌檔案恢復就成了空話)(當不完全恢復不成功或反覆使用時使用,這點很重要,在實際你的生產執行資料庫恢復時也是要這樣。)
一 冷備份.
建立表空間test,使用者test,表名test 插入資料
insert into test.test(a,b) values(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate,'yyyy-mm-dd hh24:mi’));
commit;
alter system archive log current;
進行了兩個事務(commit)和日誌切換
commit;
alter system archive log current;日誌切換同時歸檔
select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
1 984675 983549 984675 初始備份時的scn
此時進行冷備份
執行shutdown immediate
複製所有的資料檔案,控制檔案,線上日誌檔案,歸檔日誌檔案,如果需要,spfile,密碼檔案
最好多複製幾份,以便反覆測試使用。
二、新增資料檔案
startup
開啟資料庫
刪除test.test 表中的所有資料
然後插入資料
insert into test.test(a,b) values(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate,'yyyy-mm-dd hh24:mi’));
commit;
alter system archive log current;
進行了兩個事務(commit)和日誌切換
commit;
前14條每兩個進行一個commit,同時alter system archive log current;
後面的
每一個進行commit;
alter system archive log current;
select * from test.test
產生scn的歷史記錄是
select * from V$log_History
21 21 577298563 1 21 988328 2005-12-17 16:42:08 988445
此時
select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
1 987945 987670 987945
shutdown immediate ;
再次完全冷備份當前的資料檔案、控制檔案、日誌檔案,歸檔日誌檔案(沒有歸檔日誌檔案恢復就成了空話)(當不完全恢復不成功或反覆使用時使用,這點很重要,在實際你的生產執行資料庫恢復時也是要這樣。)
恢復:三種方法
基於時間
(alter database ) recover database (automatic) until time ‘2005-12-16 11:09:01’;
(alter database ) recover database (automatic) until time ‘2005-12-16 11:09:01’ using backup controlfile;
基於變更
(alter database ) recover database until change 985822;
(alter database ) recover database until change 985822using backup controlfile;
基於撤銷
(alter database ) recover database until cancel ;
(alter database ) recover database until cancel until change 985822using backup controlfile;
這裡的是否使用控制檔案,取決於原有的控制檔案是否損壞,和控制檔案發生了變化(比如刪除了表空間的操作,而,刪除資料和表的操作時不會影響到控制檔案的變化)
A、 基於時間恢復(不使用備份的控制檔案)
shutdown immediate
使用原來備份的資料檔案,控制檔案使用最新的,而不是備份的資料檔案;
SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
資料庫裝載完畢。
SQL> recover database until time '2005-12-17 16:30:07' ;
ORA-00279: 更改 984674 (在 12/17/2005 16:14:05 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00003.001
ORA-00280: 更改 984674 對於執行緒 1 是按序列 # 3 進行的
指定日誌: {
auto
ORA-00279: 更改 985596 (在 12/17/2005 16:28:34 生成) 對於執行緒 1 是必需的
已應用的日誌。
完成介質恢復。
SQL> alter database open resetlogs;
資料庫已更改。
------------------------------
到此恢復成功
因為使用的是介質恢復(不完全恢復)
故一定要使用resetlogs,重置日誌序列號,和將日誌scn歸零,當再次新增資料或引起scn變化的時候 archive_change#將得到和其他連個相近(?)的數字
可以查詢一下
SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
------------------ --------------- -------------------
985935 0 985997
SQL> select * from test.test;
A B
-------------------- --------------------
已選擇6行。
查詢第六行的時間和log_history的記錄發現是scn=985822
故恢復的時候如果直接恢復到第六條資料,就可使用scn=985822
b 基於時間恢復(使用備份的控制檔案)
複製第一次冷備份的所有的資料檔案,控制檔案
SQL> shutdown immediate
ORA-01109: 資料庫未開啟
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
資料庫裝載完畢。
SQL> recover database until time '2005-12-17 16:30:07' using backup controlfile;
ORA-00279: 更改 984674 (在 12/17/2005 16:14:05 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00003.001
ORA-00280: 更改 984674 對於執行緒 1 是按序列 # 3 進行的
指定日誌: {
auto
已應用的日誌。
完成介質恢復。
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
------------------ --------------- -------------------
985935 0 985997
SQL> select * from test.test;
A B
-------------------- --------------------
已選擇6行。
SQL>
B、a 基於變更的恢復(不包含備份的控制檔案)
SQL> recover database until change 985822;
ORA-00905: 缺少關鍵字
SQL> recover database until change 985822;
ORA-00279: 更改 984674 (在 12/17/2005 16:14:05 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00003.001
ORA-00280: 更改 984674 對於執行緒 1 是按序列 # 3 進行的
指定日誌: {
auto
已應用的日誌。
完成介質恢復。
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select * from test.test;
A B
-------------------- --------------------
已選擇6行。
SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
------------------ --------------- -------------------
985824 0 985886
B、b 基於變更的恢復(包含備份的控制檔案)
SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
資料庫裝載完畢。
SQL> recover database automic until change 985822 using backup controlfile;
ORA-00905: 缺少關鍵字
#說明這裡的automic 是不能使用的
SQL> recover database until change 985822 using backup controlfile;
ORA-00279: 更改 984674 (在 12/17/2005 16:14:05 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00003.001
ORA-00280: 更改 984674 對於執行緒 1 是按序列 # 3 進行的
指定日誌: {
auto
已應用的日誌。
完成介質恢復。
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
------------------ --------------- -------------------
985824 0 985885
SQL> select * from test.test;
A B
-------------------- --------------------
已選擇6行。
SQL>
SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。
資料庫裝載完畢。
資料庫已經開啟。
SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
------------------ --------------- -------------------
987124 0 987124
SQL
這裡關閉後重啟發現 CHECKPOINT_CHANGE和controlfile_change# from v$database
數字變了,而ARCHIVE_CHANGE#依然是0,說明什麼問題呢???
如果新增資料後
SQL> insert into test.test(a,b) values(to_char(sysdate,'YYYY-MM-DD hh24:mi:ss'),to_char(sysdate,'YYYY-MM-DD hh24:mi
:ss'));
已建立 1 行。
SQL> commit;
提交完成。
SQL> alter system archive log current;
系統已更改。
SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
------------------ --------------- -------------------
987124 987744 987747
新增資料後發現archive 和控制檔案的scn一致,但check_point 的scn沒變
下面的事件
SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。
資料庫裝載完畢。
資料庫已經開啟。
SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
------------------ --------------- -------------------
987906 987744 987906
SQL>
發現CHECKPOINT_CHANGE# 和CONTROLFILE_CHANGE#序號始終一致,而日誌scn
值得思考????????
C a基於取消(不包含備份的控制檔案)
SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
資料庫裝載完畢。
SQL> recover database until cancel;
ORA-00279: 更改 984674 (在 12/17/2005 16:14:05 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00003.001
ORA-00280: 更改 984674 對於執行緒 1 是按序列 # 3 進行的
指定日誌: {
ORA-00279: 更改 985596 (在 12/17/2005 16:28:34 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00004.001
ORA-00280: 更改 985596 對於執行緒 1 是按序列 # 4 進行的
ORA-00278: 此恢復不再需要日誌檔案 'D:\ORACLE\ORACLE92\RDBMS\ARC00003.001'
指定日誌: {
ORA-00279: 更改 985702 (在 12/17/2005 16:29:20 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00005.001
ORA-00280: 更改 985702 對於執行緒 1 是按序列 # 5 進行的
ORA-00278: 此恢復不再需要日誌檔案 'D:\ORACLE\ORACLE92\RDBMS\ARC00004.001'
指定日誌: {
ORA-00279: 更改 985822 (在 12/17/2005 16:29:54 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00006.001
ORA-00280: 更改 985822 對於執行緒 1 是按序列 # 6 進行的
ORA-00278: 此恢復不再需要日誌檔案 'D:\ORACLE\ORACLE92\RDBMS\ARC00005.001'
指定日誌: {
cancel
介質恢復已取消。
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
------------------ --------------- -------------------
985824 0 985886
SQL> select * from test.test;
A B
-------------------- --------------------
2005-12-17 16:29:14 2005-12-17 16:29:14
2005-12-17 16:28:26 2005-12-17 16:28:26
2005-12-17 16:28:27 2005-12-17 16:28:27
2005-12-17 16:29:12 2005-12-17 16:29:12
2005-12-17 16:29:49 2005-12-17 16:29:49
2005-12-17 16:29:49 2005-12-17 16:29:49
已選擇6行。
SQL>
C b基於取消(包含備份的控制檔案)
SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> recover database until cancel using backup controlfile;
ORA-01034: ORACLE not available
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
資料庫裝載完畢。
SQL> recover database until cancel using backup controlfile;
ORA-00279: 更改 984674 (在 12/17/2005 16:14:05 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00003.001
ORA-00280: 更改 984674 對於執行緒 1 是按序列 # 3 進行的
指定日誌: {
ORA-00279: 更改 985596 (在 12/17/2005 16:28:34 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00004.001
ORA-00280: 更改 985596 對於執行緒 1 是按序列 # 4 進行的
ORA-00278: 此恢復不再需要日誌檔案 'D:\ORACLE\ORACLE92\RDBMS\ARC00003.001'
指定日誌: {
ORA-00279: 更改 985702 (在 12/17/2005 16:29:20 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00005.001
ORA-00280: 更改 985702 對於執行緒 1 是按序列 # 5 進行的
ORA-00278: 此恢復不再需要日誌檔案 'D:\ORACLE\ORACLE92\RDBMS\ARC00004.001'
指定日誌: {
ORA-00279: 更改 985822 (在 12/17/2005 16:29:54 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00006.001
ORA-00280: 更改 985822 對於執行緒 1 是按序列 # 6 進行的
ORA-00278: 此恢復不再需要日誌檔案 'D:\ORACLE\ORACLE92\RDBMS\ARC00005.001'
指定日誌: {
cancle
ORA-00308: 無法開啟存檔日誌 'cancle'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。
指定日誌: {
cancel
介質恢復已取消。
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
------------------ --------------- -------------------
985824 0 985886
SQL> select * from test.test;
A B
-------------------- --------------------
2005-12-17 16:29:14 2005-12-17 16:29:14
2005-12-17 16:28:26 2005-12-17 16:28:26
2005-12-17 16:28:27 2005-12-17 16:28:27
2005-12-17 16:29:12 2005-12-17 16:29:12
2005-12-17 16:29:49 2005-12-17 16:29:49
2005-12-17 16:29:49 2005-12-17 16:29:49
已選擇6行。
SQL>
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12272958/viewspace-682173/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫的冷備份及冷備份異地恢復方法Oracle資料庫
- oracle冷備份、恢復和異機恢復Oracle
- Oracle 冷備份Oracle
- oracle的熱備份和冷備份Oracle
- oracle冷備恢復Oracle
- Oracle資料庫冷備份的異地恢復Oracle資料庫
- 物理冷備份與恢復的操作命令
- 基於歸檔的冷備份恢復
- 冷備份+歸檔日誌的恢復
- oracle 冷備及恢復Oracle
- Oracle冷備份和熱備份的處理Oracle
- Oracle 熱備份和冷備份的區別Oracle
- 基於非歸檔的冷備份恢復
- Oracle OCP(60):冷備份Oracle
- Oracle冷備份練習Oracle
- mysql的冷備份與熱備份MySql
- Oracle資料庫備份與恢復之匯出/匯入(EXP/IMP)、熱備份和冷備份Oracle資料庫
- Oracle資料庫的備份方法-冷備份(轉)Oracle資料庫
- Oracle冷備份(一致備份)指令碼Oracle指令碼
- Oracle物理冷備份指令碼Oracle指令碼
- 揭祕ORACLE備份之--冷備份(也叫離線備份)Oracle
- Oracle冷備份的通常步驟Oracle
- SQL Server 冷備份SQLServer
- 用冷備份+歸檔日誌執行不完全恢復一例
- 備份&恢復系列之一:怎樣在linux中寫對oracle的冷備份指令碼!LinuxOracle指令碼
- Oracle資料庫冷備份與熱備份操作梳理Oracle資料庫
- oracle自動冷備份指令碼Oracle指令碼
- 講解Oracle資料庫冷備份恢復的具體步驟Oracle資料庫
- windows 下的Oracle 冷備份指令碼WindowsOracle指令碼
- MySQL冷備份過程MySql
- 生成冷備份指令碼指令碼
- MySQL的冷備份和熱備份概念理解(轉)MySql
- Oracle資料庫冷備和恢復Oracle資料庫
- oracle 自動冷備份指令碼(轉)Oracle指令碼
- 使用冷備份與冷備份後的資料庫歸檔日誌檔案進行資料庫不完整恢復資料庫
- 冷備份應用歸檔
- Oracle備份恢復之熱備份恢復及異機恢復Oracle
- Oracle 聯機備份 離線備份 物理備份 恢復Oracle