ORACLE DB 的學習者們

2017年9月18日 星期一

ORACLE FLASHBACK

flashback 處理user errors。datafile損壞等錯誤則是由一般的備份與還原程序處理。

flashback 只可用在 table drop,不含 table truncation

flashback drop, flashback query, flashback transaction, flashback table 不須額外的設定

flashback database: 有異動的block images ,定期由database buffer cache,寫入到 flashback buffer(SGA內)

Configuring Flashback Database

  • 確認處於 Archive Log Mode
  • select log_mode from v$database;
  • 設定 FLASH Recovery Area
  •             alter system set db_recovery_file_dest = '/flash_recovery' ;
                alter system set db_recovery_file_dest_size = 8G;
             
  • 設定 flashback retention target (單位: 分鐘)
  • alter system set db_flashback_retention_target = 240;
  • 關閉後再啟動
  •            shutdown immediate;
               startup mount;
            
  • 啟動 flashback logging
  • alter database flashback on;
  • 打開資料庫
  • alter database open open;
  • 如何確認FLASHBACK已經啟動
  • select flashback_on from v$database;

Flashback usage statistics

設定完成後,有以下動態VIEW可觀察

v$flashback_database_log

v$flashback_database_stat

v$sgastat

select * from v$sgastat where name = 'flashback generation buff';

觀察 SGA 中,FLASHBACK 的記憶體使用狀態

Flashback enable

下圖顯示啟動 FLASHBACK 的過程

啟動後再觀察上述動態 VIEW , 可發現上述動態VIEW不再毫無資料

Database recovery point-in-time using Flashback

以下建立一個TABLE,並記錄現在時間,然後將表格刪除,再使用 Database Control 進行復原
以下使用 RMAN 進行復原

在復原前,資料庫必須處於 MOUNT 狀態,然後執行復原

RMAN> shutdown immediate; 
RMAN> startup mount;
RMAN> run{ flashback database to time "to_date('2017-09-18 01:20:22', 'YYYY-MM-DD HH24:MI:SS')"; }
RMAN> alter database open resetlogs;
執行畫面如下

執行完畢後,再重新查詢,可再找到該表格

Exclude tablespaces from Flashback Logging

啟動 flashback 後,會將 block 的異動寫入到 flashback logs,因此 logs 的成長會影響資料庫的效能,可將部分 TABLESPACE ,取消其 flashback logging

查詢 TABLESPACES 的 FLASHBACK 啟動狀態可用下列指令

select name, flashback_on from v$tablespace;

取消 FLACKBACK

alter tablespace flashback off;

開啟 FLASHBACK

alter tablespace flashback on;

因為 FLASHBACK 是透過 CONTROLFILE 啟動,而非資料字典,因此其相關資訊需透過動態效能視表(dynamic performance view)查詢,如 v$tablespace,而非資料字典 (DBA_TABLESPACES)。

Flashback DROP

Flashback Drop 用於 table recovery,透過 flashback drop,被刪除(不包含 truncate)的表格,可復原和無法復原的物件如下

  • 可復原物件: table, index, grant, triggers, grants, unique-key, primary-key, not-null constraints。
  • 無法復原物件:foreign constraints
從版本 10g 以後,drop table命令,會將原有 table,以重新命名的方式,從資料字典移開

DROP 以後,物件會被放置到 Recyclebin,可用 USER_RECYCLEBIN 或是 DBA_RECYCLEBIN 來查詢

舉例來說,以下刪除某個表格

刪除以後查詢回收桶

select OBJECT_NAME, ORIGINAL_NAME, OPERATION, TYPE, CAN_UNDROP, CAN_PURGE from user_recyclebin;

查詢後透過 FLASHBACK 復原

SQL> flashback table emp_082209 to before drop;

Flashback complete.
上述命令亦可改為

SQL> flashback table emp_082209 to before drop rename to new_name;

也可以透過ENTERPRISE MANAGER 的DATABASE CONTROL 來復原,但必須以 SYSDBA 身分登入,選擇以下路徑

使用狀態 ==> 管理 ==> 執行復原 ==> 下拉選單選擇(表格) ==> 倒溯刪除的表格 ==> 綱要名稱 (輸入 HR ) ==> 執行

Flashback Query

Flashback Query最常使用在使用者不慎刪除某個表格內的某筆紀錄 (不是整個表格),透過它確認已經刪除的資料。

常用語法如下:

