Oracle教程 (第6版)(Oracle 11g版) 課件 第10章 事務(wù)、鎖、閃回和Undo表空間_第1頁
Oracle教程 (第6版)(Oracle 11g版) 課件 第10章 事務(wù)、鎖、閃回和Undo表空間_第2頁
Oracle教程 (第6版)(Oracle 11g版) 課件 第10章 事務(wù)、鎖、閃回和Undo表空間_第3頁
Oracle教程 (第6版)(Oracle 11g版) 課件 第10章 事務(wù)、鎖、閃回和Undo表空間_第4頁
Oracle教程 (第6版)(Oracle 11g版) 課件 第10章 事務(wù)、鎖、閃回和Undo表空間_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第10章事務(wù)、鎖、閃回和Undo表空間事務(wù)01事務(wù)概念事務(wù)概念在現(xiàn)實(shí)生活中,事務(wù)隨處可見,如銀行交易、股票交易、網(wǎng)上購物、庫存品控制等。在所有這些例子中,事務(wù)的成功取決于這些相互依賴的行為是否能夠被成功地執(zhí)行,是否能互相協(xié)調(diào)。下面舉個(gè)簡單的例子。向公司數(shù)據(jù)庫添加一名新雇員,如圖所示,這個(gè)過程由三個(gè)基本步驟組成:在雇員數(shù)據(jù)庫中為雇員創(chuàng)建一條記錄;為雇員分配部門;建立雇員的工資記錄。只要這三步中的任何一步失敗,如為新成員分配的雇員ID已經(jīng)被其他人使用或者輸入到工資系統(tǒng)中的值太大,系統(tǒng)就必須撤銷在失敗之前所有的變化,刪除所有不完整記錄的蹤跡,避免以后的不一致和計(jì)算失誤。事務(wù)概念在形式上,事務(wù)是由ACID屬性標(biāo)識(shí)的。ACID是一個(gè)簡稱,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability),每個(gè)事務(wù)的處理必須滿足ACID原則。(1)原子性。原子性意味著每個(gè)事務(wù)都必須被認(rèn)為是一個(gè)不可分割的單元。假設(shè)一個(gè)事務(wù)由兩個(gè)或者多個(gè)任務(wù)組成,其中的語句必須同時(shí)成功才能認(rèn)為事務(wù)是成功的。如果事務(wù)失敗,系統(tǒng)將會(huì)返回到事務(wù)以前的狀態(tài)。(2)一致性。不管事務(wù)是成功完成還是中途失敗,當(dāng)事務(wù)使系統(tǒng)中的所有數(shù)據(jù)處于一致的狀態(tài)時(shí)存在一致性。參照前面的例子,一致性是指如果從系統(tǒng)中刪除一個(gè)雇員,則所有和該雇員相關(guān)的數(shù)據(jù),包括工資數(shù)據(jù)和組的成員資格也要被刪除。(3)隔離性。隔離性是指每個(gè)事務(wù)都在自己的空間發(fā)生,和其他發(fā)生在系統(tǒng)中的事務(wù)隔離,而且事務(wù)的結(jié)果只有在它完全被執(zhí)行時(shí)才能看到。(4)持久性。持久性意味著一旦事務(wù)執(zhí)行成功,在系統(tǒng)中產(chǎn)生的所有變化將是永久的。即使系統(tǒng)崩潰,一個(gè)提交的事務(wù)也會(huì)仍然存在。當(dāng)一個(gè)事務(wù)完成,數(shù)據(jù)庫的日志已經(jīng)被更新時(shí),持久性就開始發(fā)生作用。02事務(wù)處理1.提交事務(wù)2.回退全部事務(wù)3.回退部分事務(wù)事務(wù)處理當(dāng)發(fā)生如下事件時(shí),事務(wù)就自動(dòng)開始了。(1)連接到數(shù)據(jù)庫,并開始執(zhí)行第一條DML語句。(2)前一個(gè)事務(wù)結(jié)束或者執(zhí)行一條自動(dòng)提交事務(wù)的語句。發(fā)生如下事件時(shí),Oracle系統(tǒng)就認(rèn)為事務(wù)結(jié)束了。(1)用戶執(zhí)行COMMIT語句提交事務(wù),或者執(zhí)行ROLLBACK語句撤銷了事務(wù)。(2)用戶執(zhí)行了一條DDL語句,如CREATE、DROP或ALTER語句。(3)用戶執(zhí)行了一條DCL語句,如GRANT、REVOKE、AUDIT、NOAUDIT等。(4)用戶斷開與數(shù)據(jù)庫的連接,這時(shí)用戶當(dāng)前的事務(wù)會(huì)被自動(dòng)提交。(5)執(zhí)行DML語句失敗,這時(shí)當(dāng)前的事務(wù)會(huì)被自動(dòng)回退。事務(wù)處理1.提交事務(wù)在使用COMMIT語句提交事務(wù)時(shí),Oracle系統(tǒng)會(huì)執(zhí)行如下操作。(1)在回退段的事務(wù)表內(nèi)記錄這個(gè)事務(wù)已經(jīng)提交,并且生成一個(gè)唯一的系統(tǒng)改變號(hào)(SCN)保存到事務(wù)表中,用于標(biāo)識(shí)這個(gè)事務(wù)。(2)啟動(dòng)LGWR后臺(tái)進(jìn)程,將SGA區(qū)重做日志緩存的重做記錄寫入聯(lián)機(jī)重做日志文件中,并且將該事務(wù)的SCN也保存到聯(lián)機(jī)重做日志文件中。(3)釋放該事務(wù)中各個(gè)SQL語句所占用的系統(tǒng)資源。(4)通知用戶事務(wù)已經(jīng)成功提交?!纠?0.1】

