1. 程式人生 > 實用技巧 >Oracle資料庫備份和恢復

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高階軟體工程師、四年工作經驗,拒絕鹹魚爭當龍頭的斜槓程式設計師。

聽我說,進步多,程式人生一把梭

如果有幸能幫到你,請幫我點個【贊】,給個關注,如果能順帶評論給個鼓勵,將不勝感激。

職場亮哥文章列表:更多文章

本人所有文章、回答都與版權保護平臺有合作,著作權歸職場亮哥所有,未經授權,轉載必究!