您正在看的sybase教程是:日志問(wèn)題普及篇。
以下資料源于sybase.com.cn
SYBASE SQL Server 的每一個(gè)數據庫,無(wú)論是系統數據庫(master,model, sybsystemprocs, tempdb),還是用戶(hù)數據庫,都有自己的transaction log,每個(gè)庫都有syslogs表。Log記錄用戶(hù)對數據庫修改的操作,所以如果不用命令清除, log會(huì )一直增長(cháng)直至占滿(mǎn)空間。清除log可用dump transaction 命令;或者開(kāi)放數據庫選項trunc log on chkpt,數據庫會(huì )每隔一段間隔自動(dòng)清除log。管理好數據庫log是用戶(hù)操作數據庫必須考慮的一面。
下面就幾個(gè)方面談?wù)刲og及其管理:
一、SQL Server 如何記錄及讀取日志信息
我們知道,SQL Server是先記log的機制。Server Cache Memory中日志頁(yè)總是先寫(xiě)于數據頁(yè):
Log pages 在commit ,checkpoint,space needed 時(shí)寫(xiě)入硬盤(pán)。
Data pages 在checkpoint,space needed 時(shí)寫(xiě)入硬盤(pán)。
系統在recovery 時(shí)讀每個(gè)database 的syslogs 表的信息,回退未完成的事務(wù)(transaction)(數據改變到事務(wù)前狀態(tài));完成已提交的事務(wù)(transaction)(數據改變?yōu)槭聞?wù)提交后的狀態(tài))。在Log中記下checkpoint點(diǎn)。這樣保證整個(gè)數據庫系統的一致性和完整性。
二、Transaction logs 和checkpoint 進(jìn)程
checkpoint 命令的功能是強制所有“臟”頁(yè)(自上次寫(xiě)入數據庫設備后被更新過(guò)的頁(yè))寫(xiě)入數據庫設備。自動(dòng)的checkpoint 間隔是由SQL Server 根據系統活動(dòng)和系統表sysconfigures中的恢復間隔(recovery interval)值計算出的。通過(guò)指定系統恢復所需的時(shí)間總量,恢復間隔決定了checkpoint 的頻率。
如果數據庫開(kāi)放trunc log on chkpt選項,則SQL Server在數據庫系統執行checkpoint時(shí)自動(dòng)清除log。但用戶(hù)自己寫(xiě)入執行的checkpoint命令并不清除log,即使trunc log on chkpt選項開(kāi)放。只有在trunc log on chkpt選項開(kāi)放時(shí),SQL Server自動(dòng)執行checkpoint動(dòng)作,才能自動(dòng)清除log 。這個(gè)自動(dòng)的checkpoint動(dòng)作在SQL Server中的進(jìn)程叫做checkpoint進(jìn)程。當trunc log on chkpt選項開(kāi)放時(shí),checkpoint進(jìn)程每隔0秒左右清除log,而不考慮recovery interval設置時(shí)間的間隔。
三、Transaction log 的大小
沒(méi)有一個(gè)十分嚴格的和確切的方法來(lái)確定一個(gè)數據庫的log應該給多大空間。對一個(gè)新建的數據庫來(lái)說(shuō),log大小為整個(gè)數據庫大小的20%左右。因為log記錄對數據庫的修改,如果修改的動(dòng)作頻繁,則log的增長(cháng)十分迅速。所以說(shuō)log空間大小依賴(lài)于用戶(hù)是如何使用數據庫的。
例如:
update,insert和delete 的頻率
每個(gè)transaction 中數據的修改量
SQL Server系統參數recovery interval 值
log是否存到介質(zhì)上用于數據庫恢復
還有其它因素影響log大小,我們應該根據操作估計log大小,并間隔一個(gè)周期就對log進(jìn)行備份和清除。
四、檢測log 的大小
若log 在自己的設備上,dbcc checktable (syslogs) 有如下信息:
例:***NOTICE:space used on the log segment is 12.87Mbytes,64.35%
***NOTICE:space free on the log segment is 7.13Mbytes,35.65%
根據log剩余空間比例來(lái)決定是否使用dump transaction 命令來(lái)備份和清除log。
用快速方法來(lái)判斷transaction log 滿(mǎn)的程度。
1>use database_name
2>go
1>select data_pgs (8,doa mpg)
2>from sysindexes where id=8
3>go
Note:this query may be off by as many as 16 pages.
在syslogs 表用sp_spaceused 命令。
五、log 設備
一般來(lái)說(shuō),應該將一個(gè)數據庫的data和log存放在不同的數據庫設備上。這樣做的好處:
可以單獨地備份(back up)transaction log
防止數據庫溢滿(mǎn)
可以看到log空間的使用情況。[dbcc checktable (syslogs)]
可以鏡像log設備
六、log 的清除
數據庫的log是不斷增長(cháng)的,必須在它占滿(mǎn)空間之前清除。前面已經(jīng)討論過(guò),清除log可以開(kāi)放數據庫選項trunc log on chkpt,使數據庫系統每隔一段時(shí)間間隔自動(dòng)清除log,還可以執行命令dump transaction 來(lái)清除log.trunc log on chkpt 選項同dump transaction with truncate_only 命令一樣,只是清除log而不保留log到備份設備上。所以如果只想清除log而不做備份,可以使用trunc log on chkpt 選項及dump transaction with truncate_only,dump transaction with no_log 命令。若想備份,應做dump transaction database_name to dumpdevice。
七、管理大的transactions
有些操作是大批量地修改數據,log增長(cháng)速度十分快,如:
大量數據修改
刪除一個(gè)表的所有記錄
基于子查詢(xún)的數據插入
批量數據拷貝
下面講述怎樣使用這
您正在看的sybase教程是:日志問(wèn)題普及篇。些transaction 使log 不至溢滿(mǎn):
大量數據修改
例 :
1>update large_tab set col_1=0
2>go
若這個(gè)表很大,則此update動(dòng)作在未完成之前就可能使log滿(mǎn),引起1105錯誤(log full)而且執行這種大的transaction所產(chǎn)生的exclusive table loc,阻止其他用戶(hù)在update期間修改這個(gè)表,這可能引起死鎖。為避免這些情況,我們可以把這個(gè)大的transaction分成幾個(gè)小的transactions,并執行dump transaction 動(dòng)作。
上述例子可以分成兩個(gè)或多個(gè)小transactions.
例如:
1>update large_tab set col1=0
2>where col2 3>go
1>dump transaction database_name with truncate_only
2>go
1>update large_tab set col1=0
2>where col2>=x
3>go
1>dump transaction database_name with truncate_only
2>go
若這個(gè)transaction 需要備份到介質(zhì)上,則不用with truncate_only 選項。若執 行dump transaction with truncate_only,應該先做dump database 命令。
刪除一個(gè)表的所有記錄:
例:
1>delete table large_tab
2>go
同樣,把整個(gè)table的記錄都刪除,要記很多log,我們可以用truncate table命令代替上述語(yǔ)句完成相同功能。
1>truncate table large_tab
2>go
這樣,表中記錄都刪除了,而使用truncate table 命令,log只記錄空間回收情況,而不是記錄刪除表中每一行的操作。
基于子查詢(xún)的數據插入
例:
1>insert new_tab select col1,col2 from large_tab
2>go
同樣的方法,對這個(gè)大的transaction,我們應該處理為幾個(gè)小的transactions。
1>Insert new_tab
2>select col1,col2 from large_tab where col1<=y
3>go
1>dump transaction database_name with truncate_only
2>go
1>insert new_tab
2>select col1,col2 from large_tab where col1>y
3>go
1>dump database database_name with truncate_only
2>go
同樣,若想保存log到介質(zhì)上,則dump transaction 后不加with truncate_only 選項。若執行dump transaction with truncate_only,應該先做dump database 動(dòng)作。
批量數據拷貝
在使用bcp把數據拷入數據庫時(shí),我們可以把這個(gè)大的transaction變成幾個(gè)小的transactions處理,避免log劇增。
開(kāi)放trunc log on chkpt 選項
1>use master
2>go
1>sp_dboption database_name,trunc,true
2>go
1>use database_name
2>go
1>checkpoint
2>go
bcp... -b 100 (on unix)
bcp... /batch_size=100(on vms)
關(guān)閉trunc log on chkpt選項,并dump database。
在這個(gè)例子中,一個(gè)批執行100行拷貝。也可以將bcp輸入文件分成兩或多個(gè)分開(kāi)的文件,在每個(gè)文件執行后做dump transaction 來(lái)避免log 滿(mǎn)。
若bcp使用快速方式(無(wú)索引,無(wú)triggers),這樣操作不記log,換句話(huà)說(shuō),log 只記載空間分配情況。在這種情況下,要先做dump database(為恢復數據庫用)。若log太小,可置trunc log on chkpt 選項,這樣在每次checkpoint后清除log。
八、Threshold 和transaction log 管理
SQL Server提供閾值管理功能,它能幫助用戶(hù)自動(dòng)監視數據庫log設備段的自由空間。
在使用Sybase數據庫管理系統(SQL Server)開(kāi)發(fā)企業(yè)應用系統時(shí),或者開(kāi)發(fā)好的數據庫應用系統投入實(shí)際運行后,由于用戶(hù)不斷地增加或者修改數據庫中的數據,用戶(hù)數據庫的自由存儲空間會(huì )日益減少。特別是數據庫日志,增長(cháng)速度很快。一旦自由空間用盡,SQL Server在缺省情況下掛起所有數據操縱事務(wù),客戶(hù)端應用程序停止執行。這樣有可能會(huì )影響企業(yè)日常業(yè)務(wù)處理流程。Sybase SQL Server System10提供自動(dòng)監視數據庫自由存貯空間的機制——閾值管理,當數據庫使用剩余空間低于一定值時(shí),通過(guò)執行一個(gè)自定義的存儲過(guò)程,來(lái)控制自由空間。在空間用完之前,采取相應措施,這樣有利于業(yè)務(wù)處理順利進(jìn)行。如果能充分利用SQL Server的閾值管理功能,用戶(hù)能使一些數據庫管理工作自動(dòng)化,規程化。所以,在此我們將SQL Server這一重要功能介紹給讀者。
SQL Server的閾值管理允許用戶(hù)為數據庫的某個(gè)段上的自由空間設置閾值和定義相應的存儲過(guò)程。