国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關(guān)注微信公眾號(hào)

詳解Sybase數(shù)據(jù)庫(kù)ASE事務(wù)日志的管理技巧
2008-07-16   賽迪網(wǎng)

SYBASE ASE事務(wù)日志

SYBASE ASE的每一個(gè)數(shù)據(jù)庫(kù),無(wú)論是系統(tǒng)數(shù)據(jù)庫(kù)(master,model, sybsystemprocs, tempdb),還是用戶數(shù)據(jù)庫(kù),都有自己的transaction log,每個(gè)庫(kù)都有syslogs表。Log記錄用戶對(duì)數(shù)據(jù)庫(kù)修改的操作,所以如果不用命令清除, log會(huì)一直增長(zhǎng)直至占滿空間。清除log可用dump transaction 命令;或者開放數(shù)據(jù)庫(kù)選項(xiàng)trunc log on chkpt,數(shù)據(jù)庫(kù)會(huì)每隔一段間隔自動(dòng)清除log。管理好數(shù)據(jù)庫(kù)log是用戶操作數(shù)據(jù)庫(kù)必須考慮的一面。

下面就幾個(gè)方面談?wù)刲og及其管理: 

一、ASE如何記錄及讀取日志信息

我們知道,ASE是先記log的機(jī)制。Server Cache Memory中日志頁(yè)總是先寫于數(shù)據(jù)頁(yè):

圖1

◆Log pages 在commit ,checkpoint,space needed 時(shí)寫入硬盤。

◆Data pages 在checkpoint,space needed 時(shí)寫入硬盤。

系統(tǒng)在recovery 時(shí)讀每個(gè)database 的syslogs 表的信息,回退未完成的事務(wù)(transaction)(數(shù)據(jù)改變到事務(wù)前狀態(tài));完成已提交的事務(wù)(transaction)(數(shù)據(jù)改變?yōu)槭聞?wù)提交后的狀態(tài))。在Log中記下checkpoint點(diǎn)。這樣保證整個(gè)數(shù)據(jù)庫(kù)系統(tǒng)的一致性和完整性。

二、Transaction logs 和checkpoint 進(jìn)程 

checkpoint 命令的功能是強(qiáng)制所有“臟”頁(yè)(自上次寫入數(shù)據(jù)庫(kù)設(shè)備后被更新過(guò)的頁(yè))寫入數(shù)據(jù)庫(kù)設(shè)備。自動(dòng)的checkpoint 間隔是由ASE 根據(jù)系統(tǒng)活動(dòng)和系統(tǒng)表sysconfigures中的恢復(fù)間隔(recovery interval)值計(jì)算出的。通過(guò)指定系統(tǒng)恢復(fù)所需的時(shí)間總量,恢復(fù)間隔決定了checkpoint 的頻率。

如果數(shù)據(jù)庫(kù)開放trunc log on chkpt選項(xiàng),則ASE在數(shù)據(jù)庫(kù)系統(tǒng)執(zhí)行checkpoint時(shí)自動(dòng)清除log。但用戶自己寫入執(zhí)行的checkpoint命令并不清除log,即使trunc log on chkpt選項(xiàng)開放。只有在trunc log on chkpt選項(xiàng)開放時(shí),ASE自動(dòng)執(zhí)行checkpoint動(dòng)作,才能自動(dòng)清除log 。這個(gè)自動(dòng)的checkpoint動(dòng)作在ASE中的進(jìn)程叫做checkpoint進(jìn)程。當(dāng)trunc log on chkpt選項(xiàng)開放時(shí),checkpoint進(jìn)程每隔60秒左右清除log,而不考慮recovery interval設(shè)置時(shí)間的間隔。

三、Transaction log 的大小

沒有一個(gè)十分嚴(yán)格的和確切的方法來(lái)確定一個(gè)數(shù)據(jù)庫(kù)的log應(yīng)該給多大空間。對(duì)一個(gè)新建的數(shù)據(jù)庫(kù)來(lái)說(shuō),log大小為整個(gè)數(shù)據(jù)庫(kù)大小的20%左右。因?yàn)閘og記錄對(duì)數(shù)據(jù)庫(kù)的修改,如果修改的動(dòng)作頻繁,則log的增長(zhǎng)十分迅速。所以說(shuō)log空間大小依賴于用戶是如何使用數(shù)據(jù)庫(kù)的。 例如:

