oracle12c 清理归档,Oracle 12c中数据删除(delete)新特性之数据库内归档功能
有些應用有“標記刪除”的概念,即不是刪除數據,而是數據依然保留在表中,只是對應用不可見而已。這種需求通常通過如下方法實現:
1)? 給相關表增加一個另外的列,該列存儲標志數據被刪除的標記。
2)? 給每個語句增加一個謂詞,檢查被刪除行的狀態,像:“WHERE deleted = 'N'”,以便排除被刪除行。 謂詞能被硬編碼進SQL語句中,或動態應用類似VPD的安全策略。
數據庫內歸檔是Oracle12c的新特性,該特性可以對現有代碼做最少改動的情況下,實現了這種“標記刪除”的功能和需求。
1.? 開啟數據庫內歸檔
ROW ARCHIVAL子句被用來開啟數據庫內歸檔。該子句可以用在創建表時用在CREATE TABLE中,也可以在表創建后用在ALTER TABLE中。
DROPTABLE tab1 PURGE;
--創建表并開啟數據庫內歸檔特性
CREATETABLE tab1 (
no? ? ? ? NUMBER,
desc VARCHAR2(50),
CONSTRAINT tab1_pk PRIMARY KEY (no)
)
ROWARCHIVAL;
--禁用并重新開啟數據庫內歸檔特性
ALTERTABLE tab1 NO ROW ARCHIVAL;
ALTERTABLE tab1 ROW ARCHIVAL;
--往表中加入1000行數據。
INSERT INTO tab1
SELECTlevel, 'Description of ' || level
FROM? dual
CONNECTBY level <= 1000;
COMMIT;
--檢查表內容
SELECTCOUNT(*) FROM tab1;
COUNT(*)
----------
1000
SQL>
開啟數據庫內歸檔特性將會引起表另外增加一個叫做“ORA_ARCHIVE_STATE”系統隱藏列。
COLUMNcolumn_name FORMAT A20
COLUMNdata_type FORMAT A20
SELECTcolumn_id,
column_name,
data_type,
data_length,
hidden_column
FROM? user_tab_cols
WHERE? table_name = 'TAB1'
ORDERBY column_id;
COLUMN_ID COLUMN_NAME? ? ? ? DATA_TYPE? ? ? ? ? DATA_LENGTH HID
------------------------------ -------------------- ----------- ---
1NO? ? ? ? ? ? ? ? ? NUMBER? ? ? ? ? ? ? ? ? ? ? 22 NO
2DESC? ? ? ? VARCHAR2? ? ? ? ? ? ? ? ? ? 50 NO
ORA_ARCHIVE_STATE? VARCHAR2? ? ? ? ? ? ? ? ? 4000 YES
SQL>
默認的,該列的每行被填充為‘0’。
COLUMNora_archive_state FORMAT A20
SELECTora_archive_state, COUNT(*)
FROM? tab1
GROUPBY ora_archive_state
ORDERBY ora_archive_state;
ORA_ARCHIVE_STATE? ? ? COUNT(*)
------------------------------
0? ? ? ? ? ? ? ? ? ? ? ? ? 1000
1row selected.
SQL>
2.? 歸檔(刪除)的行
并非刪除不需要的行,而是把ORA_ARCHIVE_STATE系統隱藏列的值更改為‘1’。這將導致應用看不到這些行。
UPDATEtab1
SET? ? ora_archive_state = '1'
WHERE? no BETWEEN 751 and 1000;
COMMIT;
SELECTCOUNT(*) FROM tab1;
COUNT(*)
----------
750
SQL>
其實,可以把ORA_ARCHIVE_STATE列設置為非‘0‘的其他任何字符串值來歸檔這些數據,但DBMS_ILM包使用如下常量。
1)? ARCHIVE_STATE_ACTIVE='0'
2)? ARCHIVE_STATE_ARCHIVED='1'
3.? 顯示歸檔行
通過將ROW_ARCHIVAL_VISIBILITY設置為ALL,可以使得這些隱藏行對會話可見。將該參數設置回ACTIVE可以再次使這些行不可見。
--使歸檔的行可見
ALTERSESSION SET ROW ARCHIVAL VISIBILITY = ALL;
SELECTCOUNT(*) FROM tab1;
COUNT(*)
----------
1000
SQL>
COLUMNora_archive_state FORMAT A20
SELECTora_archive_state, COUNT(*)
FROM? tab1
GROUPBY ora_archive_state
ORDERBY ora_archive_state;
ORA_ARCHIVE_STATE? ? ? COUNT(*)
------------------------------
0? ? ? ? ? ? ? ? ? ? ? ? ? 750
1? ? ? ? ? ? ? ? ? ? ? ? ? 250
2rows selected.
SQL>
--使歸檔行再次不可見
ALTERSESSION SET ROW ARCHIVAL VISIBILITY = ACTIVE;
SELECTCOUNT(*) FROM tab1;
COUNT(*)
----------
750
SQL>
總結
以上是生活随笔為你收集整理的oracle12c 清理归档,Oracle 12c中数据删除(delete)新特性之数据库内归档功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米空调压缩机哪家的(小米官方售后服务)
- 下一篇: 方舟企鹅在哪(方舟生存进化)