使用INSERT語句向XSB表中插入一行數(shù)據(jù),并使用COMMIT提交事務(wù)。啟動(dòng)SQLDeveloper,并以SCOTT用戶連接數(shù)據(jù)庫,使用INSERT語句:INSERTINTOxsb(學(xué)號(hào),姓名,性別,出生時(shí)間,專業(yè),總學(xué)分) VALUES('151117','劉明','男',TO_DATE('19960315','YYYYMMDD'),'計(jì)算機(jī)',48);使用SELECT語句查詢剛剛插入的那行數(shù)據(jù):SELECT學(xué)號(hào),姓名,性別,出生時(shí)間,專業(yè),總學(xué)分 FROMxsb WHERE學(xué)號(hào)='151117';事務(wù)處理執(zhí)行結(jié)果如圖。事務(wù)處理現(xiàn)在打開SQL*Plus(同時(shí)保持SQLDeveloper的連接不關(guān)閉),使用相同的用戶賬號(hào)連接數(shù)據(jù)庫,執(zhí)行同樣的查詢,結(jié)果如圖。事務(wù)處理2.回退全部事務(wù)如果在數(shù)據(jù)庫修改的過程中,用戶不打算保存對數(shù)據(jù)所做的修改,可以使用ROLLBACK語句回退整個(gè)事務(wù),將數(shù)據(jù)庫的狀態(tài)回退到上一個(gè)提交成功的狀態(tài)。語法格式為:ROOLBACK;Oracle系統(tǒng)通過回退段(或撤銷表空間)存儲(chǔ)數(shù)據(jù)庫修改前的數(shù)據(jù),并通過重做日志記錄撤銷對數(shù)據(jù)庫所做的修改。如果回退整個(gè)事務(wù),Oracle系統(tǒng)將執(zhí)行以下操作。(1)通過使用回退段中的數(shù)據(jù)撤銷事務(wù)中所有SQL語句對數(shù)據(jù)庫所做的修改。(2)通過服務(wù)進(jìn)程釋放事務(wù)所使用的資源。(3)通知用戶事務(wù)回退成功。事務(wù)處理3.回退部分事務(wù)在事務(wù)的執(zhí)行過程中,可以通過建立保存點(diǎn)將一個(gè)較長的事務(wù)分隔為幾部分。通過保存點(diǎn),用戶可以在一個(gè)長事務(wù)中的任意時(shí)刻保存當(dāng)前的工作,隨后用戶可以選擇回退保存點(diǎn)之后的操作,保存點(diǎn)之前的操作將被保留。例如,假設(shè)在一個(gè)事務(wù)中包含多條INSERT語句,在成功執(zhí)行100條語句后建立了一個(gè)保存點(diǎn),如果第101條語句插入了錯(cuò)誤的數(shù)據(jù),用戶可以通過回退到保存點(diǎn)將事務(wù)的狀態(tài)恢復(fù)到執(zhí)行完100條INSERT語句之后的狀態(tài),而不必回退整個(gè)事務(wù)。設(shè)置保存點(diǎn)使用SAVEPOINT語句來實(shí)現(xiàn),語法格式為:SAVEPOINT保存點(diǎn)名稱;如果要回退到事務(wù)的某個(gè)保存點(diǎn),則使用ROLLBACKTO語句,語法格式為:ROLLBACKTO[SAVEPOINT]保存點(diǎn)名稱其中ROLLBACKTO語句只會(huì)回退用戶所做的一部分操作,事務(wù)并沒有結(jié)束。事務(wù)處理(1)通過使用回退段中的數(shù)據(jù),撤銷事務(wù)中保存點(diǎn)之后的所有更改,但保存點(diǎn)之前的更改將被保存。(2)通過服務(wù)進(jìn)程釋放保存點(diǎn)之后各個(gè)SQL語句所占用的系統(tǒng)資源,但保存點(diǎn)之前各個(gè)SQL語句所占用的系統(tǒng)資源將被保存。(3)通知用戶回退到保存點(diǎn)的操作成功。(4)用戶可以繼續(xù)執(zhí)行當(dāng)前的事務(wù)。如果回退部分事務(wù),Oracle系統(tǒng)將執(zhí)行以下操作。事務(wù)處理【例10.2】

向XSCJ數(shù)據(jù)庫的XSB表添加一行數(shù)據(jù),設(shè)置一個(gè)保存點(diǎn),然后刪除該行數(shù)據(jù)。但執(zhí)行后,新插入的數(shù)據(jù)行并沒有刪除,因?yàn)槭聞?wù)中使用了ROLLBACKTO語句將操作回退到保存點(diǎn)My_sav,即刪除前的狀態(tài)。添加數(shù)據(jù):INSERTINTOxsb(學(xué)號(hào),姓名,性別,出生時(shí)間,專業(yè),總學(xué)分) VALUES('151118','王祥','男',TO_DATE('19960418','YYYYMMDD'),'計(jì)算機(jī)',48);設(shè)置保存點(diǎn)My_sav:SAVEPOINTMy_sav;查詢該行數(shù)據(jù):SELECT學(xué)號(hào),姓名,性別,出生時(shí)間,專業(yè),總學(xué)分 FROMxsb WHERE學(xué)號(hào)='151118';事務(wù)處理執(zhí)行結(jié)果如圖。事務(wù)處理刪除該行數(shù)據(jù):

