茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1676429 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00018.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2008/3/19 5:33:24
Informix入門之---日誌分析

大家都知道informix是需要日誌的,但各日誌都做什麼用,各有什麼意義等等,我們在下面做一個探討:
首先需要說明的是informix的日誌有兩種:一種是物理日誌,用來存放數據的前映象;另一種是邏輯日誌,用來存放所有事物的操作過程。
在初始化的配置中,物理日誌和邏輯日誌的不是存放在根的磁盤空間的。默認的大小物理日誌2M,邏輯日誌6個,每個日誌文件2M。但在實際的生產環境中,這兩個參數一般是需要調整的。
從informix的本身的建議來說,要求邏輯日誌的大小一般是要求一天的業務量,邏輯日誌滾一圈,物理日誌/邏輯日誌=1/3。但是有的數據量很大的業務系統,這樣做是不可能的,要做適當的調整。
物理日誌文件的個數僅為1,邏輯日誌文件的個數最小為3,最大為32767。
關於物理日誌和邏輯日誌的改變,我們可以使用onparams命令來完成。
C:\Informix>onparams --
Usage: onparams -a -d <DBspace> [-s ] [-i] |
-d -l <log file number> [-y] |
-p -s [-d <DBspace>] [-y]
-a - Add a logical log file
-i - Insert after current log
-d - Drop a logical log file
-p - Change physical log size and location
-y - Automatically responds "yes" to all prompts

上面是onparams的幫助文件,
下面我們首先來改變物理日誌的位置和大小:
C:\Informix>onparams -p -s 40000 -d phydbs -y
Shutting down, please wait ...
Initializing, please wait ...
Recovering, please wait ...

可以通過onstat –l 中的phybegin來查看物理日誌當前存在了哪個chunk上。Physize來查看當前物理日誌文件大大小,單位是頁。
在這之前我們創建了phydbs,並指定了他大小。我們在-s後指定物理日誌文件的大小,在-d後指定物理日誌文件的位置。
接著我們來做邏輯日誌位置和大小的改變:
C:\Informix>onparams -a -d logdbs -s 30000 -i
Logical log successfully added.

然後用onstat –l來查看新加的邏輯日誌:
C:\Informix>onstat -l
IBM Informix Dynamic Server Version 9.40.TC2E1 -- Quiescent -- Up 00:08:10 -- 25728 Kbytes
Physical Logging
Buffer bufused bufsize numpages numwrits pages/io
P-1 0 8 8 7 1.14
phybegin physize phypos phyused %used
3:53 10000 12 0 0.00

Logical Logging
Buffer bufused bufsize numrecs numpages numwrits recs/pages pages/io
L-3 0 8 37 14 14 2.6 1.0
Subsystem numrecs Log Space used
OLDRSAM 37 2628

address number flags uniqid begin size used %used
0CB37CA8 1 U-B---- 1 1:763 500 500 100.00
0CB37CE8 2 U-B---- 2 1:1263 500 500 100.00
0CB37D28 3 U-B---- 3 1:1763 500 500 100.00
0CB37D68 4 U-B---- 4 1:2263 500 500 100.00
0CB37DA8 5 U-B---- 5 1:2763 500 284 56.80
0CB37DE8 6 U---C-L 6 1:3263 500 315 63.00
0CED8B98 12 A------ 0 2:37553 7500 0 0.00
0CED8B58 11 A------ 0 2:30053 7500 0 0.00
0CED8B18 10 A------ 0 2:22553 7500 0 0.00
0CED8AD8 9 A------ 0 2:15053 7500 0 0.00
0CED8A98 8 A------ 0 2:7553 7500 0 0.00
0CED8A58 7 A------ 0 2:53 7500 0 0.00
12 active, 12 total