--查詢某個時間戳記,某表格的內容
SQL> select * from hr.emp_082209 as of timestamp to_timestamp('18-09-17 01:22:00','dd-mm-yy hh24:mi:ss') ;
--將某個表格,回逤到某個時間戳記
SQL> flashback table emp to timestamp to_timestamp('18-09-17 01:22:00','dd-mm-yy hh24:mi:ss') ;
--一次回朔兩個表格到某個 SCN ,同時啟用 TRIGGERS
SQL> flashback table emp, dept to scn 65544 enable triggers ;

前述回逤時間戳記,有一個先決條件,必須開啟 ROW MOVEMENT。語法如下:

SQL> ALTER TABLE XXX ENABLE ROW MOVEMENT ;

假設欲刪除某表格最後一筆資料如下

先記錄時間戳記,將表格開放 ROW MOVEMENT,然後將該筆資料刪除

SQL> select sysdate from dual;

SYSDATE
-------------------
2017-09-18 20:28:10

SQL> alter table hr.emp_082209 enable row movement;

Table altered.

SQL> delete from hr.emp_082209 where last_name='Jeng';

1 row deleted.

SQL> commit;

Commit complete.
刪除以後該筆資料消失

以 FLASHBACK TABLE 命令復原該表格至前述時間戳記(或之前)

SQL> flashback table hr.emp_082209 to timestamp to_timestamp('18-09-17 20:28:00','dd-mm-yy hh24:mi:ss') ;                                   
Flashback complete.
復原以後再查詢,可以看到原先被刪除的最後一筆資料又出現了。

Flashback Versions Query

Flashback Versions Query 可讓使用者查詢某表格中,一筆紀錄的數個committed versions。

這些資訊被包含在表格的數個虛擬欄位當中 (ROW ID也是虛擬欄位),虛擬欄位有:

  • VERSIONS_STARTSCN
  • VERSIONS_STARTTIME
  • VERSIONS_ENDSCN
  • VERSIONS_ENDTIME
  • VERSIONS_XID
  • VERSIONS_OPERATION
為了實驗,我們在短時間內對某一筆的SALARY進行數次更新,然後我們進行 FLASHBACK VERSIONS QUERY

欲查詢上述虛擬欄位,需在查詢時,在SQL中使用關鍵字 VERSIONS BETWEEN ,例如,

select employee_id, first_name, salary, VERSIONS_XID, VERSIONS_STARTSCN, VERSIONS_ENDSCN, VERSIONS_OPERATION 
from emp_082209
versions between scn minvalue and maxvalue
where last_name='Jeng';
  • versions between scn minvalue and maxvalue
  • versions between timestamp (SYSTIMESTAMP- 1/24) and SYSTIMESTAMP
  • versions between timestamp to_timestamp('19-09-17 08:10:00','dd-mm-yy hh24:mi:ss') and SYSTIMESTAMP
VERSIONS_OPERATION 包含下列:(I) INSERT (U) UPDATE (D) DELETE

Flashback and Undo Data

Flashback 能復原的資料,端視存放在 UNDO DATA 的歷史資料而異。此區域的資料會被新的資料所覆蓋。UNDO DATA資料保留的時間長度,由參數 undo_retention 決定。 下圖顯示保留時間為900秒,也就是15分鐘。
如果該區域過小導致舊的資料被覆蓋,將會發生 ORA-1555 snapped too old 的錯誤訊息。 要改善此種狀況可透過設定TABLESPACE的參數 RETENTION GUARANTEE 來改善,或是透過下列的 FLASHBACK DATA ARCHIVE 來紀錄更多歷史資料。

FLASHBACK DATA ARCHIVE

FLASHBACK DATA ARCHIVE 使用額外的 TABLESPACE 來記錄歷史資料,其進行步驟如下

  • Create tablespace
  • Create flashback archive
  • Create user & schema that using the flashback data archive
  • Grant flashback archive on to user
  • Alter table flashback archive
範例如下 :
create tablespace fda datafile '/oracle/app/oracle/oradata/sedb/fda1.dbf' size 10m;

create flashback archive fla1 tablespace fda retention 1 month;

CREATE USER fbdauser
  IDENTIFIED BY xxxx
  DEFAULT TABLESPACE fda
  TEMPORARY TABLESPACE TEMP
  PROFILE DEFAULT
  ACCOUNT UNLOCK;
  
  GRANT CONNECT TO fbdauser;
  GRANT RESOURCE TO fbdauser;
  ALTER USER fbdauser DEFAULT ROLE ALL;
  -- 2 System Privileges for PROCHUB 
 
  
  grant dba to fbdauser identified by xxxx;