DELETEFROMxsbWHERE學(xué)號(hào)='151118';執(zhí)行相同的查詢,結(jié)果如圖。事務(wù)處理回退到保存點(diǎn)My_sav:ROLLBACKTOMy_sav;提交事務(wù):COMMIT;執(zhí)行查詢的結(jié)果如圖。03自治事務(wù)自治事務(wù)利用自治事務(wù)可以“掛”起當(dāng)前執(zhí)行的事務(wù),開始一個(gè)新事務(wù),完成一些工作,然后提交或回滾,所有這些都不影響當(dāng)前執(zhí)行事務(wù)的狀態(tài)。同樣,當(dāng)前事務(wù)的回退也對自治事務(wù)沒有影響。自治事務(wù)提供了一種用PL/SQL控制事務(wù)的新方法,可以用于:頂層匿名塊;本地(過程中的過程)、獨(dú)立或打包的函數(shù)和過程;對象類型的方法;數(shù)據(jù)庫觸發(fā)器。自治事務(wù)【例10.3】

先在XSB表中刪除一行數(shù)據(jù),接著定義一個(gè)自治事務(wù),在自治事務(wù)中向XSB表添加一行數(shù)據(jù),最后在外層事務(wù)中回退刪除數(shù)據(jù)的操作。刪除XSB表的一行數(shù)據(jù):DELETEFROMXSBWHERE學(xué)號(hào)='151242';定義一個(gè)自治事務(wù),并添加數(shù)據(jù):DECLARE PRAGMAAUTONOMOUS_TRANSACTION;BEGIN INSERTINTOxsb(學(xué)號(hào),姓名,性別,出生時(shí)間,專業(yè),總學(xué)分) VALUES('151301','張建','男',TO_DATE('19970315','YYYYMMDD'),'軟件工程',48); COMMIT;END;/自治事務(wù)使用ROLLBACK語句回退當(dāng)前事務(wù):ROLLBACK;通過查看XSB表的內(nèi)容,可以發(fā)現(xiàn)151242號(hào)學(xué)生的記錄沒有被刪除,而151301號(hào)學(xué)生的記錄已經(jīng)保存到XSB表中了,如圖。自治事務(wù)【例10.4】

重新創(chuàng)建【例7.9】的觸發(fā)器,使其能正常工作。CREATEORREPLACETRIGGERdel_xs BEFOREDELETEONxsbFOREACHROWDECLARE PRAGMAAUTONOMOUS_TRANSACTION;BEGIN INSERTINTOxsb_his(學(xué)號(hào),姓名,性別,出生時(shí)間,專業(yè),總學(xué)分,備注) VALUES(:OLD.學(xué)號(hào),:OLD.姓名,:OLD.性別,:OLD.出生時(shí)間,:OLD.專業(yè),:OLD.總學(xué)分,:OLD.備注); COMMIT;END;刪除XSB表中151301號(hào)的學(xué)生記錄:DELETEFROMxsbWHERE學(xué)號(hào)='151301';查看XSB_HIS表,即可發(fā)現(xiàn)已經(jīng)添加了該行數(shù)據(jù),如圖。第10章事務(wù)、鎖、閃回和Undo表空間鎖01鎖機(jī)制和死鎖

1.鎖機(jī)制2.死鎖鎖機(jī)制和死鎖

