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