Oracle資料庫備份和恢復
commit --lgwr
- 事務相關的操作,保證事務的安全
checkpoint --dbwr
- 資料相關的操作,保證資料的安全
例項的恢復 crash recovery
什麼時候發生oracle例項恢復
- shutdown abort
- 資料庫異常down掉(機器宕機,掉電)
從Redo的什麼位置開始恢復?
在某一點,在這一點之前的所有資料,Oracle都已經成功的寫入到了磁碟上。
例項恢復是一個自動的過程,不需要人工干預
例項恢復發生在那個階段?
–sql>startup nomount(讀取spfle) ,沒有例項恢復。
–sql>alter database mount (讀取控制檔案),沒有例項恢復。
–sql>alter database open (檢查控制檔案,資料檔案頭),發生例項恢復。
- 如果直接startup命令,會經過啟動裝載開啟三個步驟。
SQL> shutdown abort; ORACLE 例程已經關閉。 SQL> startup; ORACLE 例程已經啟動。 Total System Global Area 3307048960 bytes Fixed Size 2180264 bytes Variable Size 1828719448 bytes Database Buffers 1459617792 bytes Redo Buffers 16531456 bytes 資料庫裝載完畢。 資料庫已經開啟。 SQL> shutdown abort; ORACLE 例程已經關閉。 SQL> startup nomount; ORACLE 例程已經啟動。 Total System Global Area 3307048960 bytes Fixed Size 2180264 bytes Variable Size 1828719448 bytes Database Buffers 1459617792 bytes Redo Buffers 16531456 bytes SQL> alter database mount; 資料庫已更改。 SQL> alter database open; 資料庫已更改。
oracle在開啟資料庫時(alter database open),會檢查每個檔案頭上的資訊(SCN),並同控制檔案中相應的資訊(SCN)比較,如果不一致就進行例項恢復。
例項恢復的過程
- 前滾rolling forward
讀取狀態為current和active狀態的日誌(redo log),將發生crash時,沒有來得及寫磁碟的資料塊,使用redo資訊來恢復。
- 開啟資料庫alter database open
- 回滾rolling back
將沒有提交的事務進行回滾
介質恢復
當發生以下情況時,例項恢復無效,需要進行介質恢復:
- 資料檔案丟失,損壞。
- 線上日誌檔案(onlineredo)丟失,損壞。
- 資料檔案太舊(比如從一個備份集中恢復過來的檔案。)
- 檔案太新(比如,其它所有的檔案都是從備份中恢復過來的)
資料損壞時基本都要進行介質恢復
Oracle的備份方式
Rman(物理備份)--Recovery Manager
備份和還原資料庫檔案、歸檔日誌和控制檔案。它也可以用來執行完全或不完全的資料庫恢復。
Rman比較慢,相同情況下一般使用Dataguard
Rman是是oracle資料庫自帶的一個備份工具,用Rman備份的步驟如下:
C:\Users\clg>sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on 星期二 3月 8 17:33:37 2016
Copyright (c) 1982, 2010, Oracle. All rights reserved.
連線到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> alter database open;
資料庫已更改。
SQL> quit;
從 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 斷
開
C:\Users\clg>rman target /
恢復管理器: Release 11.2.0.1.0 - Production on 星期二 3月 8 17:34:10 2016
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
連線到目標資料庫: ORCL (DBID=1433387646)
RMAN> backup database;
啟動 backup 於 08-3月 -16
使用目標資料庫控制檔案替代恢復目錄
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=134 裝置型別=DISK
通道 ORA_DISK_1: 正在啟動全部資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集內的資料檔案
輸入資料檔案: 檔案號=00001 名稱=D:\APP\CLG\ORADATA\ORCL\SYSTEM01.DBF
輸入資料檔案: 檔案號=00002 名稱=D:\APP\CLG\ORADATA\ORCL\SYSAUX01.DBF
輸入資料檔案: 檔案號=00003 名稱=D:\APP\CLG\ORADATA\ORCL\UNDOTBS01.DBF
輸入資料檔案: 檔案號=00005 名稱=D:\APP\CLG\ORADATA\ORCL\EXAMPLE01.DBF
輸入資料檔案: 檔案號=00004 名稱=D:\APP\CLG\ORADATA\ORCL\USERS01.DBF
通道 ORA_DISK_1: 正在啟動段 1 於 08-3月 -16
通道 ORA_DISK_1: 已完成段 1 於 08-3月 -16
段控制代碼=D:\APP\CLG\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2016_03_08\O1_MF_NNNDF_TAG2
0160308T173510_CFX76H7L_.BKP 標記=TAG20160308T173510 註釋=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:35
通道 ORA_DISK_1: 正在啟動全部資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集內的資料檔案
備份集內包括當前控制檔案
備份集內包括當前的 SPFILE
通道 ORA_DISK_1: 正在啟動段 1 於 08-3月 -16
通道 ORA_DISK_1: 已完成段 1 於 08-3月 -16
段控制代碼=D:\APP\CLG\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2016_03_08\O1_MF_NCSNF_TAG2
0160308T173510_CFX77M5Q_.BKP 標記=TAG20160308T173510 註釋=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:01
完成 backup 於 08-3月 -16
如果這是備份表空間,可以用一下語句實現
SQL> select tablespace_name from dba_tablespaces;
TABLESPACE_NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS
EXAMPLE
已選擇6行。
SQL> quit;
C:\Users\clg>rman target /
RMAN>
RMAN> backup tablespace users;
這樣就可以備份制定的表空間。
exp,expdp(邏輯備份)
–使用者,資料庫物件(表,分割槽...)
只讀表空間+傳遞表空間
OLAP(Online Analytical Process)資料庫的一種備份方案
Dataguard--重點
最簡單的備份方案
- 備份自動
- 故障恢復時間非常短
缺點和限制
- 需要資料庫歸檔(OLAP型別的資料庫不適宜歸檔)
- 對於海量資料不合適
Oracle的閃回技術--flashback
資料庫的閃回
預設資料庫的閃回是關閉的。
可以用以下命令查詢看是否是開啟的
select flashback_on from v$database;
可以用以下命令開啟,建議開啟flashback
alter database flashback on;
基於SCN的閃回
一般不太容易知道SCN,不易獲得SCN
基於時間的閃回
資料庫閃回到具體時間
表的閃回
system使用者刪除的table不進recyclebin,普通使用者刪除的table會進入recyclebin。具體如下:
SQL> show user;
USER 為 "SYS"
SQL> create table t1(id int);
表已建立。
SQL> drop table t1;
表已刪除。
SQL> show recyclebin;
SQL> SELECT * FROM RECYCLEBIN;
未選定行
/*可見回收站中並沒有t1表*/
SQL> conn liuyifei/a4852396
已連線。
SQL> create table t1(id int);
表已建立。
SQL> drop table t1;
表已刪除。
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T1 BIN$EqiCMfIYSHGQW4KrIX0Alg==$0 TABLE 2016-03-08:19:20:23
SQL> flashback table t1 to before drop;
閃回完成。
SQL> desc t1;
名稱 是否為空? 型別
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
徹底刪除表,不進入回收站的辦法
SQL> drop table t1 purge;
關於回收站的資料如下:
http://www.jb51.net/article/34733.htm
DML操作的閃回
事務的閃回
版本的閃回
上面三種閃回後面在進行補充
以下是關於歸檔模式和非歸檔模式的知識:
歸檔模式轉換為非歸檔模式:
檢視資料庫是否是歸檔模式:兩種方式
SQL> select name,log_mode from v$database;
NAME LOG_MODE
--------- ------------
ORCL NOARCHIVELOG
SQL> archive log list;
資料庫日誌模式 非存檔模式
自動存檔 禁用
存檔終點 USE_DB_RECOVERY_FILE_DEST
最早的聯機日誌序列 28
當前日誌序列 30
非歸檔模式轉換為歸檔模式:
SQL>SHUTDOWN NORMAL/IMMEDIATE; 先down下資料
SQL>START MOUNT; 啟動資料庫例項到mount狀態,但不要開啟
SQL>ALTER DATABASE ARCHIVELOG; 設定資料庫為歸檔日誌模式
SQL>ALTER DATABASE OPEN; 開啟資料庫
SQL>archive log list; 確認資料庫現在處於歸檔日誌模式
一般設定資料庫為歸檔日誌模式時會出現如下錯誤:
ORA-00265: 要求例項恢復, 無法設定 ARCHIVELOG 模式
這是我們可以按照如下步驟解決:
SQL> alter database archivelog;
alter database archivelog
*
第 1 行出現錯誤:
ORA-00265: 要求例項恢復, 無法設定 ARCHIVELOG 模式
SQL> shutdown immediate;
ORA-01109: 資料庫未開啟
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup restrict;
ORACLE 例程已經啟動。
Total System Global Area 3307048960 bytes
Fixed Size 2180264 bytes
Variable Size 1828719448 bytes
Database Buffers 1459617792 bytes
Redo Buffers 16531456 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount;
ORACLE 例程已經啟動。
Total System Global Area 3307048960 bytes
Fixed Size 2180264 bytes
Variable Size 1828719448 bytes
Database Buffers 1459617792 bytes
Redo Buffers 16531456 bytes
資料庫裝載完畢。
SQL> archive log list;
資料庫日誌模式 非存檔模式
自動存檔 禁用
存檔終點 USE_DB_RECOVERY_FILE_DEST
最早的聯機日誌序列 30
當前日誌序列 32
SQL> alter database archivelog;
資料庫已更改。
SQL> archive log list;
資料庫日誌模式 存檔模式
自動存檔 啟用
存檔終點 USE_DB_RECOVERY_FILE_DEST
最早的聯機日誌序列 30
下一個存檔日誌序列 32
當前日誌序列 32
SQL> alter database open;
資料庫已更改。
記得幫我點贊哦!
精心整理了計算機各個方向的從入門、進階、實戰的視訊課程和電子書,按照目錄合理分類,總能找到你需要的學習資料,還在等什麼?快去關注下載吧!!!
念念不忘,必有迴響,小夥伴們幫我點個贊吧,非常感謝。
我是職場亮哥,YY高階軟體工程師、四年工作經驗,拒絕鹹魚爭當龍頭的斜槓程式設計師。
聽我說,進步多,程式人生一把梭
如果有幸能幫到你,請幫我點個【贊】,給個關注,如果能順帶評論給個鼓勵,將不勝感激。
職場亮哥文章列表:更多文章
本人所有文章、回答都與版權保護平臺有合作,著作權歸職場亮哥所有,未經授權,轉載必究!