1.鎖機(jī)制在Oracle11g數(shù)據(jù)庫中,提供了兩種鎖機(jī)制。(1)共享鎖(ShareLock)。共享鎖通過數(shù)據(jù)存取的高并行性來實(shí)現(xiàn)。如果獲得了一個(gè)共享鎖,那么用戶就可以共享相同的資源,許多事務(wù)可以獲得相同資源上的共享鎖。例如,多個(gè)用戶可以在相同的時(shí)間讀取相同的數(shù)據(jù)。(2)獨(dú)占鎖(ExclusiveLock)。獨(dú)占鎖防止共同改變相同的資源。假如一個(gè)事務(wù)獲得了某資源上的一個(gè)獨(dú)占鎖,那么直到該鎖被解除,其他事務(wù)才能修改該資源,但允許對資源進(jìn)行共享。例如,一個(gè)表被鎖定在獨(dú)占模式下,并不會(huì)阻止其他用戶從該表中得到數(shù)據(jù)。2.死鎖當(dāng)兩個(gè)或者多個(gè)用戶等待其中一個(gè)被鎖住的資源時(shí),就有可能發(fā)生死鎖現(xiàn)象。對于死鎖,Oracle系統(tǒng)可自動(dòng)進(jìn)行定期搜索,通過回滾死鎖中包含的其中一個(gè)語句來解決死鎖問題,也就是釋放其中一個(gè)沖突鎖,同時(shí)返回一個(gè)消息給對應(yīng)的事務(wù)。用戶在設(shè)計(jì)應(yīng)用程序時(shí),要遵循一定的鎖規(guī)則,盡量避免死鎖現(xiàn)象的發(fā)生。02鎖的類型1.DML鎖2.DDL鎖3.內(nèi)部鎖鎖的類型1.DML鎖DML鎖的目標(biāo)是保證并行訪問的數(shù)據(jù)完整性,防止同步?jīng)_突的DML鎖和DDL鎖的破壞性交互操作。例如,保證表的特定行能夠被一個(gè)事務(wù)更新,同時(shí)保證在事務(wù)提交之前不能刪除表。DML操作能夠在特定的行和整個(gè)表這兩個(gè)不同的層上獲取數(shù)據(jù)。2.DDL鎖DDL鎖有多種形式。(1)獨(dú)占DDL鎖。當(dāng)CREATE、ALTER和DROP等語句用于一個(gè)對象時(shí)使用該鎖。假如另外一個(gè)用戶保留了任何級別的鎖,那么該用戶就不能得到表中的獨(dú)占DDL鎖。例如,另一個(gè)用戶在該表上有一個(gè)未提交的事務(wù),則ALTERTTABLE語句就會(huì)失效。(2)共享DDL鎖。當(dāng)GRANT與CREATEPACKAGE等語句用于一個(gè)對象時(shí)使用此鎖。一個(gè)共享DDL鎖不能阻止類似DDL鎖的語句或任何DML鎖的語句用于一個(gè)對象上,但是它能防止另一個(gè)用戶改變或刪除已引用的對象。共享DDL鎖還可以在DDL鎖的語句執(zhí)行期間一直維持,直到發(fā)生一個(gè)隱式的提交。(3)可破的分析DDL鎖。數(shù)據(jù)庫高速緩存區(qū)中語句或PL/SQL對象有一個(gè)用于它所引用的每一個(gè)對象的鎖。假如被引用的對象改變了,可破的分析DDL鎖會(huì)持續(xù)。假如對象改變了,它會(huì)檢查語句是否應(yīng)失效。3.內(nèi)部鎖內(nèi)部鎖包含內(nèi)部數(shù)據(jù)庫和內(nèi)存結(jié)構(gòu)。對用戶來說,它們是不可訪問的,因?yàn)橛脩舨恍枰刂扑鼈兊陌l(fā)生。03表鎖和事務(wù)鎖表鎖和事務(wù)鎖為了使事務(wù)能夠保護(hù)表中DML鎖的存取,以及防止表中產(chǎn)生沖突DDL鎖的操作,Oracle系統(tǒng)可獲得表鎖(TM)。例如,某個(gè)事務(wù)在一張表上持有一個(gè)表鎖,那么它會(huì)阻止任何其他事務(wù)獲取該表中用于刪除或改變的一個(gè)專用DDL鎖。如表所示,當(dāng)執(zhí)行特定的語句時(shí),由RDBMS獲得這些模式的表鎖。語

句類

型模

式INSERTTM行獨(dú)占(3)(RX)UPDATETM行獨(dú)占(3)(RX)DELETETM行獨(dú)占(3)(RX)SELECTFORUPDATETM行共享(2)(RS)LOCKTABLETM獨(dú)占(6)(X)表鎖和事務(wù)鎖當(dāng)一個(gè)事務(wù)發(fā)出如表所示的語句時(shí),將獲得事務(wù)鎖(TX)。事務(wù)鎖總是在行級上獲得,它獨(dú)占該行并阻止其他事務(wù)進(jìn)行修改,直到持有該鎖的事務(wù)回滾或提交數(shù)據(jù)為止。語

句類

型模

式INSERTTX獨(dú)占(6)(X)UPDATETX獨(dú)占(6)(X)DELETETX獨(dú)占(6)(X)SELECTFORUPDATETX獨(dú)占(6)(X)第10章事務(wù)、鎖、閃回和Undo表空間閃

回01閃回的基本概念

閃回的基本概念

在Oracle11g數(shù)據(jù)庫中,閃回的操作包括內(nèi)容如下。(1)查詢閃回(FlashbackQuery):查詢過去某個(gè)指定時(shí)間、指定實(shí)體的數(shù)據(jù),恢復(fù)錯(cuò)誤的數(shù)據(jù)庫更新、刪除等。(2)默認(rèn)(DEFAULT)。在表中插入一行數(shù)據(jù),但沒有為列生成一個(gè)在定義表時(shí)預(yù)先指定的值。(3)刪除閃回(FlashbackDrop):可以將刪除的表重新恢復(fù)。(4)數(shù)據(jù)庫閃回(FlashbackDatabase):可以將整個(gè)數(shù)據(jù)庫回退到過去某個(gè)時(shí)間點(diǎn)。(5)歸檔閃回(FlashbackDataArchive):可以閃回到指定時(shí)間之前的舊數(shù)據(jù)而不影響重做日志的策略。02查詢閃回查詢閃回執(zhí)行查詢閃回操作時(shí),需要使用兩個(gè)時(shí)間函數(shù):TIMESTAMP和TO_TIMESTAMP。TO_TIMESTAMP函數(shù)的語法格式為:TO_TIMESTAMP('timepoint','format')其中,timepoint表示某時(shí)間點(diǎn)。format指定需要把timepoint格式化成何種格式?!纠?0.5】使用查詢閃回恢復(fù)刪除的數(shù)據(jù)。(1)查詢XSB1表中的數(shù)據(jù)。使用SET語句在“SQL>”標(biāo)識(shí)符前顯示當(dāng)前時(shí)間:SETTIMEON查詢數(shù)據(jù):SELECT*FROMxsb1;執(zhí)行結(jié)果如圖。查詢閃回(2)刪除XSB1表中所有記錄并提交,如圖。DELETEFROMxsb1;COMMIT;(3)進(jìn)行查詢閃回。SELECT*FROMxsb1ASOFTIMESTAMP TO_TIMESTAMP('2015-7-615:10:17','YYYY-MM-DDHH24:MI:SS');查詢閃回(4)將閃回的數(shù)據(jù)重新插入XSB1表中。INSERTINTOxsb1 SELECT*FROMxsb1ASOFTIMESTAMP TO_TIMESTAMP('2015-7-615:10:17','YYYY-MM-DDHH24:MI:SS');表中數(shù)據(jù)復(fù)原如圖。03表