◆update,insert和delete 的頻率
◆每個(gè)transaction 中數(shù)據(jù)的修改量
◆ASE系統(tǒng)參數(shù)recovery interval 值
◆log是否存到介質(zhì)上用于數(shù)據(jù)庫(kù)恢復(fù)

還有其它因素影響log大小,我們應(yīng)該根據(jù)操作估計(jì)log大小,并間隔一個(gè)周期就對(duì)log進(jìn)行備份和清除。

四、檢測(cè)log 的大小 

若log 在自己的設(shè)備上,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% 

根據(jù)log剩余空間比例來(lái)決定是否使用dump transaction 命令來(lái)備份和清除log。

用快速方法來(lái)判斷transaction log 滿的程度。

◆1>use database_name 
◆2>go
◆1>select data_pgs (8,doampg)
◆2>from sysindexes where id=8
◆3>go

Note:this query may be off by as many as 16 pages.
在syslogs 表用sp_spaceused 命令。

五、log設(shè)備 

一般來(lái)說(shuō),應(yīng)該將一個(gè)數(shù)據(jù)庫(kù)的data和log存放在不同的數(shù)據(jù)庫(kù)設(shè)備上。這樣做的好處:

◆可以單獨(dú)地備份(back up)transaction log 
◆防止數(shù)據(jù)庫(kù)溢滿
◆可以看到log空間的使用情況。[dbcc checktable (syslogs)] 
◆可以鏡像log設(shè)備 

六、log的清除 

數(shù)據(jù)庫(kù)的log是不斷增長(zhǎng)的,必須在它占滿空間之前清除。前面已經(jīng)討論過(guò),清除log可以開放數(shù)據(jù)庫(kù)選項(xiàng)trunc log on chkpt,使數(shù)據(jù)庫(kù)系統(tǒng)每隔一段時(shí)間間隔自動(dòng)清除log,還可以執(zhí)行命令dump transaction 來(lái)清除log.trunc log on chkpt 選項(xiàng)同dump transaction with truncate_only 命令一樣,只是清除log而不保留log到備份設(shè)備上。所以如果只想清除log而不做備份,可以使用trunc log on chkpt 選項(xiàng)及dump transaction with truncate_only,dump transaction with no_log 命令。若想備份,應(yīng)做dump transaction database_name to dumpdevice。

七、管理大的transactions 

有些操作是大批量地修改數(shù)據(jù),log增長(zhǎng)速度十分快,如:

◆大量數(shù)據(jù)修改

◆刪除一個(gè)表的所有記錄

◆基于子查詢的數(shù)據(jù)插入

◆批量數(shù)據(jù)拷貝 

下面講述怎樣使用這些transaction 使log 不至溢滿:

大量數(shù)據(jù)修改,例如 :

1>update large_tab set col_1=0 
2>go

這個(gè)表很大,則此update動(dòng)作在未完成之前就可能使log滿,引起1105錯(cuò)誤(log full)而且執(zhí)行這種大的transaction所產(chǎn)生的exclusive table lock,阻止其他用戶在update期間修改這個(gè)表,這可能引起死鎖。為避免這些情況,我們可以把這個(gè)大的transaction分成幾個(gè)小的transactions,并執(zhí)行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 選項(xiàng)。若執(zhí) 行dump transaction with truncate_only,應(yīng)該先做dump database 命令。

刪除一個(gè)表的所有記錄,例如:

1>delete table large_tab 
2>go

同樣,把整個(gè)table的記錄都刪除,要記很多l(xiāng)og,我們可以用truncate table命令代替上述語(yǔ)句完成相同功能。

1>truncate table large_tab 
2>go

這樣,表中記錄都刪除了,而使用truncate table 命令,log只記錄空間回收情況,而不是記錄刪除表中每一行的操作。#p#副標(biāo)題#e#

基于子查詢的數(shù)據(jù)插入

