===============html
數據庫的徹底恢復sql
===============數據庫
在歸檔模式下數據庫徹底恢復時,數據庫所通過的狀態以下:vim
1.利用備份修復(Restores)損壞或丟失的數據文件,即將備份的文件複製到數據庫中原來的位置oracle
2. 將從備份到系統崩潰這段時間所提交的數據由歸檔日誌文件和重作日誌文件中還原成數據文件所須要的數據塊,這也叫前滾(Roll Forward)app
3. 此時數據塊中包含了全部提交的數據,也可能包含沒提交的數據post
4. 系統利用還原數據塊回滾未提交的數據,這也叫回滾或者事務恢復(Recovery)url
總結成公式就是: Restore將數據文件帶回到過去(備份時間點)+Recover恢復從備份到數據文件崩潰這段時間所提交的數據 =>數據的徹底恢復spa
數據恢復時的經常使用視圖操作系統
v$reover_file --查詢須要恢復的文件,該視圖信息來自控制文件,如控制文件來自備份或重建過則信息會不許
v$archived_log --查詢全部歸檔日誌列表
v$recovery_log --查詢全部須要用於恢復的日誌
配置恢復自動使用歸檔日誌
在介質恢復前經過設置set autorecovery on來自動應用歸檔日誌實現恢復
也能夠在輸入歸檔日誌路徑、文件名時輸入auto
使用recover automatic命令
恢復文件到新路徑
使用操做系統命令恢復文件到新位置
使用alter database rename file '<dir>' to '<dir>'
適用於所須要的數據文件不屬於系統表空間或還原/回滾段表空間
1. 將數據文件置於脫機狀態(alter database datafile n offline;)
2. 還原數據文件(restore)
3. 恢復數據文件(recover datafile n)
4. 使數據文件online (alter database datafile n online;)
4. 確認數據文件是否處於聯機狀態了
SQL> conn dog/dog 已鏈接。 SQL> !rm /u01/app/oracle/oradata/orcl/test.dbf --刪除數據文件 SQL> select * from v$recover_file; --數據庫還不知道數據文件須要恢復
SQL> alter system switch logfile; --對日誌進心歸檔
SQL> alter system checkpoint; --執行檢查點進程,將數據緩衝區內容寫入到文件,因test.dbf已丟失,則告警日誌將產生該記錄 SQL> select * from v$recover_file; --發現文件丟失,須要恢復 5 OFFLINE OFFLINE FILE NOT FOUND 0
SQL> alter database datafile 5 offline; SQL> ho cp /u03/backup/hotbak/test.dbf /u01/app/oracle/oradata/orcl/ SQL> recover datafile 5; --恢復數據文件5 完成介質恢復。 SQL> select * from v$recover_file;
SQL> alter database 5 online; SQL> alter database datafile 5 online; --使數據文件聯機 SQL> select file#,status from v$datafile; --查看狀態 1 SYSTEM 2 ONLINE 3 ONLINE 4 ONLINE 5 ONLINE
包括系統表空間(系統數據文件)、Undo 表空間、整個數據庫
--刪除數據庫的數據文件
SQL> !rm /u01/app/oracle/oradata/orcl/*dbf SQL> !ls /u01/app/oracle/oradata/orcl/ control01.ctl redo01.log redo02.log redo03.log
--關閉數據庫
SQL> conn / as sysdba 已鏈接。 SQL> shutdown immediate; ORA-00604: 遞歸 SQL 級別 1 出現錯誤 ORA-01116: 打開數據庫文件 1 時出錯 ORA-01110: 數據文件 1: '/u01/app/oracle/oradata/orcl/system01.dbf' ORA-27041: 沒法打開文件 Linux-x86_64 Error: 2: No such file or directory Additional information: 3 SQL> shutdown abort; ORACLE 例程已經關閉。
--啓動數據庫
SQL> startup ORACLE 例程已經啓動。 Total System Global Area 805875712 bytes Fixed Size 2217672 bytes Variable Size 528484664 bytes Database Buffers 268435456 bytes Redo Buffers 6737920 bytes 數據庫裝載完畢。 ORA-01157: 沒法標識/鎖定數據文件 1 - 請參閱 DBWR 跟蹤文件 ORA-01110: 數據文件 1: '/u01/app/oracle/oradata/orcl/system01.dbf'
--還原數據文件
SQL> select * from v$recover_file; 1 ONLINE ONLINE FILE NOT FOUND 2 ONLINE ONLINE FILE NOT FOUND 3 ONLINE ONLINE FILE NOT FOUND 4 ONLINE ONLINE FILE NOT FOUND 5 ONLINE ONLINE FILE NOT FOUND SQL> ho cp /u03/backup/hotbak/*.dbf $ORACLE_BASE/oradata/orcl/
--恢復數據文件,這裏是自動尋取所須要的歸檔文件
SQL> recover datafile 1,2; 完成介質恢復。 SQL> select * from v$recover_file; 3 ONLINE ONLINE 2-16 19:11:28 4 ONLINE ONLINE 2-16 19:11:35 5 ONLINE ONLINE 2-16 19:11:20 SQL> recover database; 完成介質恢復。 SQL> select * from v$recover_file;
--打開數據庫
SQL> alter database open;
啓動到mount狀態
將受損的數據文件offline
打開數據庫
還原受損的數據文件(restore)
恢復受損的數據文件(recover)
將受損的數據文件online
此場景相似於A場景僅僅是須要先啓動到mount狀態,而後再將受損的數據文件脫機,並打開數據庫,使之能提供服務.所以該演示省略.
所須要恢復的數據文件屬於非系統表空間
控制文件未被從新建立或恢復到之前的版本(丟失數據文件的描述信息應在數據字典和控制文件中)
該數據文件從文件開始到丟失期間的全部日誌必須存在
若是那個公司使用了這種方法,說明該公司的數據庫管理維護很混亂。
步驟:-->先將丟失數據文件脫機-->重建數據文件-->應用歸檔日誌-->聯機恢復的數據文件
Oracle提供以下兩個方法重建這個數據文件的結構命令:
alter database create datafile 'filename';
alter database create datafile 'filename' as 'new file name'; --能夠放置到不一樣目錄,通常用於原文件所在的目錄已經損壞了
實例演示:
SQL> create table tb_bk2(id int,name varchar2(10)) tablespace bk2; SQL> insert into tb_bk2 values(1,'Dand'); SQL> commit; SQL> alter system checkpoint; SQL> alter system switch logfile; SQL> ho rm $ORACLE_BASE/oradata/orcl/bk02.dbf --模擬數據文件被損壞 SQL> insert into tb_bk2 values(2,'Luck'); SQL> commit; SQL> alter database datafile 6 offline; --使數據文件離線 SQL> select * from v$recover_file; 6 OFFLINE OFFLINE FILE NOT FOUND 0 SQL> alter database create datafile 6; --重建數據文件 SQL> recover datafile 6; 完成介質恢復。 SQL> alter database datafile 6 online; SQL> select * from tb_bk2; 1 Dand 2 Luck
不徹底恢復的幾種經常使用方法:
recover database until cancel; --SQLPlus使用
recover database until time '2009-10-09:14:20:45' --SQLPlus與RMAN都支持
recover database unitl time '2009-10-09:14:20:45' using backup controlfile
recover database until change 329102 --SQLPlus使用
recover database until scn 329102 --RMAN使用
recover database until sequence 10 --RMAN使用
其實,這種不徹底恢復不少均可用閃回技術進行恢復。
先作一次冷備 腳本在:Oracle冷備份及其恢復
SQL> @coolbak.sql
在一個表裏插入數據,並記錄下時間
SQL> conn dog/dog 已鏈接。 SQL> create table users(id int,name varchar(20)); 表已建立。 SQL> insert into users values(1,'Scott'); 已建立 1 行。 SQL> commit; 提交完成。 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; TO_CHAR(SYSDATE,'YY ------------------- 2016-12-17 02:35:24 SQL> insert into users values(2,'Keven'); 已建立 1 行。 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; TO_CHAR(SYSDATE,'YY ------------------- 2016-12-17 02:36:17 SQL> commit; 提交完成。
關閉數據庫,刪除掉數據文件並從冷備中恢復過來
SQL> conn / as sysdba 已鏈接。 SQL> shutdown abort; ORACLE 例程已經關閉。 SQL> ho rm $ORACLE_BASE/oradata/orcl/*.dbf SQL> ho cp /u03/backup/coolbak/*.dbf $ORACLE_BASE/oradata/orcl/
查看控制文件中記錄的檢查點和備份的數據文件頭記錄的檢查點,並恢復到指定時間點
SQL> startup mount; ORACLE 例程已經啓動。 Total System Global Area 805875712 bytes Fixed Size 2217672 bytes Variable Size 549456184 bytes Database Buffers 247463936 bytes Redo Buffers 6737920 bytes 數據庫裝載完畢。 SQL> select file#,checkpoint_change# from v$datafile; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 1094320 2 1094320 3 1094320 4 1094320 5 1094320 6 1094320 已選擇6行。 SQL> select file#,checkpoint_change# from v$datafile_header; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 1073554 2 1073554 3 1073554 4 1073554 5 1073554 6 1073554 已選擇6行。 SQL> recover database until time '2016-12-17 02:35:24'; 完成介質恢復。
--使用resetlogs方式打開數據庫,並查看錶中的數據是否恢復到了指定的時間點
SQL> alter database open resetlogs; 數據庫已更改。 SQL> conn dog/dog 已鏈接。 SQL> select * from users; ID NAME ---------- -------------------- 1 Scott
能夠看出確實恢復到了指定的時間點
--再次查看文件頭,是否也已經一致了。
SQL> select file#,checkpoint_change# from v$datafile; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 1094761 2 1094761 3 1094761 4 1094761 5 1094761 6 1094761 已選擇6行。 SQL> select file#,checkpoint_change# from v$datafile_header; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 1094761 2 1094761 3 1094761 4 1094761 5 1094761 6 1094761 已選擇6行。
作好冷備
SQL> start /u03/backup/coolbak.sql
QL> conn dog/dog Connected. SQL> select * from person; ID NAME ---------- -------------------- 1 Keven SQL> insert into person values(2,'Scott'); 1 row created. SQL> commit; Commit complete. SQL> alter system switch logfile; --將日誌寫進歸檔 System altered. SQL> host strings /u03/ARCHLOG/1_2_930793088.dbf|grep Scott --歸檔中已經存在Scott記錄 Scott SQL> host strings $ORACLE_BASE/oradata/orcl/test.dbf|grep Scott --未執行檢查點時,數據文件中不存在Scott記錄 SQL> alter system checkpoint; --執行檢查點進程 System altered. SQL> host strings $ORACLE_BASE/oradata/orcl/test.dbf|grep Scott --執行後,數據文件中存在Scott記錄 Scott SQL> insert into person values(3,'Jack'); --將Jack這條數據寫進數據文件中,可是沒有寫到歸檔日誌文件中 1 row created. SQL> commit; Commit complete. SQL> alter system checkpoint; System altered. SQL> host strings $ORACLE_BASE/oradata/orcl/test.dbf|grep Jack Jack, SQL> alter database backup controlfile to trace as '/tmp/control.sql'; --備份控制文件 Database altered. SQL> ho rm -f $ORACLE_BASE/oradata/orcl/* -- 數據文件,控制文件,日誌文件將所有丟失 SQL> conn / as sysdba Connected. SQL> shutdown abort --強制關機 ORACLE instance shut down. SQL> host cp /u03/backup/coolbak/*.dbf /$ORACLE_BASE/oradata/orcl/ --僅對數據文件進行還原
--修改前面備份的控制文件以下,手動來建立控制文件
vim /tmp/control.sql
STARTUP NOMOUNT CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log' SIZE 50M BLOCKSIZE 512, GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log' SIZE 50M BLOCKSIZE 512, GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log' SIZE 50M BLOCKSIZE 512 -- STANDBY LOGFILE DATAFILE '/u01/app/oracle/oradata/orcl/system01.dbf', '/u01/app/oracle/oradata/orcl/sysaux01.dbf', '/u01/app/oracle/oradata/orcl/undotbs01.dbf', '/u01/app/oracle/oradata/orcl/users01.dbf', '/u01/app/oracle/oradata/orcl/test.dbf', '/u01/app/oracle/oradata/orcl/bk02.dbf' CHARACTER SET AL32UTF8 ;
--執行重建控制文件的腳本
SQL> shutdown abort ORACLE instance shut down. SQL> start /tmp/control.sql ORACLE instance started. Total System Global Area 805875712 bytes Fixed Size 2217672 bytes Variable Size 595593528 bytes Database Buffers 201326592 bytes Redo Buffers 6737920 bytes Control file created.
--恢復文件
SQL> recover database using backup controlfile until cancel; ORA-00279: change 1075471 generated at 12/20/2016 19:59:42 needed for thread 1 ORA-00289: suggestion : /u03/ARCHLOG/1_1_931117309.dbf ORA-00280: change 1075471 for thread 1 is in sequence #1 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} --1_1_931117309.dbf不存在,尚未生成歸檔,而是在聯機日誌文件中,聯機日誌丟失,輸入cancel
cancel
Media recovery cancelled.
SQL> alter database open resetlogs;
Database altered.
SQL> alter tablespace temp add tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf' 2 size 31457280 reuse autoextend on; Tablespace altered.