官术网_书友最值得收藏!

6.5 撤消數(shù)據(jù)和重載數(shù)據(jù)的區(qū)別

這個(gè)主題有特殊的意義,因?yàn)樵S多人在描述撤消和重做時(shí)都會(huì)犯許多錯(cuò)誤。下面是一組對(duì)比:

● 撤消是臨時(shí)的,而重做是永久的。撤消數(shù)據(jù)至少在生成它的事務(wù)存在期間是存在的,但可能不長(zhǎng)于這個(gè)時(shí)段。最終,總是會(huì)被覆蓋。重做的存在時(shí)間是不確定的,首先存在于聯(lián)機(jī)日志文件中,之后存在于歸檔日志文件中。

● 撤消在邏輯層上進(jìn)行,而重做在物理層上進(jìn)行。撤消數(shù)據(jù)是面向行的,根據(jù)生成它們的事務(wù)對(duì)修改進(jìn)行分組,在撤消段中,所有項(xiàng)都與同一個(gè)事務(wù)的行相關(guān)。重做是面向物理的。更改矢量與行ID指針指向的塊中的物理位置相關(guān)。日志緩存或日志文件中的連續(xù)更改矢量之間沒(méi)有關(guān)系。

● 撤消可以反轉(zhuǎn)更改,而重做可以重復(fù)更改。撤消數(shù)據(jù)提供了反轉(zhuǎn)已提交事務(wù)的功能。重做提供了重放已丟失工作的功能

● 撤消位于表空間,而重做位于文件中。撤消數(shù)據(jù)是數(shù)據(jù)庫(kù)中的一個(gè)段結(jié)構(gòu),重做寫(xiě)入操作系統(tǒng)文件。

● 撤消與重做不是相反的。它們有不同的功能。撤消關(guān)乎事務(wù)的完整性,而重做的作用是防止數(shù)據(jù)丟失。

配置撤消保留

自動(dòng)撤消管理總是盡可能長(zhǎng)地保存撤消數(shù)據(jù)。這通常就是我們需要的。但是,有兩種情況需要DBA操作:一種情況是需要確保查詢總是成功,即使這意味著DML可能失敗,另一種情況是閃回查詢要擴(kuò)展使用。

1.配置撤消保留以支持長(zhǎng)時(shí)間運(yùn)行的查詢

以秒為單位進(jìn)行設(shè)置的參數(shù)UNDO_RETENTION通常是可選的。這個(gè)參數(shù)指定了保留非活動(dòng)撤消數(shù)據(jù)的目標(biāo),并確定何時(shí)將其歸類為過(guò)期,而不是未過(guò)期。例如,如果運(yùn)行時(shí)間最長(zhǎng)的查詢需要耗時(shí)30分鐘,那么就應(yīng)當(dāng)將該參數(shù)設(shè)置為1800。隨后,Oracle會(huì)設(shè)法將所有撤消數(shù)據(jù)至少保留1800秒,從而使查詢不會(huì)出現(xiàn)因ORA-1555錯(cuò)誤而導(dǎo)致的失敗。然而,如果沒(méi)有設(shè)置這個(gè)參數(shù)或者將其設(shè)置為零,那么Oracle仍會(huì)盡可能長(zhǎng)時(shí)間地保留撤消數(shù)據(jù)??刂七^(guò)期撤消數(shù)據(jù)重寫(xiě)的算法總是會(huì)首先選擇重寫(xiě)最早的數(shù)據(jù),因此,UNDO_RETENTION參數(shù)的最大值總是與撤消表空間的大小一致。

提示:

一些查詢可能運(yùn)行非常長(zhǎng)的時(shí)間。持續(xù)運(yùn)行幾天的查詢并不少見(jiàn)。如果打算在處理正常事務(wù)的過(guò)程中,成功運(yùn)行這種查詢,就需要一個(gè)木星大小的撤消表空間。在報(bào)告長(zhǎng)時(shí)間運(yùn)行的查詢時(shí),可能需要考慮限制DML工作負(fù)載,或者調(diào)整SQL,減少它需要的時(shí)間。