grant flashback archive administer to fbdauser;
  
  grant flashback archive on fla1 to hr;
  alter table hr.emp_082209 flashback archive fla1;


建立後,可透過下列 VIEW 來觀察使用狀況
  • dba_flashback_archive
  • dba_flashback_archive_ts
  • dba_flashback_archive_tables
例如:

2017年9月4日 星期一

Online Redo Log Multiplexing and Recovery

Online redo log files 如果有 multiplex ,若不慎遺失同組內的其中一個檔案,資料庫不至於無法使用,也不會有資料遺失,但會有錯誤訊息。但若未將logfile做multiplex,則logfile的損壞可能對資料庫狀態及使用者資料都有損傷。

透過V$LOG 調查目前LOGFILE的狀況,有三個欄位特別重要:

GROUP : 顯示目前有幾個GROUP

ARCHIVED: YES表示,LOGFILE 寫入到 ARCHIVE LOGFILE

STATUS : CURRENT表示資料庫正在寫入使用此LOGFILE,INACTIVE表示已經寫入完成

透過V$LOGFILE看出,每個GROUP只有一個LOGFILE

先將每個GROUP 加入所要的LOGFILE

加入以後,要調整LOGFILE成兩兩成對的模式,要將多出來的LOGFILE刪除。刪除前,必須反覆地運用 alter system switch logfile 指令,強迫資料庫將CURRENT移動到其他 GROUP, 然後靜候GROUP 的狀態由CURRENT => ACTIVE => INACTIVE,才能對該成員LOGFILE做刪除的動作。

刪除的SQL並非會真正在作業系統中刪除該成員,而是在SQL執行完畢後,回到作業系統,以作業系統的指令刪除。

2017年9月3日 星期日

User-Managed Backup

Backup & Recovery的分類

Backup 分為 Closed 及 Open,Recovery 則分為 Complete 及 Incomplete。
  • Backup
    • Closed : Noarchivelog Mode 適用,資料庫Shutdown
      • Close the controlfile
      • Close the online logfile
      • Close the datafile
    • Open : 只有 Archivelog Mode 可以,資料庫Open
      • Alter database backup control file to ...
      • Archive the online logfile
      • Alter tablespace .... begin backup - copy the datafiles - alter tablespace .... end backup
  • Restore & recover
    • Complete
      • Take the damaged file offline
      • Restore it
      • Recover it
      • Bring it online
    • Incomplete
      • Mount the database
      • Restore all datafiles
      • Recover database until ...
      • Open resetlogs

Noarchivelog Mode Backup

此模式只能選用Closed Backup,備份前,需關閉資料庫,將檔案使用作業系統的命令來複製。但複製前必須確認所複製檔案沒有漏掉。可在資料庫關閉前使用下列命令來產生完整複製的指令。

select 'cp     ' || name || '    /home/oracle/bkup' from v$controlfile  ; 
select 'cp     ' || name || '    /home/oracle/bkup' from v$datafile  ; 
select 'cp     ' || name || '    /home/oracle/bkup' from v$tempfile  ; 
select 'cp    ' || member || '    /home/oracle/bkup' from v$logfile  ; 

Archivelog Mode Backup

User-Managed Backup 主要包含CONTROLFILE 和 DATAFILE 的備份

要先確定資料庫屬於 ARCHIVELOG MODE

    以下範例展示在 Archivelog Mode下進行的User-managed backup
  1. 建立暫時的TABLESPACE
  2. create tablespace ex181 datafile '/oracle/app/oracle/oradata/sedb/ex181.dbf' size 10m extent management local segment space management auto;
  3. 在新的表格空間建立新TABLE
  4. create table t1 (c11 date) tablespace ex181;
  5. 將TABLESPACE 設定為 BACKUP MODE
  6. alter tablespace ex181 begin backup ;
  7. Backup datafile
  8. [oracle@db01 bkup]$ cp /oracle/app/oracle/oradata/sedb/ex181.dbf /home/oracle/bkup/ex181.dbf
  9. 將TABLESPACE 設定結束 BACKUP MODE
  10. alter tablespace ex181 end backup;
  11. 對CONTROLFILE做BINARY BACKUP
  12. alter database backup controlfile to '/home/oracle/bkup/controlfile01.bin';
  13. 對CONTROLFILE做Logical BACKUP
  14. alter database backup controlfile to trace as '/home/oracle/bkup/controlfile01.log';

2017年8月25日 星期五

ORACLE Data Recovery Advisor

Oracle Data Recovery Advisor (DRA) 可以用來偵測並且處理資料庫失效事件