可以發現新加的邏輯日誌狀態都是A,先做0級備份ontape –s –L 0之後用onstat –l可以發現所有日誌的flag位都變成了F狀態。
然後用onmode –l切換邏輯日誌到新加的邏輯日誌,用onmode –c強製做檢查點操作。
最後用onparams –d –l log_file_num –y來刪除原來的邏輯日誌文件。
這樣就完成了informix日誌的遷移。
在onstat –l中,flag位表示了邏輯日誌的狀態,
A表示新加了還不能使用的日誌
F表示空閒的可以使用的日誌,一般是在0級備份之後才有這樣的狀態
U表示已經使用的邏輯日誌
L表示當前的日誌文件包含一個檢查點
C表示正在使用當前的日誌文件
B表示已經備份的日誌文件
一般在新增或刪除日誌文件之後都要做0級備份。
在onconfig文件中,LOGFILES指定了IDS邏輯日誌的個數,LOGSIZE指定了邏輯日誌的大小,PHYSDBS指定了物理日誌的位置, PHYSFILE指定了物理日誌大小。LTAPEDEV指定了邏輯日誌備份的位置,LTAPEBLK指定了每個block塊的大小,LTAPESIZE指定了備份文件的大小。
下面我們討論數據庫的日誌模式:
無日誌
無緩衝日誌
緩衝日誌
ansi模式
我們可以通過ontape 來改變日誌的模式
採用無日誌的方式時,所有的DML語句都不寫日誌,也就是說此時,數據庫不支持事物。當數據庫恢復系統備份的時候,無日誌的數據庫不能完全恢復。因為在備份中只記錄了備份時的狀態,備份後的數據庫的變化必須從邏輯日誌中恢復,所以這些改變是不可恢復的。
緩衝日誌:
所有的DML語句都寫入log buffer,當log buffer寫滿的時候,就開始寫入磁盤。這樣就可以大大減少磁盤的I/O,從而提高數據庫的性能。
但是在系統發生問題恢復的時候,緩衝區內的數據將丟失。這些數據是不可能恢復的。
無緩衝日誌模式:
所有的 DML語句在發生的時候是寫到緩衝裡的,但事物commit之後就立刻寫回磁盤,這樣在系統發生問題就保證了數據丟失的最少,但是增加了磁盤的I/O,所以數據庫的性能會受到一定的影響。
Ansi模式:
此模式和無緩衝日誌模式具有相同的日誌緩衝處理方法,但是此模式是不可逆的。
另外BLOB日誌的處理也是十分特別的,他不需要物理日誌,不寫前映象。BLOB頁是直接寫磁盤的,不經過共享內存的處理。任何BLOB空閒映象的改變都將記錄到邏輯日誌中,所有的blob spaces數據刷新到硬盤上是隨邏輯日誌的的備份而寫下去的。

Informix入門之---空間管理
說起數據庫就不能不說數據庫的存儲,說存儲就不能不說數據庫對空間的管理。這裡我們主要談的是IDS對空間的管理的相關問題。
從物理上來說,IDS管理的主要是page,chunk;從邏輯上來說主要是extent,tablespace,dbsapce。連續的page組成 extent,多個extent組成tablespace,dbspace用來邏輯的管理chunk,而每個tablespace又是建立在 dbsapce上的。
Chunk:一個單位的物理磁盤空間,在9.4版本之前不應許超過2G。一個chunk由path,offset,size三部分組成。因此我們在使用 onspaces命令來加chunk的時候這三個參數是必不可少的。理論上一個數據庫服務器上最多有2048個存儲塊,但是實際上由UNIX內核規定的一個進程所能打開的文件數來確定的。如果是使用cooked file來做為存儲,那麼offset可以設置為0,如果使用raw device來做為存儲,那偏移量不能為0,至少第一個CHUNK的offset不能為0。
Page:是一最基本的I/O單位。一個page的大小是由OS來決定的,有2K的,也有4K的。我們拿2K的來舉例說明。一個page有2048個 bit,頁頭由24bit組成,頁尾有一個4bit的時間戳,也就是說每一個page剩餘的空間只有2020個bit,另外在每一個page上還有一個槽表,一個槽表4bit,一條記錄對應一個槽表,這樣在每一個page上存放的記錄數就可以定下來。說這些的目的是為了說明在我們建表的時候儘量表不要建的太大,有的表一條記錄的大小就超過了一個page,這樣在讀取的效率上並不是太高。另外還有一個FILLFACTOR的參數決定了數據頁的填充程度,如果此值設置的不是太合理,經常上現節點分裂的情況,那對錶的讀取效率肯定是有影響的。
Extent:是磁盤上連續page的一組集合。在每個extent內的page都是連續的,在表中默認的extent的大小是16K, extent&的大小決定了表中數據存放的集中程度。如果數據存放的過與分散在做磁盤I/O的時間肯定會變長,一般的情況下每個表的extent 的大小建議不要超過50,如果太大,就需要做合理的調整。另外不能不提的是在隨著extent數目的增長,每次分出的空間的大小是不不一樣的,在每到16 的時候,就翻倍。例如第一個extent是16K,第17個extent就是32K,第33個就是64K了,在翻倍的增長。
Tablespace:是extent的邏輯集合。各個extent在物理上不一定是連續的。
Dbspace:是一組chunk的邏輯集合。一般是把裸設備的chunk放在一個dbspace中,或者把一組熟文件放在一組chunk中,也有的把裸設備和熟文件放在一組dbspace中,但不建議這麼做。
其實在dbsapce中又有三類,一類就是一般的存放數據的dbsapce,另一類就是tempdbspace,還有一種是blobspace。第一種我就不說了。我們先說blobsapce.
Blobspace:blobspace是一組邏輯組織的chunk,但是是用來存儲byte和text類型的數據。Blobspace中不能存放行或索引,只能存放存儲了blob的頁面和存儲了關於BLOB的系統信息頁面。因為blobspace中的BLOB頁面的大小是在創建的時候指定的,所有一個 blobspace中的所有BLOB頁面大小相同。對BLOB的寫,是沒有在緩衝池中緩衝的,因此BLOB的值不寫邏輯日誌文件。當修改了BLOB的值之後,應該在磁盤上流出足夠的空間以放BLOB的初始值和修改值。
Tempdbspace:是一組臨時的dbspace。他在DBSPACETEMP參數中指定。需要在onspaces創建的時候加上-t的參數。對 tempsaces的操作是不寫邏輯日誌的。在創建臨時表和做group by ,order by,使用join語句,創建index的時候都是需要臨時空間的。一般的情況下所有的tempspace的大小為正常業務數據的10%。如果太小了很大的操作就會出問題。
Select * from tab_a insert into temp tab_b是不寫到tempdbspace的。
Select * from tab_a insert into temp tab_b with no log才寫到tempdbspace。

