第二章 手工備份與恢復
一)常用命令
1.備份和還原都會用到os命令,linux---cp
2.恢復:recover
二)備份前檢查
1.檢查需要備份的數據文件
SQL>col NAME FOR A100-----調整列顯示長度
SQL>select name from v$datafile;----查看數據文件
SQL> select file_id,file_name,tablespace_name from dba_data_files;
dba_data_files-----數據庫數據文件信息表
2)檢查要備份的控制文件
SQL> select name from v$controlfile;
3)在線redo日志可以不做備份
如果是在線備份,肯定是歸檔模式
1、在線日志里面的內容,最后都會到歸檔日志里面的。所以只要備份歸檔日志就OK了。
2、所以,RMAN也不提供備份和RESTORE在線日志的命令。
如果是數據庫關閉后備份,又是非歸檔模式的,沒有干凈shutdown的話,倒是應該備份在線日志的。
三)dbv檢查壞塊
在手工備份前,需要檢查datafile是否存在壞塊,在備份完成后也要對備份進行檢查。
對某一個datafile進行壞塊檢查
1.沒有參數,簡單檢查
2.帶有參數
LOGFILE---可以指定輸出日志,使用edit進行查看(ed 輸出日志名)
四)冷備份的注意事項
1)必須要將數據庫關閉干凈,以保證數據的一致性;
SQL>shutdown immediate;
2)在os下必須備份所有的數據文件(完整備份)
3)在os下必須備份控制文件(至少備份一個)
4)非歸檔備份還原策略
恢復時還原所有的備份,重建所有在線日志,沒有recover步驟
SQL>startup mount
SQL>alter database clear unarchived logfile group n;(n為所有在線日志組)查看有幾個日志組select * from v$log;
SQL>alter database open;
五)手工非一致性備份(熱備份)
1)在備份之前需要進入熱備模式,備份后要結束熱備模式
執行begin backup設置備份模式(在數據文件上生成檢查點,寫入scn,將來恢復的時候以這個寫入的scn為起點)
對只讀的表空間不能做熱備份,臨時表空間不需要進行備份,特別強調:NOARCHIVE模式下不支持手工熱備
對整個數據庫設置熱備模式:alter database begin backup;
對整個數據庫結束熱備模式:alter database end backup;
對單個表空間設置熱備模式:alter tablespace users begin backup;
對單個表空間結束熱備模式:alter tablespace users end backup;
2)手工熱備利用v$backup監控
例子:首先創建名為test_space的表空間以及名為test_user的用戶,並將test_user用戶的表空間指向test_space,之后將表空間test_space進行備份。
創建test_space表空間
SQL> create tablespace test_space datafile '/ora/oracle/oradata/orcl/test_space01.dbf' size 100M autoextend on next 10M;
查看創建的表空間
(PS:區別:v$tablespace (v$視圖)
:是動態性能視圖,存在於controlfile中,數據庫在mount狀態下可以查詢;dba_tablespace (dba_數據字典)
:是靜態視圖,存在於數據庫中,只能在open時查詢相同點:都是表示空間信息的)
創建用戶並授權
SQL> create user test_user identified by 123123 default tablespace test_space
SQL> grant connect to test_user;
使用新建用戶連接數據庫,查看默認表空間個用戶
接下來將表空間test_space置於聯機備份模式
SQL> alter tablespace test begin backup;
此時報錯:ORA-01123: cannot start online backup; media recovery not enabled
原因是目前數據庫處於非歸檔模式,所以無法進行在線備份,只有在歸檔模式的時候才可以進行在線備份,首先將數據庫設置成歸檔模式。具體步驟參考博客:
https://blog.csdn.net/alen_liu_sz/article/details/77992430
SQL> select file#,checkpoint_change# from v$datafile_header;
在備份期間,SCN被凍結,當檢查點發生時不受影響,他是恢復階段運用日志的起點。
SQL> select * from v$backup;
這里的STATUS是ACTIVE,證明是可以備份相應的數據文件。
此時就可以到服務器上,相應的數據文件路徑下將文件進行備份。
[oracle@oracle orcl]$ cp test_space01.dbf /ora/test_space01.dbf.bak
備份完畢后,就可以關閉聯機在線備份,需要盡快執行endbackup。
如果再end backup之前發生數據庫abort(終止),那么可以在下次啟動到mount時end backup,從而完成實例恢復。
六)split block(fractured block)問題
一個Oracle block一般包含多個OS block,當手工熱備時,OS的cp單位不是Oracle block而是OS block,而Oracle的DBWR又可能不時從內存中刷新Oracle block(臟塊)到磁盤上,如此,OS的級的拷貝可能造成:一個Oracle block是由不同的版本組成,比如,未被DBWR刷新Header block加上另一部分被刷新的foot block,這樣cp出來的Oracle block就是split block。
數據庫的一致性是不允許oracle block是split的,split block實際上屬於logical corruption Oracle采取的辦法是:在backup mode后,如果發現首次DBWR要寫臟塊,則將該塊被刷新之前的鏡像數據記錄到redo buffer,這樣,雖然cp后的文件里仍然含有split block,而當需要恢復的時候,日志會前滾該塊的前鏡像,以保證所有被恢復的oracle block最終是一個完整的版本。
這也是我們常常發現在熱備的時候日志文件會急劇增大的原因。
RMAN備份不會造成split block。RMAN備份時以oracle block為讀取單元,並查驗塊的一致性,如果不一致會重復讀,三次失敗,將標注該塊為邏輯壞塊。