如果確保撤消保留(guaranteed undo retention),那么UNDO_RETENTION參數(shù)不是可選的。針對(duì)撤消的默認(rèn)操作模式是:對(duì)于事務(wù)與查詢來(lái)說(shuō),Oracle更傾向于維護(hù)事務(wù)。如果在查詢可能出現(xiàn)ORA-1555失敗與事務(wù)必定出現(xiàn)ORA-30036失敗之間選擇撤消表空間的大小,那么Oracle 會(huì)通過(guò)重寫(xiě)查詢所需的撤消數(shù)據(jù)使指定事務(wù)繼續(xù)進(jìn)行。換句話說(shuō),UNDO_RETENTION是Oracle試圖達(dá)到的唯一目標(biāo)。不過(guò),在某些情況下,我們認(rèn)為成功的查詢比成功的事務(wù)更重要。例如,對(duì)于月末進(jìn)行填制報(bào)表工作的某個(gè)公用事業(yè)單位來(lái)說(shuō),完全可以接受事務(wù)在生成報(bào)告的同時(shí)阻滯數(shù)小時(shí)。使用閃回查詢(閃回查詢依賴于撤消數(shù)據(jù))則是另一個(gè)示例。

確保撤消保留意味著在經(jīng)過(guò)UNDO_RETENTION參數(shù)所指定的時(shí)間之前,撤消數(shù)據(jù)絕不會(huì)被重寫(xiě)。在表空間層次上啟用撤消保留(undo retention)。我們既可以在創(chuàng)建撤消表空間時(shí)指定這個(gè)特性,也可以在后面通過(guò)更改撤消表空間來(lái)啟用該特性。一旦激活某個(gè)已被指定確保保留的撤消表空間,如果所有查詢都能夠在撤消保留時(shí)間內(nèi)結(jié)束,那么這些查詢都將成功完成,而且也不會(huì)再次接收到“snapshot too old”錯(cuò)誤。不利的方面是事務(wù)可能由于缺乏撤消空間而失敗。

如果已經(jīng)設(shè)置了UNDO_RETENTION參數(shù),而且構(gòu)成撤消表空間的數(shù)據(jù)文件被設(shè)置為自動(dòng)擴(kuò)展,那么,Oracle將根據(jù)需要自動(dòng)增加數(shù)據(jù)文件的大小,來(lái)滿足撤消保留目標(biāo)的要求。確保撤消保留和自動(dòng)擴(kuò)展數(shù)據(jù)文件的結(jié)合使用意味著,如果磁盤(pán)空間足夠大,查詢和事務(wù)始終都能夠成功。否則,自動(dòng)擴(kuò)展將會(huì)失敗。

2.閃回查詢和撤消保留

閃回查詢可以給撤消系統(tǒng)提出更多的要求。閃回查詢?cè)试S用戶查看數(shù)據(jù)庫(kù)在以前某個(gè)時(shí)刻的狀態(tài)。進(jìn)行閃回查詢有幾種方法,但最簡(jiǎn)單的是使用帶AS OF子句的簡(jiǎn)單SELECT語(yǔ)句。下面是一個(gè)例子:

        select * from scott.emp as of timestamp (systimestamp - 10/1440);

這個(gè)語(yǔ)句返回10分鐘前SCOTT.EMP表中的所有行??梢钥吹揭褎h除的行,看不到插入的新行,已更新的行則顯示其舊值。無(wú)論是否執(zhí)行了DML語(yǔ)句,都是如此。要進(jìn)行閃回查詢,應(yīng)使用撤消數(shù)據(jù)回滾所有更改。已刪除的行從撤消段中提取,并插回結(jié)果集;已插入的行從結(jié)果集中刪除。前面嘗試返回10分鐘前的查詢很可能成功。而試圖返回1周前的程序幾乎肯定會(huì)失敗,因?yàn)橹匦聵?gòu)建表在一周前的版本所需的撤消數(shù)據(jù)已經(jīng)被覆蓋了。

閃回查詢是一個(gè)很有價(jià)值的工具。例如,如果前一個(gè)小時(shí)的某一刻,刪除操作出錯(cuò)(已執(zhí)行),下面這個(gè)命令就可以把所有刪除的行插回表中,反轉(zhuǎn)該操作:

        insert into scott.emp
        (select * from scott.emp as of timestamp (systimestamp - 1/24)
        minus
        select * from scott.emp);

如果可能使用閃回查詢,就必須把UNDO_RETENTION參數(shù)設(shè)置為合適的值,配置撤消系統(tǒng),來(lái)處理它。如果希望能閃回一天,它就必須設(shè)置為86 400秒。撤消表空間必須有合適的大小。接著為了確保成功,應(yīng)自動(dòng)擴(kuò)展撤消表空間的數(shù)據(jù)文件,或者啟用表空間的保留保證。

練習(xí)6-7 使用事務(wù)和閃回查詢

