Version database的目標:
Version database用來確保OLAP定期Load Data時前台USER所查詢到的資料結果。
Load Data時,在OLAP系統中所常發生的問題:
1. 由於資料庫有reference關係,所以Load Data時,所以資歷進入系統是有順序性的,因此會在Load Data時通常會影響查詢的結果。
何謂Version log?
Version log當Insert、Update、Delete操作及TMU相關的操作發生時用來記錄Data Block變動的狀況, 當你完成Load Data後指定新的資料庫version。
Version log的結構:
第一個Data block名稱為DB0,最後一個Data block名稱為DB4,當query發生時,所讀取的Data Block如下:
DB0、DB1、DB2、DB3、DB4
這時如果有一個transaction對DB0 Data Block進行update且commit,此時Version log會紀錄相關的變更,如下圖。
如果這個時候query發生,則查到的data block如下:
(VL0,1)、DB1、DB2、DB3、DB4
若此時若有另一個transaction 對DB0、DB2上資料進行Update及Commit操作,此時的Version log如下圖:
當query發生時,則查到的data block如下:
(VL0,2)、DB1、(VL2,1)、DB3、DB4
所以由上圖我們知道, Version Log主要用來記錄data block變更的版本資料。
Version Log用來控制multi query中資料一致性的問題,如下圖所示:
Query 1在12:00對資料庫進行查詢,此時有一個Update指令對資料庫資料進行操作;Query 2在12:01對資料庫進行查詢,待Query 2作業結束後,有另一個Update指令對資料庫進行資料操作; Query 3在12:03對資料庫進行查詢。
Query 1會直接讀取data block,
Query 2會讀取部分的data block及version log
Query 3會讀取部分的data block及version log
透過alter database Freeze Query Version指令可以將將資料庫設定為Freeze(凍結) mode。如果在11:59前下了 alter database Freeze Query Version指令,Query1、Query2、Query3所查詢到的結果都會是11:59時的資料結果。
Freeze Mode下的資料庫只允許下列的作業執行:
1. Version Operations, set use latest version on指令。
2. Current User的Insert、Update、delete動作。
3. 針對local operation session中所操作的temp table作業。
4. 任何對table的變更(非結構調整),例如註解(Common)。
5. 對既有的database object不產生影響的指令,如create table、create segment等。
How to Start Database Freeze Mode?
RISQL>alter database freeze query revision;
How to Overriding(撤銷) Database Freeze Mode?
RISQL>set use latest revision on;
RISQL>alter database unfreeze query revision;
How to Control Version log?
To create and enable a versioned database:
- create version log segment
- check no user connect the database
- create version log
- start the version log
下面的步驟可以將session enable version log:
- 將rbw.config中OPTION VERSION參數設為ON。
- 在RISQL中使用SET VERSION ON將目前Current session的Version log設為ON。
PS:若SET VERSION ON,但尚未建立Version log 或尚未將Enable database Version,這時任何嘗試變更資料庫指令的transaction會有錯誤訊息。
How to Create Version log:
由於最資料庫data的變更操作(insert、update、delete)都會將相關變更資訊記錄下來,因此performance的瓶頸有可能會發生於Disk I/O上,所以建議將version log建在I/O效能較高的的磁碟上。
Max Size=(block數*8K byte)*120%
How to Clean Version log:
時機:
1. 當要進行checkpoint backup時。
2. Drop Version log 前。
RISQL>Alter database clean version log
注意:
1. 當要clean version log 時,記住先將database 設為read-lock。
2. 當你從backup file中restore你的資料庫系統時,記住在下aletr database clean version log 語句中要加上remove damaged segment 參數。
判斷:
透過下面的敘述句,若沒有row回傳則表示Version log已被清除。
RISQL>select dbname FROM dst_databases
where dbname = ’Database_name’
and current_revision <> latest_merged_revision;
How to Drop version log and add space?
要增加Version log space的步驟如下:
1. 停用version log
RISQL>alter database stop versioning;
2. clean the version log
RISQL>alter database clean version log;
3. 查詢DTS_DATABASES系統表格
RISQL> select current_revision, latest_merged_revision from dst_databases;
CURRENT_REV LATEST_MERGED_REV
1 1
4. Drop version log
RISQL>alter database drop version log;
5. Create another bigger segment
RISQL> create segment versionlog storage ’ version_log_segment’ maxsize 20000;
6. Re-create Version log segment and modify large space
RISQL>alter database create version log in version_log_segment;
7. 重新啟動Version log
RISQL>alter database start versioning;
How to Maintaining a versioned database ?
Monitor Version Log
Version log 的space size可以透過DST_DATABASE系統表來查到相關的資訊。
Backup and Recovery
在checkpoint backup及full restore、partial restore前並須將version log set為empty.
示範與步驟:
1. connect into database
2. create the segment
RISQL> create segment versionlog storage ’version.log’ maxsize 10000;
3. create the version log in segment
RISQL> alter database create version log in versionlog;
4. start version log
RISQL> alter database start versioning;
5. enable the session to use the version log
RISQL> set versioning on;