Oracle數(shù)據(jù)庫是當(dāng)今世界上最流行的商用關(guān)系數(shù)據(jù)庫管理系統(tǒng),提供了非常強(qiáng)大的功能和高效的性能。在Oracle數(shù)據(jù)庫中,系統(tǒng)改變的基本單位是“系統(tǒng)改變編號”(SCN),它是一個持久的單調(diào)遞增的數(shù)字,用于跟蹤數(shù)據(jù)庫的所有變化。
假設(shè)有這樣一個場景:一個銀行正在進(jìn)行轉(zhuǎn)賬操作,假設(shè)從賬戶A轉(zhuǎn)賬到賬戶B,如果轉(zhuǎn)賬完成后出現(xiàn)了故障,此時需要撤銷這次交易,那么怎么辦呢?在Oracle數(shù)據(jù)庫中,這個過程可以通過回滾段和SCN來實現(xiàn)。當(dāng)交易完成時,Oracle將交易的開始SCN記錄到回滾段中,這些操作的數(shù)據(jù)都被提交到數(shù)據(jù)庫中。當(dāng)需要撤銷交易時,Oracle會查詢到這個開始SCN,并從回滾段中獲取撤消操作數(shù)據(jù),然后改變狀態(tài)更新到數(shù)據(jù)庫中。
--將交易的開始SCN記錄進(jìn)回滾段 SAVEPOINT sp_create_voucher; --執(zhí)行交易 INSERT INTO Account(Balance) VALUES (255.00); --提交數(shù)據(jù)到數(shù)據(jù)庫 COMMIT;
當(dāng)然,SCN絕不僅僅是用來進(jìn)行系統(tǒng)的回滾和數(shù)據(jù)的恢復(fù)。它也是日志序列號、數(shù)據(jù)庫版本號和數(shù)據(jù)傳輸?shù)陌姹咎柕鹊龋茧x不開SCN的追蹤和記錄。
在Oracle數(shù)據(jù)庫中,SCN是由后臺進(jìn)程SMON(System Monitor)周期性的維護(hù)和增加的。SMON在Oracle數(shù)據(jù)庫啟動時負(fù)責(zé)清理死亡進(jìn)程、移除暫停的段,回收未提交的區(qū)域等等。此外,SMON還維護(hù)了兩個非常重要的表:SCN$和VERSION$。
SCN$表記錄了每個數(shù)據(jù)文件的SCN狀態(tài),每當(dāng)SMON將系統(tǒng)SCN增加到下一個級別時,SCN$表就會被更新。可以使用如下的SQL語句查看當(dāng)前系統(tǒng)的SCN:
SELECT current_scn FROM v$database;
VERSION$表中記錄著修改過的數(shù)據(jù)塊中的時間戳和SCN的映射情況。數(shù)據(jù)塊的時間戳與記錄在數(shù)據(jù)塊頭中存放的SCN金額,因此,版本$表可以用于查詢一塊數(shù)據(jù)區(qū)域在什么時間發(fā)生過什么改動。
總之,SCN在Oracle數(shù)據(jù)庫中具有至關(guān)重要的作用,是跟蹤和記錄數(shù)據(jù)庫更改的基本單位。熟練掌握Oracle數(shù)據(jù)庫的SCN機(jī)制可以為數(shù)據(jù)庫運維工作帶來很大的幫助和便利。