SCENARIOS 1:非系統的 DATAFILE 遺失

首先進行備份

rman target /
 
backup as backupset tablespace uses ;
backup as backupset incremental level 0 database;
backup database plus archivelog delete all input;
list backup of tablespace uses;
shutdown immediate;
exit;
將資料庫關閉。將某一DATAFILE (非系統) 搬移到其他位置,然後啟動,將發生下列錯誤訊息
出現錯誤訊息。執行RMAN並登入,查詢錯誤訊息(LIST FAILURE)之細節。

呼叫DRA,找出修正方案

執行修正程序

SCENARIOS 2:非系統的 DATAFILE 損壞

首先進行備份

rman target /
 
backup as backupset tablespace noncrit;
backup as backupset incremental level 0 database;
backup database plus archivelog delete all input;
list backup of tablespace noncrit;
shutdown immediate;
exit;
然後使用編輯器去編輯DATAFILE,記得對第一列的DATAFILE做異動

編輯存檔後,當資料庫關閉時將發生錯誤

進入RMAN,透過DRA 查詢錯誤

查詢解決方案

查詢完畢,在RMAN 底下執行 REPAIR FAILURE 指令,將一步一步進行修復

RMAN> repair failure;

Strategy: The repair includes complete media recovery with no data loss
Repair script: /oracle/app/oracle/diag/rdbms/prisedb/sedb/hm/reco_107603627.hm

contents of repair script:
   # restore and recover datafile
   restore datafile 14;
   recover datafile 14;

Do you really want to execute the above repair (enter YES or NO)? yes
executing repair script

Starting restore at 2017-08-25 23:05:25
using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00014 to /oracle/app/oracle/oradata/sedb/noncrit.dbf
channel ORA_DISK_1: reading from backup piece /oracle/app/oracle/flash_recovery_area/PRISEDB/backupset/2017_08_25/o1_mf_nnndf_TAG20170825T205615_dt1wc0bs_.bkp
channel ORA_DISK_1: piece handle=/oracle/app/oracle/flash_recovery_area/PRISEDB/backupset/2017_08_25/o1_mf_nnndf_TAG20170825T205615_dt1wc0bs_.bkp tag=TAG20170825T205615
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:15
Finished restore at 2017-08-25 23:05:40

Starting recover at 2017-08-25 23:05:40
using channel ORA_DISK_1

starting media recovery

archived log for thread 1 with sequence 401 is already on disk as file /oracle/app/oracle/oradata/archivelog/1_401_904775628.dbf
archived log for thread 1 with sequence 402 is already on disk as file /oracle/app/oracle/oradata/archivelog/1_402_904775628.dbf
archived log for thread 1 with sequence 403 is already on disk as file /oracle/app/oracle/oradata/archivelog/1_403_904775628.dbf
archived log file name=/oracle/app/oracle/oradata/archivelog/1_401_904775628.dbf thread=1 sequence=401
media recovery complete, elapsed time: 00:00:07
Finished recover at 2017-08-25 23:05:48
repair failure complete

Do you want to open the database (enter YES or NO)? yes
database opened

SCENARIOS 3:Incomplete Recovery with RMAN (Point-in-Time Recovery)

非完全的復原(Recovery)只能在資料庫處於 MOUNT 狀態下時進行,且須擁有資料庫及ARCHIVE LOG的備份才行。進行該復原只有兩個原因: Complete Recovery 不可能或無法實施;或是刻意回到過去特定時間點,故意忽略或遺失該時間點之後的資料變更。例如,某時間點不慎將某 TABLE 或甚至 TABLESPACE 刪除,或不慎進行了某個條件錯誤的DML,導致使用者資料被錯誤地刪改。

Incomplete Recovery 有以下四個步驟

  1. Mount the database
  2. Restore all the datafiles
  3. Recover the database until a certain point
  4. Open the database with reset logs
Incomplete Recovery 有三個選項

  1. Until time
  2. Until system change number
  3. Until log sequence number
前置工作:進行資料庫與ARCHIVE LOG 的備份

設定 NLS_DATE_FORMAT 環境參數,並進行備份

在UNIX下,執行

export NLS_DATE_FORMAT="dd-mm-yy hh24:mi:ss"

開兩個視窗,一個是RMAN,另一個是SQLPLUS,兩個都去設定前述的 NLS_DATE_FORMAT

RMAN

[oracle@db01 ~]$ rman target /
connected to target database: SEDB (DBID=1140755226)

