oracle scn詳解
1.什麼是scn?
SCN用以標識資料庫在某個確切時刻提交的版本。在事務提交時,它被賦予一個唯一的標識事務的SCN。SCN同時被作為Oracle資料庫的內部時鐘機制,可被看做邏輯時鐘,每個資料庫都有一個全域性的SCN生成器。
SCN(System Change Number),也就是通常所說的系統改變號,是資料庫中非常重要的一個數據結構。
SCN用以標識資料庫在某個確切時刻提交的版本。在事務提交時,它被賦予一個唯一的標識事務的SCN。SCN同時被作為Oracle資料庫的內部時鐘機制,可被看做邏輯時鐘,每個資料庫都有一個全域性的SCN生成器。
作為資料庫內部的邏輯時鐘,資料庫事務依SCN而排序,Oracle也依據SCN來實現一致性讀(Read Consistency)等重要資料庫功能。另外對於分散式事務(Distributed Transactions),SCN也極為重要,這裡不做更多介紹。
SCN在資料庫中是唯一的,並隨時間而增加,但是可能並不連貫。除非重建資料庫,SCN的值永遠不會被重置為0.
一直以來,對於SCN有很多爭議,很多人認為SCN是指System Commit Number,而通常SCN在提交時才變化,所以很多時候,這兩個名詞經常在文件中反覆出現。即使在Oracle的官方文件中,SCN也常以System Change/Commit Number兩種形式出現。
到底是哪個詞其實不是很重要,重要的是需要知道SCN是Oracle內部的時鐘機制,Oracle通過SCN來維護資料庫的一致性,並通過SCN實施Oracle至關重要的恢復機制。
SCN在資料庫中是無處不在,常見的事務表、控制檔案、資料檔案頭、日誌檔案、資料塊頭等都記錄有SCN值。
冠以不同字首,SCN也有了不同的名稱,如檢查點SCN(Checkpint SCN)、Resetlogs SCN等。
1.1.scn的作用
- 讀資料的一致性
- 資料庫恢復
- Flashback
- Stream
- 等等其他的
2.scn如何產生?
SCN: oracle system change number.表示oracle 系統改變號。SCN是一個由之間轉換過來的數字,可以通過下列語句轉換SCN和具體時間。
SELECTDBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER,
SCN_TO_TIMESTAMP(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER)FROM DUAL;
[email protected]> select dbms_flashback.get_system_change_number,SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) from dual;
GET_SYSTEM_CHANGE_NUMBER SCN_TO_TIMESTAMP(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER)
------------------------ ---------------------------------------------------------------------------
1387175 12-MAR-14 11.35.56.000000000 AM
[email protected]>
[email protected]> select CURRENT_SCN from v$database;
CURRENT_SCN
-----------
1386439
2.1.SCN檢視與轉換
Oracle資料庫提供了兩種直接檢視系統當前SCN的方法,一個是V$DATABASE中的CURRENT_SCN列,另外一個就是通過dbms_flashback.get_system_change_number得到。
1 2 3 4 5 6 |
SQL>
col scn for 9999999999999
SQL> SELECT current_scn
scn FROM v$ database ;
SCN
--------------
7046242302279
|
1 2 3 4 5 6 |
SQL>
col scn for 9999999999999
SQL> SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER
scn FROM DUAL;
SCN
--------------
7046242302616
|
1 2 3 4 5 6 7 8 |
SQL>
col scn2 for 9999999999999
SQL>
col scn for 9999999999999
SQL> SELECT current_scn
scn,
DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER
scn2
FROM v$ database ;
SCN
SCN2
|