例:

 1>insert new_tab select col1,col2 from large_tab 
 2>go
 
同樣的方法,對(duì)這個(gè)大的transaction,我們應(yīng)該處理為幾個(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 選項(xiàng)。若執(zhí)行dump transaction with truncate_only,應(yīng)該先做dump database 動(dòng)作。

批量數(shù)據(jù)拷貝

在使用bcp把數(shù)據(jù)拷入數(shù)據(jù)庫(kù)時(shí),我們可以把這個(gè)大的transaction變成幾個(gè)小的transactions處理,避免log劇增。 

開放trunc log on chkpt選項(xiàng)

 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選項(xiàng),并dump database。

在這個(gè)例子中,一個(gè)批執(zhí)行100行拷貝。也可以將bcp輸入文件分成兩或多個(gè)分開的文件,在每個(gè)文件執(zhí)行后做dump transaction 來(lái)避免log 滿。

若bcp使用快速方式(無(wú)索引,無(wú)triggers),這樣操作不記log,換句話說(shuō),log 只記載空間分配情況。在這種情況下,要先做dump database(為恢復(fù)數(shù)據(jù)庫(kù)用)。若log太小,可置trunc log on chkpt 選項(xiàng),這樣在每次checkpoint后清除log。

八、Threshold 和transaction log 管理 

ASE提供閾值管理功能,它能幫助用戶自動(dòng)監(jiān)視數(shù)據(jù)庫(kù)log設(shè)備段的自由空間。log的管理是靈活而復(fù)雜的,我們應(yīng)該在實(shí)踐中摸索經(jīng)驗(yàn),針對(duì)每個(gè)數(shù)據(jù)庫(kù)的不同情況,不同操作,做不同處理。

1.如何截?cái)鄶?shù)據(jù)庫(kù)的事務(wù)日志?

事務(wù)日志填滿數(shù)據(jù)庫(kù)中的日志空間后,可能不能使用轉(zhuǎn)儲(chǔ)事務(wù)日志的辦法備份并且清除原來(lái)存在的日志,因?yàn)檗D(zhuǎn)儲(chǔ)日志這個(gè)動(dòng)作本身也需要記錄日志。

這時(shí)候,可以首先使用dump transaction database_name with truncate_only命令,該命令只是截?cái)?清除事務(wù)日志,并不生成實(shí)際的備份。

如果不能奏效,可以使用dump transaction database_name with no_log命令。該命令也是僅僅清除既有的事務(wù)日志,不生成實(shí)際的備份文件,且該命令本身不記日志。

如果該命令還不能奏效,應(yīng)當(dāng)使用alter database命令為此數(shù)據(jù)庫(kù)的日志分配額外的空間,隨后執(zhí)行dump transaction。

2.使用dump transaction with no_log的危險(xiǎn)性

在命令參考手冊(cè)中的dump transaction with no_log條目下,有一條警告信息告訴你,你應(yīng)該把這條命令作為沒有其它辦法時(shí)的最后一招才使用它。但是“最后一招”究竟是什么意思呢?當(dāng)你使用這條命令時(shí)會(huì)怎樣呢?那你應(yīng)使用哪條命令來(lái)代替它呢?最后,若這條命令如此有問(wèn)題,為什么Sybase卻要提供它呢? 

Sybase技術(shù)支持建議你定期的dump你的transaction log。你必須根據(jù)你的數(shù)據(jù)庫(kù)中記入日志的活動(dòng)量的大小以及你的數(shù)據(jù)庫(kù)的大小來(lái)決定dump的方式。有些地方按月dump transaction;有些地方每夜dump transaction。 

若你從未做過(guò)dump transaction,transaction log將最終會(huì)滿。 SQLServer使用log(日志)是出于恢復(fù)目的的。 當(dāng)log滿時(shí),服務(wù)器將停止事物的繼續(xù)進(jìn)行,因?yàn)榉?wù)器將不能將這些事物寫進(jìn)日志,而服務(wù)器不能運(yùn)行大多數(shù)的dump tran命令,因?yàn)锳SE也需在日志中記錄這些命令。 