RMAN> backup as compressed backupset database;
Starting backup at 26-08-17 15:30:36
using target database control file instead of recovery catalog
......
Finished Control File and SPFILE Autobackup at 26-08-17 15:33:16
SQLPLUS 以SYSTEM身分登入SQLPLUS CONSOLE,執行

SQL> alter system switch logfile;

RMAN 再回到RMAN視窗,備份ARCHIVED LOG

RMAN> backup archivelog all delete all input;

Starting backup at 26-08-17 15:44:12
current log archived
using channel ORA_DISK_1
channel ORA_DISK_1: starting archived log backup set
......
Finished Control File and SPFILE Autobackup at 26-08-17 15:45:24
SQLPLUS 以SYSTEM身分登入SQLPLUS CONSOLE,執行下列步驟

SQL> alter system switch logfile;

紀錄異動前時間點,並且插入一筆資料

SQL> select sysdate from dual;   --紀錄刪除前時間

SYSDATE               
-----------------    
26-08-17 15:47:57    
SQL> insert into system.ex16 values(sysdate);   --插入一筆資料

1 row created.

SQL> commit;

Commit complete.
SQL> drop tablespace noncrit including contents and datafiles;   --刪除TABLESPACE

Tablespace dropped.
RMAN

產生一個復原用的 CONTROLFILE,它的時間點為刪除TABLESPACE 之前,也就是剛剛執行 SELECT SYSDATE 的時間。

RMAN> run{
2> shutdown immediate;
3> startup mount;
4> set until time = '26-08-17 15:46:00';
5> restore controlfile to '/oracle/app/oracle/oradata/sedb/control03.ctl';
6> }
-- 15:47:57 之後,插入一筆,然後刪除 TABLESPACE
-- 步驟 5 : 將復原用的 CONTROLFILE 寫入到新的 CONTROLFILE 檔案 << CONTROLFILE03.CTL >>
database closed
database dismounted
Oracle instance shut down

connected to target database (not started)
Oracle instance started
database mounted

Total System Global Area     477073408 bytes

Fixed Size                     1337324 bytes
Variable Size                297797652 bytes
Database Buffers             171966464 bytes
Redo Buffers                   5971968 bytes

executing command: SET until clause

Starting restore at 26-08-17 16:04:07
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=18 device type=DISK
......
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 26-08-17 16:04:09
執行畫面如下
SQLPLUS 以SYSTEM身分登入SQLPLUS CONSOLE,執行下列步驟

SQL> alter system set control_files='/oracle/app/oracle/oradata/sedb/control03.ctl' scope=spfile;                                                     
System altered.

SQL> shutdown immediate;
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down.

SQL> startup mount;
ORACLE instance started.

Total System Global Area  477073408 bytes
Fixed Size                  1337324 bytes
Variable Size             297797652 bytes
Database Buffers          171966464 bytes
Redo Buffers                5971968 bytes
Database mounted.
SQL> show parameter control_files

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      /oracle/app/oracle/oradata/sed
                                                 b/control03.ctl


RMAN

執行前述的4 個步驟,以進行 INCOMPLETE RECOVERY。

RMAN> run {
2> allocate channel d1 type disk;
3> allocate channel d2 type disk;
4> set until time = '26-08-17 15:46:00';
5> restore database;
6> recover database;
7> alter database open resetlogs;
8> }

using target database control file instead of recovery catalog
allocated channel: d1
channel d1: SID=20 device type=DISK

allocated channel: d2
channel d2: SID=21 device type=DISK
....
executing command: SET until clause

Starting restore at 26-08-17 16:46:45
....
searching for all files in the recovery area
cataloging files...
cataloging done

List of Cataloged Files
=======================
File Name: /oracle/app/oracle/flash_recovery_area/PRISEDB/autobackup/2017_08_26/                                                                                        o1_mf_s_953049400_dt3z58tf_.bkp
.....
Finished restore at 26-08-17 16:48:44

Starting recover at 26-08-17 16:48:44

starting media recovery

archived log for thread 1 with sequence 408 is already on disk as file /oracle/a                                                                                        pp/oracle/oradata/archivelog/1_408_904775628.dbf
.....
media recovery complete, elapsed time: 00:00:02
Finished recover at 26-08-17 16:48:48

database opened
released channel: d1
released channel: d2

此時已經完成復原,回到刪除TABLESPACE 之前,而在刪除前INSERT的紀錄也因為復原而消失
檢查 V$LOG,確認 LOG SEQUENCE 是否已經重置

Block Recovery