本練習(xí)演示撤消數(shù)據(jù)用于提供事務(wù)隔離和回滾的方式,并實(shí)現(xiàn)閃回查詢。使用HR演示模式中的REGIONS表。下面是要執(zhí)行的步驟:

(1) 用兩個(gè)并發(fā)會(huì)話連接到HR模式。它們可以是兩個(gè)SQL*Plus 會(huì)話、兩個(gè)SQL Developer會(huì)話,或者一個(gè)SQL*Plus會(huì)話和一個(gè)SQL Developer會(huì)話。表6-4列出了每個(gè)會(huì)話中要執(zhí)行的步驟:

表6-4 執(zhí)行會(huì)話的步驟

提交的事務(wù)不能反轉(zhuǎn),因?yàn)樗呀?jīng)提交了,但未提交的事務(wù)現(xiàn)在完全消失了,被更改的回滾中斷了。所有事務(wù)中斷后,兩個(gè)會(huì)話就會(huì)看到表的一致視圖。

(2) 使用一個(gè)連接為用戶HR的會(huì)話,演示閃回查詢的用法:

A.調(diào)整時(shí)間顯示格式,使之包含秒數(shù)。

        alter session set nls_date_format='dd-mm-yy hh24:mi:ss';

B.查詢并記錄當(dāng)前時(shí)間:

        select sysdate from dual;

C.刪除以前插入的行,再執(zhí)行刪除操作:

        delete from regions where region_id=100;
        commit;

D.查詢刪除行之前的表:

        select * from regions as of timestamp
        to_timestamp('time_from_step_2', 'dd-mm-yy hh24:mi:ss');

結(jié)果列出了區(qū)域100中已刪除的行,它們是從撤消段中檢索出來(lái)的。

推薦閱讀
  1. 幼兒園教師資格考試:綜合素質(zhì)(微課版)
  2. 2019年銀行招聘考試歷年真題與考前押題詳解
  3. 2019年國(guó)際貨運(yùn)代理《國(guó)際陸路貨運(yùn)代理與多式聯(lián)運(yùn)理論與實(shí)務(wù)》章節(jié)練習(xí)題詳解
  4. 2020年西藏自治區(qū)社區(qū)工作者公開(kāi)招聘考試《行政職業(yè)能力》專項(xiàng)題庫(kù)【真題精選+章節(jié)題庫(kù)+模擬試題】
  5. 2020年中國(guó)科學(xué)院大學(xué)601高等數(shù)學(xué)(甲)考試大綱解析
  6. 新駕考:學(xué)車(chē)考證一本通(2022版)
  7. 社會(huì)工作實(shí)務(wù)(初級(jí))2017年考點(diǎn)+精講
  8. 2019年全國(guó)導(dǎo)游人員資格考試輔導(dǎo)教材-河南導(dǎo)游基礎(chǔ)知識(shí)
  9. 2019年價(jià)格鑒證師《經(jīng)濟(jì)學(xué)與價(jià)格學(xué)基礎(chǔ)理論》過(guò)關(guān)必做習(xí)題集
  10. 2019年水利部黃河水利委員會(huì)招聘考試《黃河基礎(chǔ)知識(shí)》過(guò)關(guān)必做習(xí)題集(含歷年真題)
  11. 招標(biāo)師《招標(biāo)采購(gòu)項(xiàng)目管理》歷年真題與模擬試題詳解
  12. 物業(yè)管理師《物業(yè)管理基本制度與政策》講義、真題、預(yù)測(cè)三合一
  13. 協(xié)作學(xué)習(xí)的交互分析方法:基于信息流的視角
  14. 2019年注冊(cè)會(huì)計(jì)師《公司戰(zhàn)略與風(fēng)險(xiǎn)管理》歷年真題與模擬試題詳解
  15. 2020年安徽省社區(qū)工作者公開(kāi)招聘考試《行政職業(yè)能力》專項(xiàng)題庫(kù)【歷年真題+章節(jié)題庫(kù)+模擬試題】
主站蜘蛛池模板: 惠东县| 宜宾县| 弥勒县| 通许县| 蓬溪县| 徐州市| 衡阳市| 温宿县| 湖口县| 宝应县| 太和县| 泗水县| 大渡口区| 大同县| 张北县| 文成县| 海林市| 衡南县| 辽阳县| 南靖县| 方山县| 虹口区| 洛阳市| 新建县| 江源县| 分宜县| 石林| 阿瓦提县| 南城县| 恩平市| 镇赉县| 台湾省| 南溪县| 蓬莱市| 织金县| 阆中市| 濮阳县| 高碑店市| 万山特区| 咸宁市| 昌黎县|