這就是為什么當(dāng)其它dump tran命令不能執(zhí)行時(shí)no_log可執(zhí)行的原因。但是想一下dump transaction with no_log被設(shè)計(jì)執(zhí)行的環(huán)境,將不做并發(fā)性檢查。 

若你在對(duì)數(shù)據(jù)庫(kù)的修改發(fā)生時(shí)使用dump transaction with no_log,你就會(huì)冒整個(gè)數(shù)據(jù)庫(kù)崩潰的風(fēng)險(xiǎn)。在多數(shù)情況下,它們被反映成813或605錯(cuò)誤。為了在數(shù)據(jù)庫(kù)被修改時(shí),刪除transaction log中的不活躍部分可使用dump transaction with truncate_only。這條命令寫進(jìn)transaction log時(shí),并且它還做必要的并發(fā)性檢查。這兩條命令都有與其相關(guān)的警告,在命令參考手冊(cè)中會(huì)看到這些警告。請(qǐng)確保在使用其中任一條命令以前,你已理解這些警告和指示。 Sybase提供dump transaction with no_log來(lái)處理某些非常緊迫的情況。為了盡量確保你的數(shù)據(jù)庫(kù)的一致性,你應(yīng)將其作為“最后一招”。

3.為什么數(shù)據(jù)庫(kù)事務(wù)日志滿了,使用dump tran with no_log仍不能截?cái)嗳罩荆?/strong>

有兩種情況,可能出現(xiàn)這個(gè)問(wèn)題。一是應(yīng)用系統(tǒng)給ASE發(fā)送了一個(gè)用戶自定義事務(wù),一直未提交,這個(gè)最早活躍事務(wù)阻礙系統(tǒng)截?cái)嗳罩?。二是客戶端向ASE發(fā)送了一個(gè)修改數(shù)量大的事務(wù),清日志時(shí),該事務(wù)還正在執(zhí)行之中,此事務(wù)所涉及的日志只能等到事務(wù)結(jié)束后,才能被截掉。

對(duì)于第一種情況,只要督促用戶退出應(yīng)用或者提交事務(wù),系統(tǒng)管理員便可清掉日志。因?yàn)榻oASE發(fā)送Dump transaction with no-log或者with truncate-only,它截掉事務(wù)日志的非活躍部分。所謂非活躍部分是指服務(wù)器檢查點(diǎn)之間的所有已提交或回退的事務(wù)。而從最早的未提交的事務(wù)到最近的日志記錄之間的事務(wù)日志記錄被稱為活躍的。從此可以看明,打開的事務(wù)能致使日志上漲,因?yàn)樵谧钤缁钴S事務(wù)之后的日志不能被截除。

對(duì)于第二種情況,道理也同上。只是在處理它時(shí),需慎重從事。如果這個(gè)大事務(wù)已運(yùn)行較長(zhǎng)時(shí)間,應(yīng)盡量想法擴(kuò)大數(shù)據(jù)庫(kù)日志空間,保證該事務(wù)正常結(jié)束。若該事務(wù)被強(qiáng)行回滾,ASE需要做大量的處理工作,往往是正向執(zhí)行時(shí)間的幾倍,系統(tǒng)恢復(fù)時(shí)間長(zhǎng),可能會(huì)影響正常使用的時(shí)間。

熱詞搜索:

上一篇:網(wǎng)管必修課 中小企業(yè)安全路由器配置
下一篇:分離數(shù)據(jù)庫(kù)的日志和數(shù)據(jù)的步驟

分享到: 收藏
主站蜘蛛池模板: 连江县| 行唐县| 甘肃省| 三门峡市| 巧家县| 乃东县| 肇庆市| 淄博市| 佛冈县| 静乐县| 全南县| 彩票| 栖霞市| 西峡县| 健康| 炎陵县| 东台市| 朝阳区| 若羌县| 出国| 定远县| 祥云县| 蚌埠市| 额敏县| 新兴县| 平远县| 陆川县| 乌兰察布市| 古田县| 新竹县| 西畴县| 昌邑市| 镇康县| 宁都县| 嫩江县| 冕宁县| 嵩明县| 漳州市| 汝南县| 凉山| 梁山县|