Informix入門之---SQL函數整理
聚集函數:
avg,求平均值
count,統計記錄的條數
max,求最大值
min,求最小值
range,計算所選行的最大值與最小值的差
stdev,計算所選行的標準偏差
sum,求和函數
variance,函數返回值樣本的方差做為所有選擇行的方差的無偏估計。
它的公式,(sum(xi**2)-sum(xi)**2)/N)/(N-1)
其中xi是列中的每個值,N是列中值的總和。
時間函數:
day,mdy,month,weekday,year 這些函數返回與用來調用函數的表達式或自身變量的值。Current返回當前的日期和時間值,可以用extend函數來調整date或datetime值的精度。
使用day和current 函數來將列值與當前日期進行比較。
Date函數將字符串函數轉換為DATE值。例date(『12/7/04’)
To_char函數將datetime和date值轉化為字符值。
To_date函數將字符值轉化為datetime類型的值。例to_date(「1978-10-07 10:00」 ,」%Y-%m-%d %H:%M)
基數函數:
cardinality(僅適用IDS)函數對集合包含的元素數目計數。
智能大對象函數,(僅適用與IDS)
filetoblob( ),將文件複製到BLOB列中
filetoclob( ),將文件複製到CLOB列中
locopy( ),將BLOB或CLOB類型的數據複製到另一個BLOB或CLOB列中
lotofile( ),將BLOB或CLOB複製到文件中
字符串處理函數:
lower,將字符串中每個大寫字母轉換為小寫字母
upper,將字符串中每個小寫字母轉換為大寫字母
initcap,將字符串中每個詞的首寫字母轉換成大寫
replace,將字符串中的某一組字符轉換成其他字符,例replace(col,」each」,」eve」)
substr,返回字符串中的某一部分,例substr(col,1,2)
substring,返回字符串中的某一部分,例substring(col,from 1 to 4)
lpad,使用lpad函數已用重複次數達到必要次數的字符序列在左邊填充或截斷的字符串的副本,這取決於字符串中填充部分的指定長度。
舉例:字段 col 為char(15)類型,select lpad(col,21,」_」) from tab_name則顯示為在col前加上六個_。
Rpad,使用rpad函數已用重複次數達到必要次數的字符序列在右邊填充或截斷的字符串的副本,這取決於字符串中填充部分的指定長度。
舉例:字段col為char(15)類型,select rpad(col,21,」_」) from tab_name則顯示為在col後邊加上六個_。
其他函數:
hex,返回表達式的十六進制數
round,返回表達式的四捨五入值
trunc,返回表達式的截斷值
length,計算表達式的長度
user,返回執行查詢的用戶的用戶名(登陸帳戶名)
today,返回當前系統日期
dbservername,返回數據庫服務器的名稱,同sitename
dbinfo,返回數據庫的相關信息
decode,函數來將一個具有一個值的表達式轉換為另一個值
decode(test,a,a_value,b,b_value,c,c_value……),decode函數不支持TEXT和BYTE類型。
Nvl,來將求值為空的表達式轉化為另一個想要指定的值。
另外還可以在select語句中使用存儲過程,如select spl($test) from tab_name

如有不對或不全面的地方請大家跟貼說明,謝謝。
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|