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';