execute執(zhí)行后
成都創(chuàng)新互聯(lián)公司是一家專(zhuān)業(yè)從事網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)的品牌網(wǎng)絡(luò)公司。如今是成都地區(qū)具影響力的網(wǎng)站設(shè)計(jì)公司,作為專(zhuān)業(yè)的成都網(wǎng)站建設(shè)公司,成都創(chuàng)新互聯(lián)公司依托強(qiáng)大的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營(yíng)經(jīng)驗(yàn),為您提供專(zhuān)業(yè)的成都網(wǎng)站建設(shè)、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)及網(wǎng)站設(shè)計(jì)開(kāi)發(fā)服務(wù)!
可以回滾
commit提交后
不可以回滾
其實(shí)oracle提交數(shù)據(jù)是分兩步操作的,第一步execute執(zhí)行,第二步commit提交。對(duì)應(yīng)的pl\sql也是要先點(diǎn)execute執(zhí)行,執(zhí)行后再點(diǎn)commit提交。
但是
commit提交后
可以用閃回查詢(xún)恢復(fù)原來(lái)的數(shù)據(jù)
因?yàn)閛racle會(huì)將近期的數(shù)據(jù)保存到快照中
如:
select
*
from
table_1
as
of
timestamp
to_timestamp('20080606
20:00:00','yyyymmdd
hh24:mi:ss');
這里'20080606
20:00:00'就是你想恢復(fù)數(shù)據(jù)到哪個(gè)時(shí)間狀態(tài)
table_1是數(shù)據(jù)庫(kù)的表名
這樣查詢(xún)到的數(shù)據(jù)就是執(zhí)行更新操作之前的數(shù)據(jù)
execute執(zhí)行后
可以回滾
commit提交后
不可以回滾
其實(shí)Oracle提交數(shù)據(jù)是分兩步操作的,第一步execute執(zhí)行,第二步commit提交。對(duì)應(yīng)的PL\SQL也是要先點(diǎn)execute執(zhí)行,執(zhí)行后再點(diǎn)commit提交。
但是
commit提交后
可以用閃回查詢(xún)恢復(fù)原來(lái)的數(shù)據(jù)
因?yàn)閛racle會(huì)將近期的數(shù)據(jù)保存到快照中
如:
SELECT
*
FROM
TABLE_1
AS
OF
TIMESTAMP
TO_TIMESTAMP('20080606
20:00:00','YYYYMMDD
HH24:MI:SS');
這里'20080606
20:00:00'就是你想恢復(fù)數(shù)據(jù)到哪個(gè)時(shí)間狀態(tài)
TABLE_1是數(shù)據(jù)庫(kù)的表名
這樣查詢(xún)到的數(shù)據(jù)就是執(zhí)行更新操作之前的數(shù)據(jù)
1、首先在執(zhí)行Update時(shí),Oracle就地更新,如出現(xiàn)原block空間不足的情況,通過(guò)link的方式鏈接至新block上。
2、其次PG的Update,不是原地更新,而是保留原有數(shù)據(jù),通過(guò)新增新的tuple保存新增數(shù)據(jù),原有數(shù)據(jù)通過(guò)Vacuum機(jī)制清理。
3、最后Vacuum機(jī)制需要滿(mǎn)足MVCC的要求,在某些情況下,不會(huì)清理垃圾數(shù)據(jù),在事務(wù)繁忙的時(shí)候?qū)е聲?huì)導(dǎo)致數(shù)據(jù)表空間不斷增長(zhǎng)。
execute執(zhí)行后 可以回滾
commit提交后 不可以回滾
其實(shí)Oracle提交數(shù)據(jù)是分兩步操作的,第一步execute執(zhí)行,第二步commit提交。對(duì)應(yīng)的PL\SQL也是要先點(diǎn)execute執(zhí)行,執(zhí)行后再點(diǎn)commit提交。
但是 commit提交后 可以用閃回查詢(xún)恢復(fù)原來(lái)的數(shù)據(jù) 因?yàn)閛racle會(huì)將近期的數(shù)據(jù)保存到快照中 如:
SELECT * FROM TABLE_1 AS OF TIMESTAMP TO_TIMESTAMP('20080606 20:00:00','YYYYMMDD HH24:MI:SS');
這里'20080606 20:00:00'就是你想恢復(fù)數(shù)據(jù)到哪個(gè)時(shí)間狀態(tài) TABLE_1是數(shù)據(jù)庫(kù)的表名 這樣查詢(xún)到的數(shù)據(jù)就是執(zhí)行更新操作之前的數(shù)據(jù)
回滾段中保存的回滾數(shù)據(jù)有 個(gè)作用 一致讀和回滾 回滾段是由連續(xù)block組成的區(qū)間extent組成 回滾段有順序的循環(huán)的使用這些區(qū)間 當(dāng)當(dāng)前區(qū)間寫(xiě)滿(mǎn)的時(shí)候 oracle移向下一個(gè)區(qū)間 如一個(gè)回滾段有 個(gè)區(qū)間A B C D;當(dāng)區(qū)間C被寫(xiě)滿(mǎn)的時(shí)候 oracle將寫(xiě)區(qū)間D 而當(dāng)D寫(xiě)滿(mǎn)的時(shí)候 oracle將嘗試重新寫(xiě)區(qū)間A 這樣循環(huán)的有順序的使用區(qū)間
事務(wù)必須將回滾信息寫(xiě)到回滾段中 事務(wù)的當(dāng)前新產(chǎn)生的回滾信息寫(xiě)在該回滾段的位置叫做回滾段的head 而在該回滾段上最早發(fā)生的尚未提交的事務(wù)最早產(chǎn)生的回滾信息所在位置叫做回滾段的tail 當(dāng)前區(qū)間寫(xiě)滿(mǎn)的時(shí)候 oracle移動(dòng)head到下一個(gè)區(qū)間
i時(shí)每個(gè)事務(wù)只能使用一個(gè)回滾段 Oracle會(huì)根據(jù)回滾段workload 平均將事務(wù)分配給各個(gè)回滾段 在回滾段使用上的一些規(guī)則
一個(gè)事務(wù)只能使用一個(gè)回滾段
多個(gè)事務(wù)可以共用一個(gè)區(qū)間 但Active的事務(wù)不能共用一個(gè)block
回滾段的current extent寫(xiě)滿(mǎn)的時(shí)候 回滾段的Head不能夠移動(dòng)到回滾段tail所在的區(qū)間
區(qū)間總是被有順序的循環(huán)的時(shí)候 當(dāng)head移動(dòng)的時(shí)候 不會(huì)跳躍區(qū)間 只能移動(dòng)到下一個(gè)區(qū)間
如果head不能夠使用下一個(gè)區(qū)間(如tail在下一個(gè)區(qū)間) 將會(huì)分配一個(gè)新的區(qū)間extent 并將新區(qū)間extent插入到這個(gè)循環(huán)使用的extent圈中 這叫做回滾段的擴(kuò)展
ORA snapshot too old主要是在一致讀和延遲塊清除delay block cleanout的時(shí)候產(chǎn)生
[參考]一致讀的步驟
Read the Data Block
Read the Row Header
Check the Lock Byte to determine whether theres an ITL entry
Read the ITL entry to determine the Transaction ID (Xid)
Read the Transaction Table using the Transaction ID If the transaction has been mitted and has a System Commit Number less than the querys System Change Number update the status of the block (block cleanout) and start over at step
第 步細(xì)分
IF 在Transaction Table 中根據(jù)Transaction ID 找到transaction
IF transaction 已經(jīng)mit
IF query scnmit scn
則接受該塊 進(jìn)行clean out 返回
ELSEIF query scn
則進(jìn)行一致性讀 從第 步向后執(zhí)行
ELSEIF transaction 沒(méi)有mit
也進(jìn)行一致性讀 從第 步向后執(zhí)行
ELSEIF 在Transaction Table 中沒(méi)有找到transaction(undo header中的transaction slot被覆蓋了 也說(shuō)明事務(wù)已經(jīng)提交 因?yàn)橹挥刑峤缓笏诘膖ransaction slot才能被覆蓋 這樣query scn則去比較control scn 在該回滾段上control scn以前的transaction都已經(jīng)被提交 也就是事務(wù)表中所能找到的最小的mit scn了)
IF query scn
則無(wú)法知道query scn和mit scn得大小關(guān)系 出現(xiàn)ORA 錯(cuò)誤
IF query scncontrol scn
則query scn肯定mit scn
則接受該塊 進(jìn)行clean out 并將block 中ITL標(biāo)記上 U 表示 upper bound mit 并返回
Read the last undo block (Uba)
Compare the block transaction ID with the transaction table transaction ID If the Transaction ID in the undo block doesnt equal the Transaction ID from the Transaction Table then issue ORA Snapshot Too Old 表示回滾段中回滾信息被覆蓋 無(wú)法為一致讀提供必需的before image
If the Transaction IDs are identical make a copy of the data block in memory Starting with the head undo entry apply the changes to the copied data block
If the tail undo entry (the actual first undo entry in the chain or the last in the chain going backwards!) indicates another data block address read the indicated undo block into memory and repeat steps and until the undo entries dont contain a value for the data block address
When theres no previous data block address the transaction has been pletely undone
If the undo entry contains:
a a pointer to a previous transaction undo block address read the Transaction ID in the previous transaction undo block header and read the appropriate Transaction Table entry Return to step
b an ITL record restore the ITL record to the data block Return to step
出現(xiàn) 的時(shí)候 首先判斷是哪個(gè)原因?qū)е?可以設(shè)置event 如果因?yàn)閠ransaction slot被覆蓋導(dǎo)致 則增加回滾段數(shù)目 如果因?yàn)榛貪L信息被覆蓋 則增加回滾大大小 錯(cuò)誤比較復(fù)雜 通常需要考慮很多問(wèn)題
event = trace name processstate forever level
lishixinzhi/Article/program/Oracle/201311/17091