一般而言,RMAN在備份時若遇到BLOCK ERROR時,會中斷備份。若在備份前設定BLOCK ERROR的可容許範圍,則在發生BLOCK ERROR時,RMAN不會被中斷。

若是出現BLOCK ERROR時,可採取的步驟如下:

RMAN> run {
  set maxcorrupt for datafile 7 to 100;
  backup datafile 7;
  }
  
  RMAN> block recover datafile 7 block 5;
  
  RMAN> block recover datafile 7 blocck 5,6,7 datafile 9 block 21,25;
  -- 一次復原數個BLOCK
  RMAN> block recover datafile 7 block 5 from backupset 1093;
  
  RMAN> block reselect * from v$database_block_corruption;

  RMAN> block recover corruption list until time sysdate - 7;

要查詢有哪些 BLOCK 有損壞,可透過下列 VIEW 來查詢

select * from v$database_block_corruption;

select * from v$backup_corruption;

select * from v$copy_corruption;

管理 RMAN 的PROCESS

RMAN的 PROCESS 可以由 V$PROCESS 和 V$SESSION 兩個VIEW做JOIN 來查詢

select sid, spid, client_info
from v$process p join v$session s on (p.addr = s.paddr)
where client_info like '%rman%';
但是上述查詢要透過欄位 CLIENT_INFO來查詢

透過 SET COMMAND ID 可以將欄位寫入註解資訊以利查詢

run
{
   set command id to 'bkup database';
   backup as compressed backupset database delete all input;
}
插入COMMAND ID 以後,可用下列方式查詢

select sid, spid, client_info
from v$process p join v$session s on (p.addr = s.paddr)
where client_info like '%id=%';
查詢顯示如下
另外一個可以查詢的動態VIEW 是 V$SESSION_LONGOPS,但在查詢以前,必須將參數 STATISTICS_LEVEL 設為 TYPICAL 或是 ALL

設為上述 LEVEL 以後,透過上述設定 RMAN 的 COMMAND ID,在執行RMAN的同時,可以查詢執行結果

select sid, serial#, opname, sofar, totalwork
from v$session_longops
where opname like 'RMAN%'
and sofar <> totalwork;
結果如下

2017年8月24日 星期四

ORACLE HEALTH MONITOR

HEALTH MONITOR 可檢查資料庫健康狀態。在ENTERPRISE MANAGER 或 DATABASE CONTROL 管理網頁,其路徑為:

軟體和支援 ==> 建議程式中心

由建議程式中心==> 選擇 檢查程式

2017年8月21日 星期一

RMAN 備份的實作

BACKUP的基本觀念

  1. OPEN Backup: (備份時資料庫是開啟的): 資料庫必須是 ARCHIVE MODE
  2. CLOSE Backup: (備份時資料庫是關閉的): 資料庫是 NONARCHIVE MODE
  3. Offline Backup: (備份時資料庫是關閉的): 資料庫是 NONARCHIVE MODE
  4. Partial Backup: (備份部分檔案): 資料庫必須是 ARCHIVE MODE
RMAN BACKUP可以備份下列檔案

  1. Datafiles
  2. Controlfile
  3. Archive redo log files
  4. SPFILE
  5. Backup set pieces
但是RMAN不可以備份下列檔案

  1. Tempfiles
  2. Online redo log files
  3. Password file
  4. Static PFILE
  5. Oracle Net Configuration files

RMAN有三種備份型態

  1. Backup Set: 可採用漸進式備份
  2. Compressed Backup Set: 同上,但經過壓縮
  3. Image Copy: 較占空間,不可採用漸進式備份,也不可備份SPFILE檔案。但是在還原時速度較快
漸進式備份有三方面的優勢:備份所費時間、備份所需空間、對使用者的影響。

BACKUP SETS 是最小的備份單位,比原始檔或是IMAGE COPIES(另一種備份格式) 都來得小。

開始漸進式備份,首先須建立備份基線

backup as backupset incremental level 0 database;

接下來有兩種漸進式備份方式

Differential 備份

backup as backupset incremental level 1 database;

RMAN> backup as backupset incremental level 1 database;