回表閃回利用表閃回可以恢復(fù)表,取消對表所進(jìn)行的修改。表閃回要求用戶具有以下權(quán)限。(1)FLASHBACKANYTABLE權(quán)限或者該表的FLASHBACK對象權(quán)限。(2)具有該表的SELECT權(quán)限、INSERT權(quán)限、DELETE權(quán)限和ALTER權(quán)限。(3)必須保證該表ROWMOVEMENT權(quán)限。表閃回Oracle11g數(shù)據(jù)庫的表閃回與查詢閃回的功能類似,也是利用恢復(fù)信息(UndoInformation)對以前某個(gè)時(shí)間點(diǎn)的數(shù)據(jù)進(jìn)行恢復(fù)。表閃回的特性如下。(1)(2)(3)(4)(5)在線操作?;謴?fù)到指定時(shí)間點(diǎn)或者SCN的任何數(shù)據(jù)。自動(dòng)恢復(fù)相關(guān)屬性,如索引、觸發(fā)器等。滿足分布式的一致性。滿足數(shù)據(jù)一致性,以及所有相關(guān)對象的一致性。表閃回要實(shí)現(xiàn)表閃回,必須確保與撤銷表空間有關(guān)的參數(shù)設(shè)置合理。撤銷表空間相關(guān)參數(shù)為UNDO_MANAGEMENT、UNDO_TABLESPACE和UNDO_RETENTION。以SYSTEM用戶連接數(shù)據(jù)庫,在SQL*Plus中執(zhí)行下面的語句顯示撤銷表空間的參數(shù):SHOWPARAMETERUNDO執(zhí)行結(jié)果如圖。表閃回在創(chuàng)建撤銷表空間時(shí),要考慮數(shù)據(jù)保存的時(shí)間長短、每秒產(chǎn)生的塊數(shù)據(jù)量及塊大小等。假如表空間大小用undo表示,即undo=UR×UPS×DB_BLOCK_SIZE+冗余量。相關(guān)參數(shù)說明如下。(1)UR:在undo中保持的最長時(shí)間數(shù)(秒),由數(shù)據(jù)庫參數(shù)UNDO_RETENTION值決定。(2)UPS:在undo中每秒產(chǎn)生的數(shù)據(jù)塊數(shù)量。表閃回的語法格式如下:FLASHBACKTABLE[用戶方案名.]表名

TO{[BEFOREDROP[RENAMETO新表名]]|[SCN|TIMESTAMP]表達(dá)式[ENABLE|DISABLE]TRIGGERS}相關(guān)參數(shù)說明如下。(1)BEFOREDROP:表示恢復(fù)到刪除之前。(2)RENAMETO:表示恢復(fù)時(shí)更換表名。(3)SCN:表示系統(tǒng)改變號(hào),可以從flashback_transaction_query數(shù)據(jù)字典中查到。(4)TIMESTAMP:表示系統(tǒng)郵戳,包含年、月、日及時(shí)、分、秒。(5)ENABLETRIGGERS:表示觸發(fā)器恢復(fù)之后的狀態(tài)為ENABLE。默認(rèn)為DISABLE。表閃回【例10.6】首先創(chuàng)建一個(gè)表,然后刪除某些數(shù)據(jù),再利用FlashbackTable命令恢復(fù)。(1)使用SYS登錄SQL*Plus并創(chuàng)建CJB1表。SETTIMEONCREATETABLEcjb1 ASSELECT*FROMcjb;通過SELECT語句可查看CJB1表中的數(shù)據(jù)。(2)刪除學(xué)號(hào)為151113學(xué)生的選修課程記錄并提交。DELETEFROMcjb1 WHERE學(xué)號(hào)=

'151113';

