2014年11月6日 星期四

Xmanager 登入 AIX CDE 連線失敗




今天使用 Xmanager 登入時 AIX CDE 時,出現了以下畫面





畫面提示了很清楚, 這時只要在 /etc/hosts 加上 AIX IP + hostname 就可, 如下圖 (hostname 用 #hostname 指令就可以得知)




修改完後, 在登入就可以囉



補充

在使用 Xmanager 4.0 登入AIX CDE 並使用Oracle 9i dbca 在進行操作時按鈕都會沒反應
一開始以為是 DISPLAY xhostx 的設定問題, 結果只是Xmanager 版本問題
我換上 2.0 後一切就正常(3.0 也不行), 或許可能是9i太舊 Xmanager新版本不支援 ?! 










2014年9月4日 星期四

Oracle Data guard - 主備切換



環境說明


Oracle 11.2.0.1


PRIMARY IP : 192.168.1.101

STANDBY IP : 192.168.1.102


先看一下目前主備庫的腳色


SQL> select name,database_role from v$database;


NAME      DATABASE_ROLE

--------- ----------------
ORCL      PRIMARY

SQL>



SQL> select name,database_role from v$database;


NAME      DATABASE_ROLE

--------- ----------------
ORCL      PHYSICAL STANDBY

SQL>




1.把主庫(1.101)切換為備庫


SQL> alter database commit to switchover to physical standby with session shutdown;


Database altered.


--這時 Primary 上所有Redo 資料都會傳送到 Standby db 上


2.把原主庫(1.101)開到 Standby mount


SQL> shutdown immediate;

ORA-01507: database not mounted
ORACLE instance shut down.
SQL> startup nomount;
ORACLE instance started.

Total System Global Area  313159680 bytes

Fixed Size                  2175328 bytes
Variable Size             264244896 bytes
Database Buffers           41943040 bytes
Redo Buffers                4796416 bytes
SQL> alter database mount standby database;

Database altered.


SQL>



3.檢查 Standby db (1.102)是否都有 apply 


SQL> select sequence# , STANDBY_DEST, APPLIED from v$archived_log;


 SEQUENCE# STA APPLIED

---------- --- ---------
        52 NO  YES
        54 NO  YES
        55 NO  YES
        53 NO  YES
        56 NO  YES
        57 NO  YES
        58 NO  YES
        59 NO  YES

107 rows selected.



SQL>


4.把 Standby db 轉為 Primary


SQL> alter database commit to switchover to primary;


Database altered.


SQL>



--檢查一下(1.102)是否轉為Primary


SQL> select name,database_role from v$database;


NAME      DATABASE_ROLE

--------- ----------------
ORCL      PRIMARY


SQL>



--檢查一下(1.101)是否為Standby


SQL>  select name,database_role from v$database;


NAME      DATABASE_ROLE

--------- ----------------
ORCL      PHYSICAL STANDBY


SQL>

5.檢查完後 把 (1.102) shutdown 並開到 open


SQL> shutdown immediate;

ORA-01109: database not open


Database dismounted.

ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  313159680 bytes

Fixed Size                  2175328 bytes
Variable Size             255856288 bytes
Database Buffers           50331648 bytes
Redo Buffers                4796416 bytes
Database mounted.
Database opened.
SQL>



6.剛剛 (1.101) 已在Standby mount ,所以現在只要開啟應用實作就行


SQL> alter database recover managed standby database disconnect from session;


Database altered.


SQL>





7.檢查是否轉換成功


--在主庫(1.102)進行 swtich logfile 



SQL> alter system switch logfile;


System altered.



SQL> select sequence# , STANDBY_DEST, APPLIED from v$archived_log;

 SEQUENCE# STA APPLIED
---------- --- ---------
        61 NO  NO
        62 YES NO
        62 NO  NO

113 rows selected.


SQL>



--查看備庫(1.101) 是否有接收到並且應用


SQL> select sequence# , STANDBY_DEST, APPLIED from v$archived_log;


 SEQUENCE# STA APPLIED
---------- --- ---------
        58 YES NO
        58 NO  YES
        59 NO  YES
        59 YES NO
        60 NO  YES
        61 NO  YES
        62 NO  YES

106 rows selected.



SQL>

--測試成功


--在做一個測試

--在(1.102)主庫建立一個 table

SQL> create table test_dg100 as select * from dba_objects;


Table created.


SQL> select count(*) from test_dg100;


  COUNT(*)

----------
     72623


SQL> alter system switch logfile;

System altered.


SQL>




--查詢(1.101)備庫是否此Table 訊息 (必須開啟到 open read only 狀態



SQL> startup mount;

ORACLE instance started.

Total System Global Area  313159680 bytes

Fixed Size                  2175328 bytes
Variable Size             264244896 bytes
Database Buffers           41943040 bytes
Redo Buffers                4796416 bytes
Database mounted.
SQL> alter database open read only;

Database altered.


SQL>  select count(*) from test_dg100;


  COUNT(*)

----------
     72623

SQL>




--測試成功




上面是Primary DB還能開啟做的切換(Switchover),以下介紹的是Primary DB連開啟都不能開啟的切換(Failover)


Failover 最重要的是Redo file 的處理,要是處理的不當就會造成資料遺失

Data guard 保護模式有分成三種 Maximum Protection 最大保護、Maximum Availability 最高可用、Maximum Performance 最高性能

最大保護以及最高可用是以 LGWR SYNC AFFIRM 模式傳遞,主備庫兩邊的Redo file是一樣的,這邊就可以不用處理Redo file,不過在主庫還沒有Commit的交易當然就遺失了

假如最高性能是以 ARCH ASYNC 傳遞,這邊就要DBA手動去處理了



以下是針對 PERFORMANCE 的 Failover 小小測試

1.先看一下主備庫的模式 

SQL>  select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE

SQL>


2.先在主庫創建 Table 好等等來驗證看看是否成功

SQL> create table test_dg101 as select * from dba_objects;

Table created.

SQL> select count(*) from test_dg101;

  COUNT(*)
----------
     72624

SQL> commit;


Commit complete.



--因為傳輸模式是ARCH,備庫還沒接收到 Archive log file,備庫所以當然就沒有此Table

SQL> select count(*) from test_dg101;
select count(*) from test_dg101
                     *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL>


3.模擬主庫 crash 


SQL> shutdown abort
ORACLE instance shut down.
SQL>

4.首先先把主庫的Redo log file傳送到Standby db上,這邊archive log file 已經都傳送過來Standby 所以就只處理Redo log 的部份,要是有archive log file 還未傳送到Standby 可以手動拉檔案過來再利用指令 SQL> ALTER DATABASE REGISTER LOGFILE '路径' 註冊進去

--關閉實做應用
SQL> alter database recover managed standby database cancel;

Database altered.

--利用Redo log file 恢復 Standby db 
SQL> recover standby database until cancel;
ORA-00279: change 1982951 generated at 09/04/2014 15:31:55 needed for thread 1
ORA-00289: suggestion : D:\ARCHIVE\ARC0000000069_0857233024.0001
ORA-00280: change 1982951 for thread 1 is in sequence #69


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
D:\test\REDO01.LOG
Log applied.
Media recovery complete.

SQL>

--有三個Redo log ,很幸運的試一次就成功


5.接著激活Standby db 讓它變成 Primary

SQL> shutdown immediate;
SQL> startup mount;
ORACLE instance started.

Total System Global Area  313159680 bytes
Fixed Size                  2175328 bytes
Variable Size             264244896 bytes
Database Buffers           41943040 bytes
Redo Buffers                4796416 bytes
Database mounted.
SQL>

SQL> alter database activate standby database;

Database altered.

SQL> alter database open;

Database altered.

SQL> SELECT DATABASE_ROLE FROM V$DATABASE;

DATABASE_ROLE
----------------
PRIMARY

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ WRITE


SQL>


--成功轉為 Primary


6.驗證

SQL> select count(*) from test_dg101;

  COUNT(*)
----------
     72624

SQL>



--資料成功恢復



















2014年9月2日 星期二

Oracle - Data Guard 保護模式轉換




Oracle Data Guard 的保護模式有提供三種Maximum Protection,Maximum Availability 和 Maximum Performance。


1.Maximum Protection 最大保護 
提供最安全的保護,在此模式下資料是絕對不會遺失,因為它要求本地 Primary DB 要寫入Redo log file 之前,至少也要寫一份去 Standby Redo log file ,此筆交易才算完成,如果因為網路故障或者某些原因導致 Primary DB無法連線至 Standby DB,這時Primary DB 會強制 Shutdown DB 以確保資料不會被遺失。

這種方式 Standby DB 必須配置Standby Redo Log,而 Primary DB 傳輸方式必須使用LGWR SYNC AFFIRM 模式


2.Maximum Availability 最高可用
此種模式也是提供最大保護,也是一樣要求本地 Primary DB 要寫入Redo log file 之前,至少也要寫一份去 Standby Redo log file ,此筆交易才算完成。差別在於此模式發生斷線,Primary DB 並不會強制Shutdown DB,而是自動切換 Maximum Performance 最高性能 模式,等待網路恢復正常後才會恢復成 Maximum Availability 最高可用

這種方式 Standby DB 也是必須配置Standby Redo Log,而 Primary DB 傳輸方式必須使用LGWR SYNC AFFIRM 模式


3.Maximum Performance 最高性能

這種模式下Primary DB不需等待 Standby Redo log file 寫入完成,所以效能上會比前兩種好,但也因為這樣資料同步上會有延遲。

這種傳輸方式可以用 LGWR ASYNC 或者 ARCH,Standby Database也不要求使用Standby Redo Log。



保護模式可以線上互相切換(除了第4種模擬之外



以下就針對上述的六種情況來做模擬

測試DB版本

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for 64-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production




1.最大性能 > 最高可用

(1.)先查看主備庫目前模式
SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE


(2.)查看log file 有無 standby log file

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER                                   IS_
---------- ------- ------- ---------------------------------------- ---
         1         ONLINE  D:\ORACLE\ORADATA\ORCL\REDO01.LOG        NO
         3         ONLINE  D:\ORACLE\ORADATA\ORCL\REDO03.LOG        NO
         2         ONLINE  D:\ORACLE\ORADATA\ORCL\REDO02.LOG        NO
         4         STANDBY D:\ORACLE\ORADATA\ORCL\REDO04.LOG        NO
         5         STANDBY D:\ORACLE\ORADATA\ORCL\REDO05.LOG        NO
         6         STANDBY D:\ORACLE\ORADATA\ORCL\REDO06.LOG        NO
         7         STANDBY D:\ORACLE\ORADATA\ORCL\REDO07.LOG        NO


7 rows selected.

要是沒有請在Standby DB使用以下指令增加,size大小必須與原使用Redo file一致,建議比照當前Redo log再多建一組Standby Redo file 以供轉換時備用

alter database add standby logfile group 4 'D:\datafile\redo04.log' size 50m;


(3.)調整傳輸模式為 LGWR SYNC AFFIRM



(4.)進行切換, 主備庫都轉為最高可用

SQL> alter database set standby database to maximize availability;

Database altered.

SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM AVAILABILITY RESYNCHRONIZATION

SQL> alter system switch logfile;

System altered.

SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY


SQL>


2.最高可用 > 最大保護

(1.)當前模式
SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

SQL>

(2.)因為傳輸模式已經改好了 LGWR SYNC AFFIRM 所以就可以直接轉換模式

SQL> alter database set standby database to maximize protection;

Database altered.

(3.)轉換成功
SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM PROTECTION   MAXIMUM PROTECTION


SQL>



3.最大保護 > 最大性能

(1.)當前模式
SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM PROTECTION   MAXIMUM PROTECTION

(2.)因為最大性能傳輸模式可以 LGWR 也可以 ARCH 傳輸,這邊就直接下指令轉換
SQL> alter database set standby database to maximize performance;

Database altered.

SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE

SQL>




4.最大性能 > 最大保護

(1.)當前模式
SQL> select database_role,open_mode,protection_mode,protection_level from v$database;

DATABASE_ROLE    OPEN_MODE            PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- -------------------- --------------------
PRIMARY          READ WRITE           MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE


SQL>

(2.)在轉換時出現錯誤,表示所有instance 轉換時都不能在 open 狀態
SQL> alter database set standby database to maximize protection;
alter database set standby database to maximize protection
*
ERROR at line 1:
ORA-01126: database must be mounted in this instance and not open in any instance


SQL>


(3.) 在主DB開啟到 mount 狀態下指令

SQL> startup mount;
ORACLE instance started.

Total System Global Area  313159680 bytes
Fixed Size                  2175328 bytes
Variable Size             264244896 bytes
Database Buffers           41943040 bytes
Redo Buffers                4796416 bytes
Database mounted.
SQL> alter database set standby database to maximize protection;

Database altered.


(4.) 在備DB開啟到 mount 狀態下指令

SQL> startup mount;
ORACLE instance started.

Total System Global Area  313159680 bytes
Fixed Size                  2175328 bytes
Variable Size             264244896 bytes
Database Buffers           41943040 bytes
Redo Buffers                4796416 bytes
Database mounted.
SQL> alter database set standby database to maximize protection;

Database altered.

(5.)主庫open 並且檢查模式
SQL> alter database open ;

Database altered.

SQL> select database_role,open_mode,protection_mode,protection_level from v$database;

DATABASE_ROLE    OPEN_MODE            PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- -------------------- --------------------
PRIMARY          READ WRITE           MAXIMUM PROTECTION   MAXIMUM PROTECTION

SQL>

(6.)備庫 open read only ,並檢查模式

SQL> alter database open read only;

Database altered.

SQL> select database_role,open_mode,protection_mode,protection_level from v$database;

DATABASE_ROLE    OPEN_MODE            PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- -------------------- --------------------
PHYSICAL STANDBY READ ONLY            MAXIMUM PROTECTION   MAXIMUM PROTECTION

SQL>


5.最大保護 > 最高可用

(1). 查詢目前狀態
SQL> select database_role,open_mode,protection_mode,protection_level from v$database;

DATABASE_ROLE    OPEN_MODE            PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- -------------------- --------------------
PRIMARY          READ WRITE           MAXIMUM PROTECTION   MAXIMUM PROTECTION

(2.)轉換指令
SQL> alter database set standby database to maximize availability;

Database altered.

SQL> select database_role,open_mode,protection_mode,protection_level from v$database;

DATABASE_ROLE    OPEN_MODE            PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- -------------------- --------------------
PRIMARY          READ WRITE           MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY


SQL>


6.最高可用 > 最大性能

(1.) 這邊也是依樣直接下指令

SQL>
SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

SQL>
SQL> alter database set standby database to maximize performance;

Database altered.

SQL> select database_role,protection_mode,protection_level from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY          MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE

SQL>




結論:

最大性能要轉最大保護時 DB 必須要在 Mount 才能轉換,為了避免DB還要Shutdown ,可以先從 最大性能 > 最高可用 再從 最高可用 > 最大保護..

2次轉換可以避免Shutdown 後對業務上的影響




2014年8月25日 星期一

Oracle 12c - Row-Archival



現在12C 有個新功能 In-Database Archiving 它允許在Row 上標記為不活躍的狀態,在進行操作時Oracle能自動略過不活躍的ROW,功能可以在session上個別控制


以下進行簡單的測試



--先建立測試的Table


SQL> create table row_archive_Test as select * from dba_objects;

已建立表格.

SQL> insert into row_archive_test select * from dba_objects;

已建立 90980 個資料列.

SQL> /

已建立 90980 個資料列.

SQL> /

已建立 90980 個資料列.

.......


--full table scan 看一下執行計畫如何




--把Table的標記功能開啟



SQL> alter table row_archive_test row archival;

已更改表格.

SQL>

--可以看到Table多了兩個隱藏的欄位, 其中ORA_ARCHIVE_STATE欄位,預設是0, 在官方的解釋裡只要設大於0表示是不活躍的資料

SQL>  SELECT COLUMN_NAME,DATA_TYPE,HIDDEN_COLUMN FROM DBA_TAB_COLS WHERE TABLE_N
AME='ROW_ARCHIVE_TEST';

COLUMN_NAME                    DATA_TYPE            HID
-------------------------     ------------------    -------
SYS_NC00019$                   RAW                   YES
ORA_ARCHIVE_STATE              VARCHAR2              YES
ORACLE_MAINTAINED              VARCHAR2              NO
EDITIONABLE                    VARCHAR2              NO
SHARING                        VARCHAR2              NO
EDITION_NAME                   VARCHAR2              NO
NAMESPACE                      NUMBER                NO


--在Session開啟功能


SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ACTIVE;

已更改階段作業.

SQL>


此參數有兩個值一個是ALL 表示顯示出所有資料, 另外一個是ACTIVE 表示遮蔽不活躍的資料



--把資料進行標記為不活躍, 這邊全標記1


SQL>  UPDATE ROW_ARCHIVE_TEST SET ORA_ARCHIVE_STATE = '1' WHERE OWNER = 'SYS';

已更新 418150 個資料列.

SQL> COMMIT;

確認完成.


SQL>


--full table scan 看一下執行計畫如何



可以看到不活躍的資料都不被顯示出來


--更改參數為 ALL ,資料又可以全部看到

SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ALL;

已更改階段作業.

SQL> select count(*) from ROW_ARCHIVE_TEST;

  COUNT(*)
----------
    908880




延伸閱讀


看到測試中的執行計畫可以發現,原來Oracle是利用ORA_ARCHIVE_STATE欄位進行篩選


那我們利用此欄位來讓 full table scan 的操作效能提升



--建立 bitmap index (因為只有1,0 建bitmap最適合)

SQL>  CREATE BITMAP INDEX index_row ON ROW_ARCHIVE_TEST(ORA_ARCHIVE_STATE);

已建立索引.

目前歷時: 00:00:01.32
SQL>


--full table scan 看一下執行計畫如何



這邊可以看到效能大幅的提升, 不過也僅止於 full table scan及某些特定的狀況下











2014年8月22日 星期五

Oracle 12c - Temporal Validity


Temporal Validity 在12C當中還算有趣的新功能,它可以自訂資料的時效性,只讓使用者看到時效內的資料

在Table開啟功能後Table中會自動新增兩個date類型欄位,一個是有效的起始,一個是有效期的結束,欄位可以由User指定也可以由Oracle自動配置,利用這兩個欄位與設定,讓使用者看到在時效內資料,過期的資料就不被看到,就很像是超商店員都會定時檢查飯團,不會讓你買到過期品


--先建立測試用Table 

SQL>  CREATE TABLE test_Redaction
  2      (
  3        t_id     NUMBER,
  4        t_name   VARCHAR2(50),
  5        t_add    VARCHAR2(50),
  6        t_phone  VARCHAR2(50),
  7        t_time   DATE
  8      )
  9      ;

已建立表格.

SQL>

--Insert into 資料

SQL> INSERT INTO TEST_REDACTION VALUES (101,'jimmy','senior program','7458-9658-3256',sysdate);

已建立 1 個資料列.

SQL> INSERT INTO TEST_REDACTION VALUES (102,'mike','general man','1236-6541-3214',sysdate);

已建立 1 個資料列.

SQL> INSERT INTO TEST_REDACTION VALUES (103,'eva','assistant','3574-1596-9856',sysdate);

已建立 1 個資料列.

SQL>

SQL> select * from test_redaction;

      T_ID T_NAME     T_ADD           T_PHONE         T_TIME
---------- ---------- --------------- --------------- -------------------
       101 jimmy      senior program  7458-9658-3256  2014-08-21 02:15:52
       102 mike       general man     1236-6541-3214  2014-08-21 02:17:12 
       103 eva        assistant       3574-1596-9856  2014-08-21 02:17:13


--授權

 GRANT EXECUTE ON dbms_flashback_archive TO test;

--對此session開啟 Temporal Validity


SQL> EXECUTE DBMS_FLASHBACK_ARCHIVE.enable_at_valid_time('CURRENT');



已順利完成 PL/SQL 程序.



--對Table新增功能欄位,這個部份可以手動指定欄位或者Oracle自己新增

自動新增
SQL> alter table test.test_redaction add period for track_time;

已更改表格.

手動指定新增(用此方法指定的欄位並不會被隱藏)
SQL>alter table test.TEST_re3 add period for track_time (t_time1_start,t_time2_end);
已更改表格.

SQL>

--這時候Table 會多3個隱藏欄位


SQL> SELECT COLUMN_NAME,DATA_TYPE,HIDDEN_COLUMN FROM DBA_TAB_COLS WHERE TABLE_NAME='TEST_REDACTION';



COLUMN_NAME          DATA_TYPE                           HID

-------------------- ----------------------------------- ---

TRACK_TIME           NUMBER                              YES

TRACK_TIME_END       TIMESTAMP(6) WITH TIME ZONE         YES
TRACK_TIME_START     TIMESTAMP(6) WITH TIME ZONE         YES
T_TIME               DATE                                NO
T_PHONE              VARCHAR2                            NO
T_ADD                VARCHAR2                            NO
T_NAME               VARCHAR2                            NO
T_ID                 NUMBER                              NO

已選取 8 個資料列.

SQL>

--設定資料有效的開始與結束


SQL> update test.test_redaction set track_time_start=sysdate ;



已更新 3 個資料列.

--在一分鐘後過期


SQL> update test.test_redaction set track_time_end=sysdate-1/1440 ;



已更新 3 個資料列.



SQL>



在資料過期後,用戶就被遮蔽搜尋不到資料了,不過實際上資料還在



SQL> select * from test_redaction;



沒有任何資料列被選取



SQL>

此功能似乎還不太健全,有時候在開啟功能後過期資料還會被搜尋到, 但過一陣子在搜尋一次過期的資料就搜尋不到了




--我們來看看執行計畫, Oracle 到底做了什麼

SQL> select * from test_redaction;



沒有任何資料列被選取



執行計畫
----------------------------------------------------------
Plan hash value: 3890191689
------------------------------------------------------------------------------------
| Id  | Operation         | Name           | Rows  | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                |     1 |   133 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| TEST_REDACTION |     1 |   133 |     3   (0)| 00:00:01 |
------------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(("T"."TRACK_TIME_START" IS NULL OR SYS_EXTRACT_UTC("T"."TRACK_TIME_START")<=SYS_EXTRACT_UTC(SYSTIMESTAMP(6))) AND ("T"."TRACK_TIME_END" IS NULL OR SYS_EXTRACT_UTC("T"."TRACK_TIME_END")>SYS_EXTRACT_UTC(SYSTIMESTAMP(6))))

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)


統計資料
----------------------------------------------------------
         45  recursive calls
          0  db block gets
         37  consistent gets
          0  physical reads
          0  redo size
        609  bytes sent via SQL*Net to client
        532  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

SQL>

再執行計劃裡紅字的部份,原來 Oracle 在過程中加入了一個條件過濾



不過這功能玩起來算是新鮮有趣,在某些有時效性的場合,不用設計複雜的程式,直接就可以有此效果