Starting backup at 2017-08-21 13:19:13
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=42 device type=DISK
channel ORA_DISK_1: starting incremental level 1 datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/oracle/app/oracle/oradata/sedb/system01.dbf
input datafile file number=00003 name=/oracle/app/oracle/oradata/sedb/undotbs01.dbf
input datafile file number=00002 name=/oracle/app/oracle/oradata/sedb/sysaux01.dbf
input datafile file number=00006 name=/oracle/app/oracle/oradata/sedb/TBS_PRETORIA_01.dbf
input datafile file number=00007 name=/oracle/app/oracle/oradata/sedb/TBS_NOVATEKTEST_01.dbf
input datafile file number=00008 name=/oracle/app/oracle/oradata/sedb/TBS_REPAIR_01.dbf
input datafile file number=00010 name=/oracle/app/oracle/oradata/sedb/STORETABS_01.dbf
input datafile file number=00011 name=/oracle/app/oracle/oradata/sedb/STORETABS_02.dbf
input datafile file number=00005 name=/oracle/app/oracle/oradata/sedb/TBS_PROCHUB_01.dbf
input datafile file number=00009 name=/oracle/app/oracle/oradata/sedb/TBS_PRE_IND_01.dbf
input datafile file number=00013 name=/oracle/app/oracle/oradata/sedb/vpd_admin.dbf
input datafile file number=00012 name=/oracle/app/oracle/oradata/sedb/TBS_NEWTBS_01.dbf
input datafile file number=00004 name=/oracle/app/oracle/oradata/sedb/users01.dbf
channel ORA_DISK_1: starting piece 1 at 2017-08-21 13:19:14
channel ORA_DISK_1: finished piece 1 at 2017-08-21 13:21:00
piece handle=/oracle/app/oracle/flash_recovery_area/PRISEDB/backupset/2017_08_21/o1_mf_nnnd1_TAG20170821T131914_dspj23nb_.bkp tag=TAG20170821T131914 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:01:46
Finished backup at 2017-08-21 13:21:00

Starting Control File and SPFILE Autobackup at 2017-08-21 13:21:00
piece handle=/oracle/app/oracle/flash_recovery_area/PRISEDB/autobackup/2017_08_21/o1_mf_s_952608060_dspj5gc3_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2017-08-21 13:21:03

Cumulative 備份

backup as backupset incremental level 1 cumulative database;

RMAN> backup as backupset incremental level 1 cumulative database;

Starting backup at 2017-08-21 13:21:51
using channel ORA_DISK_1
channel ORA_DISK_1: starting incremental level 1 datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/oracle/app/oracle/oradata/sedb/system01.dbf
input datafile file number=00003 name=/oracle/app/oracle/oradata/sedb/undotbs01.dbf
input datafile file number=00002 name=/oracle/app/oracle/oradata/sedb/sysaux01.dbf
input datafile file number=00006 name=/oracle/app/oracle/oradata/sedb/TBS_PRETORIA_01.dbf
input datafile file number=00007 name=/oracle/app/oracle/oradata/sedb/TBS_NOVATEKTEST_01.dbf
input datafile file number=00008 name=/oracle/app/oracle/oradata/sedb/TBS_REPAIR_01.dbf
input datafile file number=00010 name=/oracle/app/oracle/oradata/sedb/STORETABS_01.dbf
input datafile file number=00011 name=/oracle/app/oracle/oradata/sedb/STORETABS_02.dbf
input datafile file number=00005 name=/oracle/app/oracle/oradata/sedb/TBS_PROCHUB_01.dbf
input datafile file number=00009 name=/oracle/app/oracle/oradata/sedb/TBS_PRE_IND_01.dbf
input datafile file number=00013 name=/oracle/app/oracle/oradata/sedb/vpd_admin.dbf
input datafile file number=00012 name=/oracle/app/oracle/oradata/sedb/TBS_NEWTBS_01.dbf
input datafile file number=00004 name=/oracle/app/oracle/oradata/sedb/users01.dbf
channel ORA_DISK_1: starting piece 1 at 2017-08-21 13:21:52
channel ORA_DISK_1: finished piece 1 at 2017-08-21 13:23:47
piece handle=/oracle/app/oracle/flash_recovery_area/PRISEDB/backupset/2017_08_21/o1_mf_nnnd1_TAG20170821T132151_dspj70kr_.bkp tag=TAG20170821T132151 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:01:55
Finished backup at 2017-08-21 13:23:47

Starting Control File and SPFILE Autobackup at 2017-08-21 13:23:47
piece handle=/oracle/app/oracle/flash_recovery_area/PRISEDB/autobackup/2017_08_21/o1_mf_s_952608228_dspjbntn_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2017-08-21 13:23:51
不管哪種方式都會產生兩個BACKUPSET,第一個是所有的DATAFILES,第二個是CONTROL FILE 及 SPFILE

當進行第二次的漸進式備份時,出現下列錯誤