/*刪除的時(shí)間點(diǎn)為16:54:35*/COMMIT;使用SELECT語句查詢cjb1表,學(xué)號(hào)為151113學(xué)生的選修課程記錄已不存在。表閃回(3)使用表閃回進(jìn)行恢復(fù)。ALTERTABLEcjb1ENABLEROWMOVEMENT;FLASHBACKTABLEcjb1TOTIMESTAMP TO_TIMESTAMP('2015-7-616:54:35','YYYY-MM-DDHH24:MI:SS’);整個(gè)操作過程及恢復(fù)結(jié)果如圖。04刪除閃回1.刪除閃回的操作2.回收站管理刪除閃回1.刪除閃回的操作與Windows文件刪除功能相似,當(dāng)用戶刪除一個(gè)表時(shí),Oracle系統(tǒng)會(huì)將該表放到回收站中,直到用戶決定永久刪除它,使用PURGE命令對回收站空間進(jìn)行清除,或在出現(xiàn)表空間的空間不足時(shí),它才會(huì)被刪除。回收站是一個(gè)虛擬容器,用于存儲(chǔ)所有被刪除的對象。為了避免被刪除的表與同類對象名稱重復(fù),被刪除表(或者其他對象)放到回收站時(shí),Oracle系統(tǒng)對被刪除表(或?qū)ο竺┻M(jìn)行了轉(zhuǎn)換。轉(zhuǎn)換后的名稱格式如下:BIN$globalUID$Sversion其中,globalUID是一個(gè)全局唯一的標(biāo)識(shí)對象,長度為24字符,它是Oracle系統(tǒng)內(nèi)部使用的標(biāo)識(shí);$Sversion是數(shù)據(jù)庫分配的版本號(hào)。通過設(shè)置初始化參數(shù)RECYCLEBIN,可以控制是否啟用回收站功能。啟用回收站的語句如下:

ALTERSESSIONSETRECYCLEBIN=ON;設(shè)置為OFF時(shí)則表示關(guān)閉,默認(rèn)為ON。數(shù)據(jù)字典USER_TABLES中的dropped列表示表是否被刪除,可使用SELECT語句查詢:SELECTtable_name,droppedFROMUSER_TABLES;其中,dropped字段值為“YES”的table_name均為轉(zhuǎn)換后的名稱。刪除閃回【例10.7】刪除閃回的實(shí)現(xiàn)。(1)使用SCOTT用戶連接并創(chuàng)建一個(gè)表t1。

CREATETABLEt1(tchar(10));(2)使用DROP命令刪除表t1。

DROPTABLEt1;(3)查詢數(shù)據(jù)字典信息。SELECTOBJECT_NAME,ORIGINAL_NAME,TYPE,DROPTIME FROMRECYCLEBIN;刪除閃回查詢結(jié)果如圖。(4)使用刪除閃回從回收站恢復(fù)表t1。FLASHBACKTABLEt1TOBEFOREDROP;可以看到表t1已經(jīng)恢復(fù)。如果不知道原表名,可以直接使用回收站中的名稱進(jìn)行閃回。刪除閃回2.回收站管理回收站可以提供誤操作后進(jìn)行恢復(fù)的必要信息,但是如果不經(jīng)常對回收站的信息進(jìn)行管理,磁盤空間將會(huì)被長期占用,因此要經(jīng)常清除回收站中無用內(nèi)容。要清除回收站,可以使用PURGE命令刪除回收站中的表、表空間和索引,并釋放其所占用的空間,語法格式如下:PURGE{TABLESPACE表空間名USER用戶名

|[TABLE表名|INDEX索引名]

|

|[RECYCLEBIN|DBA_RECYCLEBIN]}相關(guān)參數(shù)說明如下。(1)TABLESPACE:指清除回收站中的表空間。(2)USER:指清除回收站中的用戶。(3)TABLE:指清除回收站中的表。(4)INDEX:指清除回收站中的索引。(5)RECYCLEBIN:指當(dāng)前用戶需要清除的回收站。(6)DBA_RECYCLEBIN:此參數(shù)可使用戶從Oracle系統(tǒng)回收站清除所有對象,僅SYSDBA系統(tǒng)權(quán)限才能使用。刪除閃回【例10.8】查詢當(dāng)前用戶回收站的內(nèi)容,并用PURGE清除。(1)查詢回收站內(nèi)容。查看結(jié)果如圖。(2)清除表TABLE1。

PURGETABLEtable1;再次查看回收站時(shí),該表已被清除。SELECTOBJECT_NAME,ORIGINAL_NAME FROMUSER_RECYCLEBIN;05數(shù)據(jù)庫閃回?cái)?shù)據(jù)庫閃回?cái)?shù)據(jù)庫閃回可以使數(shù)據(jù)庫回到過去某個(gè)時(shí)間點(diǎn)上或SCN的狀態(tài),用戶不利用備份就能快速實(shí)現(xiàn)時(shí)間點(diǎn)的恢復(fù)。為了能在發(fā)生誤操作時(shí)數(shù)據(jù)庫閃回到之前的時(shí)間點(diǎn)上,需要設(shè)置下面3個(gè)參數(shù)。(1)DB_RECOVERY_FILE_DEST:確定FLASHBACKLOGS的存放路徑。(2)DB_RECOVERY_FILE_DEST_SIZE:指定恢復(fù)區(qū)的大小,默認(rèn)值為空。(3)DB_FLASHBACK_RETENTION_TARGET:設(shè)定數(shù)據(jù)庫閃回的保存時(shí)間,單位為分鐘,默認(rèn)為1天。數(shù)據(jù)庫閃回當(dāng)用戶發(fā)布FLASHBACKDATABASE語句后,Oracle系統(tǒng)首先檢查所需的歸檔文件和聯(lián)機(jī)重做日志,如果正常,則恢復(fù)數(shù)據(jù)庫中所有數(shù)據(jù)文件到指定的SCN或時(shí)間點(diǎn)上。數(shù)據(jù)庫閃回的語法如下:FLASHBACK[STANDBY|DATABASE數(shù)據(jù)庫名{

TO[SCN|TIMESTAMP]表達(dá)式

|TOBEFORE[SCN|TIMESTAMP]表達(dá)式}相關(guān)參數(shù)說明如下。(1)TOSCN:指定SCN。(2)TOTIMESTAMP:指定一個(gè)需要恢復(fù)的時(shí)間點(diǎn)。(3)TOBEFORESCN:恢復(fù)到之前的SCN。(4)TOBEFORETIMESTAMP:恢復(fù)數(shù)據(jù)庫到之前的時(shí)間點(diǎn)。數(shù)據(jù)庫閃回【例10.9】設(shè)置數(shù)據(jù)庫閃回環(huán)境。(1)使用SYS登錄SQL*Plus,查看閃回信息,執(zhí)行兩條命令如下。SHOWPARAMETERDB_RECOVERY_FILE_DESTSHOWPARAMETERFLASHBACK(2)以SYSDBA登錄,確認(rèn)實(shí)例是否在歸檔模式下。CONNECTSYS/Mm123456ASSYSDBASELECTDBID,NAME,LOG_MODEFROMV$DATABASE;SHUTDOWNIMMEDIATE;執(zhí)行結(jié)果如圖。數(shù)據(jù)庫閃回(3)設(shè)置FLASHBACKDATABASE命令為啟用。STARTUPMOUNTALTERDATABASEFLASHBACKON;ALTERDATABASEOPEN;執(zhí)行結(jié)果如圖。數(shù)據(jù)庫閃回【例10.10】數(shù)據(jù)庫閃回。(1)查看當(dāng)前數(shù)據(jù)庫是否為歸檔模式和啟用了數(shù)據(jù)庫閃回。SELECTDBID,NAME,LOG_MODEFROMV$DATABASE;ARCHIVELOGLISTSHOWPARAMETERDB_RECOVERY_FILE_DEST(2)查詢當(dāng)前時(shí)間和舊的閃回號(hào)。SHOWUSER;SELECTSYSDATEFROMdual;ALTERSESSIONSETNLS_DATE_FORMAT='YYYY-MM-DDHH24:MI:SS';SELECTSYSDATEFROMdual;SELECTOLDEST_FLASHBACK_SCN,OLDEST_FLASHBACK_TIME FROMV$FLASHBACK_DATABASE_LOG;SETTIMEON數(shù)據(jù)庫閃回執(zhí)行結(jié)果如圖。數(shù)據(jù)庫閃回(3)在當(dāng)前用戶下創(chuàng)建例表KCB1。CREATETABLEKCB1ASSELECT*FROMSCOTT.kcb;(4)確定時(shí)間點(diǎn),模擬誤操作,刪除KCB1表。SELECTSYSDATEFROMdual;DROPTABLEkcb1;DESCkcb1;執(zhí)行結(jié)果如圖。數(shù)據(jù)庫閃回(5)以MOUNT打開數(shù)據(jù)庫并進(jìn)行數(shù)據(jù)庫閃回。SHUTDOWNIMMEDIATE;STARTUPMOUNTEXCLUSIVE;FLASHBACKDATABASE TOTIMESTAMP(TO_DATE('2015-7-815:23:27','YYYY-MM-DDHH24:MI:SS'));ALTERDATABASEOPENRESETLOGS;執(zhí)行結(jié)果如圖。利用數(shù)據(jù)庫閃回后,通過SELECT語句可以發(fā)現(xiàn)KCB1表恢復(fù)到錯(cuò)誤操作之前,表結(jié)構(gòu)和數(shù)據(jù)都已經(jīng)恢復(fù)。不需要使用數(shù)據(jù)庫閃回時(shí)可使用ALTER語句將其關(guān)閉:ALTERDATABASEFLASHBACKOFF06歸檔閃回歸檔閃回FlashbackDataArchive則通過將變化數(shù)據(jù)另外存儲(chǔ)到創(chuàng)建的歸檔閃回中。這樣可以通過為歸檔閃回單獨(dú)設(shè)置存活策略,使數(shù)據(jù)庫可以閃回到指定時(shí)間之前的舊數(shù)據(jù)而不影響重做日志的策略,并且可以根據(jù)需要執(zhí)行那些數(shù)據(jù)庫對象需要保存歷史變化的數(shù)據(jù),而不是將所有對象的變化數(shù)據(jù)都保存下來,從而可以極大地減少空間需求。創(chuàng)建一個(gè)閃回?cái)?shù)據(jù)歸檔區(qū)使用CREATEFLASHBACKARCHIVE語句,語法格式為:CREATEFLASHBACKARCHIVE[DEFAULT]閃回歸檔區(qū)名稱

