oracle12c 清理归档,Oracle 12c中数据删除(delete)新特性之数据库内归档功能
有些應(yīng)用有“標(biāo)記刪除”的概念,即不是刪除數(shù)據(jù),而是數(shù)據(jù)依然保留在表中,只是對(duì)應(yīng)用不可見而已。這種需求通常通過如下方法實(shí)現(xiàn):
1)? 給相關(guān)表增加一個(gè)另外的列,該列存儲(chǔ)標(biāo)志數(shù)據(jù)被刪除的標(biāo)記。
2)? 給每個(gè)語(yǔ)句增加一個(gè)謂詞,檢查被刪除行的狀態(tài),像:“WHERE deleted = 'N'”,以便排除被刪除行。 謂詞能被硬編碼進(jìn)SQL語(yǔ)句中,或動(dòng)態(tài)應(yīng)用類似VPD的安全策略。
數(shù)據(jù)庫(kù)內(nèi)歸檔是Oracle12c的新特性,該特性可以對(duì)現(xiàn)有代碼做最少改動(dòng)的情況下,實(shí)現(xiàn)了這種“標(biāo)記刪除”的功能和需求。
1.? 開啟數(shù)據(jù)庫(kù)內(nèi)歸檔
ROW ARCHIVAL子句被用來(lái)開啟數(shù)據(jù)庫(kù)內(nèi)歸檔。該子句可以用在創(chuàng)建表時(shí)用在CREATE TABLE中,也可以在表創(chuàng)建后用在ALTER TABLE中。
DROPTABLE tab1 PURGE;
--創(chuàng)建表并開啟數(shù)據(jù)庫(kù)內(nèi)歸檔特性
CREATETABLE tab1 (
no? ? ? ? NUMBER,
desc VARCHAR2(50),
CONSTRAINT tab1_pk PRIMARY KEY (no)
)
ROWARCHIVAL;
--禁用并重新開啟數(shù)據(jù)庫(kù)內(nèi)歸檔特性
ALTERTABLE tab1 NO ROW ARCHIVAL;
ALTERTABLE tab1 ROW ARCHIVAL;
--往表中加入1000行數(shù)據(jù)。
INSERT INTO tab1
SELECTlevel, 'Description of ' || level
FROM? dual
CONNECTBY level <= 1000;
COMMIT;
--檢查表內(nèi)容
SELECTCOUNT(*) FROM tab1;
COUNT(*)
----------
1000
SQL>
開啟數(shù)據(jù)庫(kù)內(nèi)歸檔特性將會(huì)引起表另外增加一個(gè)叫做“ORA_ARCHIVE_STATE”系統(tǒng)隱藏列。
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>
默認(rèn)的,該列的每行被填充為‘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系統(tǒng)隱藏列的值更改為‘1’。這將導(dǎo)致應(yīng)用看不到這些行。
UPDATEtab1
SET? ? ora_archive_state = '1'
WHERE? no BETWEEN 751 and 1000;
COMMIT;
SELECTCOUNT(*) FROM tab1;
COUNT(*)
----------
750
SQL>
其實(shí),可以把ORA_ARCHIVE_STATE列設(shè)置為非‘0‘的其他任何字符串值來(lái)歸檔這些數(shù)據(jù),但DBMS_ILM包使用如下常量。
1)? ARCHIVE_STATE_ACTIVE='0'
2)? ARCHIVE_STATE_ARCHIVED='1'
3.? 顯示歸檔行
通過將ROW_ARCHIVAL_VISIBILITY設(shè)置為ALL,可以使得這些隱藏行對(duì)會(huì)話可見。將該參數(shù)設(shè)置回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>
總結(jié)
以上是生活随笔為你收集整理的oracle12c 清理归档,Oracle 12c中数据删除(delete)新特性之数据库内归档功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米空调压缩机哪家的(小米官方售后服务)
- 下一篇: 方舟企鹅在哪(方舟生存进化)