channel ORA_DISK_1: starting piece 1 at 2017-08-21 16:27:41
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 08/21/2017 16:32:07
ORA-19809: limit exceeded for recovery files
ORA-19804: cannot reclaim 52428800 bytes disk space from 5218762752 limit
透過TOAD發現 FLASH_RECOVERY_FILE_DEST_SIZE 的大小太小了

其大小原為

修正後為

alter system set db_recovery_file_dest_size=5G;

修正完畢後可以存放兩組漸進式的備份

Backupset 備份

      backup as compressed backupset filesperset 4 database;
-- 將BACKUPSET 分為四個檔案儲存
      backup as compressed backupset archivelog all delete all input;
-- 將ARCHIVELOG 壓縮儲存
      backup as backupset format '/backup/orcl/df_%d_%s_%p' tablespace g1_tabs;
-- 備份表格空間 gl_tabs 
      backup as compressed backupset datafile 4;
-- 以編號命名 Datafile ,並壓縮後儲存
      backup as backupset archivelog like '/u01/archivel/arch_1%';
-- 搜尋目錄內符合PATTERN的ARCHIVE LOG,並加以備份
漸進式備份雖然可產生較小的備份檔案,但是備份較花時間,原因是它必須花時間掃描全部的DATAFILE。

BLOCK CHANGE TRACKING 技術,在背景執行一支程序,稱為 Change Tracking Writing (CTW), 它將每個BLOCK更動的紀錄,紀載在一個稱之為 change tracking file 的 DBF 檔案上

以下命令開啟 CTW 程序,並將BLOCK變動紀錄紀載到所指定到的DBF檔案

以下參考文章 或是 OCA OCP Oracle Database 11g All-in-One Exam Guide Chapter 15

alter database enable block change tracking using file '/oracle/app/oracle/oradata/sedb/change_tracking.dbf';

CTW 狀態和紀錄檔可由 V$BLOCK_CHANGE_TRACKING 來檢視

select * from v$block_change_tracking;

下列SQL查詢是否 CTW 已經啟動

select program from v$process where program like '%CTWR%';

啟動 CTW 程序以後,漸進式備份所需的時間降低了。 BLOCKS_READ 與 DATAFILE_BLOCKS 的比例由 1 降到 1 以下

以下SQL可以驗證,開啟CTW以後,資料庫SCAN讀取DATAFILE的比例降低到 1 以下

select file#, datafile_blocks, (blocks_read / datafile_blocks) * 100
    as pct_read_for_backup from v$backup_datafile
    where used_change_tracking='YES' and incremental_level > 0
關閉 CTW 則透過以下指令

SQL> alter database disable block change tracking;

建立保留長期的備份 ARCHIVAL BACKUPS

長期備份,例如,建立一個保留90天的備份檔,該備份不受 DELETE OBSOLETE,也不受 RETENTION POLICY 的影響

語法如下:

backup database as compressed backup set keep until time 'sysdate + 90' restore point quarterly_backup;

RMAN 備份的管理

可以運用LIST及REPORT,配合DELETE指令處理

list backup;
list copy;
list backup of database;
list backup of datafile 1;
list backup of tablespace users;
list backup of archivelog all;
list copy of archivelog from time='sysdate - 7';
list backup of archivelog from sequence 1000 until sequence 1050;
list backup of spfile;
list backup of controlfile;

report schema
report need backup;
report need backup days 3;
report need backup redundancy 3;
report obsolete;
delete obsolete;
report obsolete redundancy 2;
delete obsolete redundancy 2;
delete backupset 4;
delete copy of datafile 6 file6_extra;

RMAN 相關的 DYNAMIC VIEW

下列的 DYNAMIC VIEW 提供比LIST/REPORT命令更多的資訊,來管理備份

select * from  v$backup_files  ;
select * from  v$backup_set  ;
select * from  v$backup_piece   ;
select * from  v$backup_redolog  ;
select * from  v$backup_spfile  ;
select * from  v$backup_datafile  ;
select * from  v$backup_device  ;
select * from  v$rman_configuration  ;
備份的空間使用狀況可由 V$FLASH_RECOVERY_AREA_USAGE 來顯示,例如

select * from v$flash_recovery_area_usage;

2017年8月18日 星期五

MTTR平均修復時間參數的調整

FAST_START_MTTR_TARGET 預設值為 0,因此系統預設以最高效能來運行。

上述參數有系統建議的可行數值

使用 EM ,在管理網頁上可以看到它的建議程式 MTTR ADVISOR,由它來建議可行數字