TABLESPACE表空間名

[QUOTA數(shù)字值{M|G|T|P}] [RETENTION數(shù)字值{YEAR|MONTH|DAY}];相關(guān)參數(shù)說明如下。(1)DEFAULT:指定默認(rèn)的閃回?cái)?shù)據(jù)歸檔區(qū)。(2)TABLESPACE:指定閃回?cái)?shù)據(jù)歸檔區(qū)存放的表空間。(3)QUOTA:指定閃回?cái)?shù)據(jù)歸檔區(qū)的最大大小。(4)RETENTION:指定閃回?cái)?shù)據(jù)歸檔區(qū)可以保留的時(shí)間,其中YEAR、MONTH和DAY分別表示年、月、日。歸檔閃回【例10.11】創(chuàng)建一個(gè)閃回?cái)?shù)據(jù)歸檔區(qū),并作為默認(rèn)的歸檔區(qū)。使用SYS用戶以SYSDBA登錄,執(zhí)行語句如下:CREATEFLASHBACKARCHIVEDEFAULTtest_archive TABLESPACEUSERS QUOTA10M RETENTION1DAY;歸檔閃回【例10.12】歸檔閃回。(1)使用SCOTT用戶連接數(shù)據(jù)庫,并創(chuàng)建KCB2表。CREATETABLEkcb2ASSELECT*FROMkcb;(2)對KCB2表執(zhí)行歸檔閃回設(shè)置。使用SYS用戶以SYSDBA登錄,執(zhí)行命令如下:ALTERTABLESCOTT.kcb2FLASHBACKARCHIVEtest_archive;說明:取消對于數(shù)據(jù)表的歸檔閃回,使用命令如下:ALTERTABLE表名NOFLASHBACKARCHIVE;(3)記錄SCN。SELECTDBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBERFROMdual;執(zhí)行結(jié)果如圖。刪除KCB2表中的一些數(shù)據(jù):DELETEFROMSCOTT.kcb2WHERE學(xué)分>4;COMMIT;歸檔閃回(4)執(zhí)行歸檔閃回的查詢。SELECT*FROMSCOTT.kcb2ASOFSCN5123052;執(zhí)行結(jié)果如圖,顯示的是未刪除之前的數(shù)據(jù)。第10章事務(wù)、鎖、閃回和Undo表空間Undo表空間01自動(dòng)Undo管理自動(dòng)Undo管理在Oracle系統(tǒng)中,允許創(chuàng)建多個(gè)Undo表空間,但是同一時(shí)間只能激活一個(gè)Undo表空間。使用參數(shù)文件中的Undo_TABLESPACE參數(shù)指定要激活的Undo表空間名,Undo表空間的組織和管理由Oracle系統(tǒng)內(nèi)部機(jī)制自動(dòng)完成。在自動(dòng)Undo管理設(shè)置完成后,數(shù)據(jù)字典DBA_ROLLBACK_SEGS中可以顯示回滾段信息,但是回滾段的管理由數(shù)據(jù)庫實(shí)例自動(dòng)進(jìn)行。在Oracle10g版前,采用在RBS表空間創(chuàng)建大的回滾段方法處理大的事務(wù)。但是由于一個(gè)事務(wù)只能使用一個(gè)回滾段,當(dāng)一個(gè)回滾段動(dòng)態(tài)擴(kuò)展超過數(shù)據(jù)庫文件允許的擴(kuò)展范圍時(shí),將產(chǎn)生回滾段不足的錯(cuò)誤,系統(tǒng)就會(huì)終止事務(wù)。使用自動(dòng)Undo管理后,一個(gè)事務(wù)可以使用多個(gè)回滾段。02Undo表空間的優(yōu)點(diǎn)Undo表空間的優(yōu)點(diǎn)Oracle數(shù)據(jù)庫系統(tǒng)在處理事務(wù)時(shí),將改變前的值一直保存在回滾段中以便跟蹤之前的映像數(shù)據(jù)。只要事務(wù)沒有提交,與事務(wù)有關(guān)的數(shù)據(jù)就一直保存在回滾段中,一旦事務(wù)提交,系統(tǒng)立即清除回滾段中的數(shù)據(jù)。在舊版本中,對于大的事務(wù)處理所帶來的回滾段分配失敗一直沒有完善的解決方法,從Oracle10g版開始采用了Undo表空間,它的優(yōu)點(diǎn)如下。(1)存儲(chǔ)非提交或提交的事務(wù)改變塊備份。(2)存儲(chǔ)數(shù)據(jù)庫改變的數(shù)據(jù)行備份(可能是塊級)。(3)存儲(chǔ)自從上次提交以來的事務(wù)快照。(4)在內(nèi)存中存放邏輯信息或文件中的非物理信息。(5)存儲(chǔ)一個(gè)事務(wù)的前映像(BeforeImage)。(6)系統(tǒng)撤銷數(shù)據(jù)允許非提交事務(wù)。03Undo表空間管理參數(shù)Undo表空間管理參數(shù)Oracle11g數(shù)據(jù)庫系統(tǒng)中,默認(rèn)啟用自動(dòng)Undo管理,同時(shí)支持傳統(tǒng)回滾段的使用。使用自動(dòng)Undo管理,需要設(shè)置下列參數(shù)。(1)Undo_MANAGEMENT:確定Undo表空間的管理方式,如果該參數(shù)設(shè)置為“AUTO”,則表示系統(tǒng)使用自動(dòng)Undo管理;如果設(shè)置為“MANUAL”,則表示使用手動(dòng)Undo管理,以回滾段方式啟動(dòng)數(shù)據(jù)庫。(2)Undo_TABLESPACE:表示使用自動(dòng)Undo管理時(shí),系統(tǒng)默認(rèn)Undo表空間名為UNDOTBS1。(3)Undo_RETENTION:決定Undo數(shù)據(jù)的維持時(shí)間,即用戶事務(wù)結(jié)束后,Undo的數(shù)據(jù)保留時(shí)間默認(rèn)值為900s。以SYS用戶SYSDBA身份登錄,使用SHOW命令可以查詢Undo參數(shù)的設(shè)置情況:

SHOW

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論