二、定義 Rational ClearCase提供了一個(gè)開放的體系結(jié)構(gòu)用來進(jìn)行
軟件配置管理(Software Configuration Management,SCM)。ClearCase可以管理軟件項(xiàng)目開發(fā)的過程中產(chǎn)生的源程序及各種文檔的系統(tǒng)。從更廣的意義上來說,任何一種項(xiàng)目的智力資產(chǎn),只要可以被記錄為數(shù)字形式都可以用ClearCase進(jìn)行管理。
ClearCase不僅提供了對這些智力資產(chǎn)存取的功能,而且記錄了對這些資產(chǎn)每次修改的所有版本。ClearCase將中所有的版本存儲在Versioned Object Base (VOB) 中。VOB中還保留了一些其它與項(xiàng)目和配置有關(guān)的信息,所以VOB可以看作是整個(gè)ClearCase
SCM系統(tǒng)的中心數(shù)據(jù)庫。
編輯本段三、結(jié)構(gòu)
正如前面所說,可以把VOB看作一個(gè)
數(shù)據(jù)庫系統(tǒng)。一個(gè)數(shù)據(jù)庫系統(tǒng)的邏輯和物理的結(jié)構(gòu)是截然不同的,比如一個(gè)
關(guān)系型數(shù)據(jù)庫,邏輯上可以看到的是:表,字段,視圖,存儲過程,用戶,和權(quán)限等;物理上可能是一系列文件或磁盤分區(qū)。了解數(shù)據(jù)庫的
邏輯結(jié)構(gòu)可以幫助我們更好的使用它,而了解數(shù)據(jù)庫的
物理結(jié)構(gòu)是為了更好地對它進(jìn)行管理。先將簡單介紹一下ClearCase VOB的邏輯結(jié)構(gòu),然后著重描述它的邏輯結(jié)構(gòu)。
邏輯結(jié)構(gòu)
VOB中的數(shù)據(jù)主要有兩種:簡單數(shù)據(jù)(文件和目錄及其各個(gè)版本)、復(fù)雜數(shù)據(jù)(分支、標(biāo)簽、事件記錄、等等)。這些數(shù)據(jù)的結(jié)構(gòu)和
格式被VOB的Schema所決定。VOB的Schema是可以改變的。一個(gè)VOB增加了一定屬性可以具有特殊用途,比如:管理VOB, 統(tǒng)一變更管理(Unified change management,UCM)VOB,和項(xiàng)目VOB(PVOB)。另外VOB提供的功能還與它的特性層次(Feature level)有關(guān),某些功能的使用,要求改變VOB的特性層次。
邏輯結(jié)構(gòu)
有關(guān)一個(gè)VOB的物理文件都是存儲在一個(gè)目錄(VOB Storage directory)中的。了解這個(gè)目錄中的每個(gè)文件,有助于我們更好地管理VOB。我需要在這里著重指出一點(diǎn)就是:請勿用非ClearCase的工具對此目錄或里面的文件進(jìn)行任何操作,包括修改文件或目錄的內(nèi)容及其讀寫權(quán)限。這樣做很可能會導(dǎo)致VOB無法訪問。因?yàn)殡m然它們看起來像普通的文件和目錄,但是ClearCase賦予了它們很多附加屬性,而一般的工具很難識別并保存這些屬性。當(dāng)然如果您不幸犯了這樣的錯(cuò)誤導(dǎo)致VOB無法訪問,ClearCase提供的一系列工具仍然可以幫助您修復(fù)。
當(dāng)用
操作系統(tǒng)的列目錄命令(ls,dir等)查看VOB存儲目錄時(shí),您將會看到以下內(nèi)容:
.pid 單行文本文件,記錄了vob_server的進(jìn)程號。
admin 一個(gè)目錄,包含VOB使用的磁盤空間 。
vob_oid 單行文本文件,記錄VOB的對象
標(biāo)識號,用UUID的方式表示。可以在ClearCase多復(fù)本(MultiSite)環(huán)境中用來表示一個(gè)VOB家族。一個(gè)VOB家族通常包含一個(gè)原始VOB和若干個(gè)它的克隆VOB。
replica_uuid 單行文本文件,記錄了該VOB復(fù)本UUID,用于區(qū)分在一個(gè)VOB家族中的不同復(fù)本VOB。
.identity 一個(gè)目錄,在UNIX系統(tǒng)中,記錄了VOB的所有者和所有者組的信息,用于訪問權(quán)限控制。
identity.sd 一個(gè)
二進(jìn)制文件,在Windows系統(tǒng)中,記錄了VOB存儲目錄用戶的安全描述符。
groups.sd 一個(gè)
二進(jìn)制文件,在Windows系統(tǒng)中,記錄了VOB存儲目錄次要用戶組的安全描述符。
s 一個(gè)目錄,用來存儲文件或目錄的所有版本。
c 一個(gè)目錄,暫時(shí)存儲一個(gè)文件或目錄的某個(gè)版本,用來作為s的緩沖池。這個(gè)
緩沖區(qū)會經(jīng)常進(jìn)行刷新,在ClearCase中被叫做Scrub。在[CC Admin]中有專門的章節(jié)介紹Scrubbing操作。
d 一個(gè)目錄,用來存儲派生對象。當(dāng)您編譯VOB中的源文件時(shí)所產(chǎn)生的
目標(biāo)文件在ClearCase中可以作為一個(gè)派生對象(Derived Object, DO)。共享這些DO就可以使不同視圖使用相同的二進(jìn)制目標(biāo)文件,從而減少冗余,更加快了編譯的速度。ClearCase中把一個(gè)DO的第一次產(chǎn)生叫做wink in。這個(gè)目錄也會被系統(tǒng)定期Scrub。
db 一個(gè)目錄,包含VOB使用的一個(gè)內(nèi)嵌數(shù)據(jù)庫系統(tǒng)(Raima Database)。除了文件和目錄版本實(shí)際拷貝以外的其他數(shù)據(jù)都存儲在這個(gè)數(shù)據(jù)庫中。當(dāng)您進(jìn)行了reformatvob命令之后,這個(gè)目錄的舊版本將會以
重命名的方式保留下來,以防萬一。
vob_server.conf 一個(gè)文本文件,用于配置vob_server啟動時(shí)的一些信息。
.hostname 一個(gè)文本文件,記錄了VOB
服務(wù)器的名字。
.msadm_acls 記錄ClearCase多復(fù)本環(huán)境中管理服務(wù)器的
訪問控制列表。
在此還有必要介紹一下內(nèi)嵌數(shù)據(jù)庫(目錄d)的物理結(jié)構(gòu):
vob_db.dbd 一個(gè)編譯好的數(shù)據(jù)庫Schema,描述了數(shù)據(jù)庫的結(jié)構(gòu)。
vob_db_schema_version 一個(gè)Schema版本文件,數(shù)據(jù)庫用它來比對編譯好的數(shù)據(jù)庫Schema。
vob_db.d0n, vobdb.k0n 數(shù)據(jù)庫的內(nèi)容。
vista.* 數(shù)據(jù)庫的
控制文件和交易日志
db_dumper 一個(gè)系統(tǒng)可執(zhí)行db_dumper的
備份。reformatvob將會調(diào)用此備份,如果系統(tǒng)目錄下的版本不可用,以確保數(shù)據(jù)庫導(dǎo)出的成功。
vob_db.str_file 數(shù)據(jù)庫字符串文件,用來存儲長字符串。
VOB
從以上的結(jié)構(gòu)中可以看出,ClearCase是一個(gè)復(fù)雜而功能強(qiáng)大的系統(tǒng)。它包含了一個(gè)內(nèi)嵌的數(shù)據(jù)庫和若干個(gè)自制的存儲池。它們之間的相互協(xié)作不僅可以提供簡單的
版本管理,更可以實(shí)現(xiàn)分布式開發(fā),并行編譯等其他系統(tǒng)不具備的功能。因此對VOB的任何操作必須是十分小心和有計(jì)劃地進(jìn)行。但是在具體應(yīng)用中往往會發(fā)生一些人為和不可避免的錯(cuò)誤,下面就這些問題進(jìn)行一些探討。所有列舉的ClearCase的命令僅供參考。
編輯本段四、相關(guān)問題
當(dāng)用戶提取一個(gè)文件的某個(gè)版本時(shí),通常的操作是這樣的:
1. 用戶發(fā)送請求到VOB數(shù)據(jù)庫;
2. 數(shù)據(jù)庫找到相應(yīng)的
源代碼存儲池并查詢到相應(yīng)的版本號,將請求送給一個(gè)叫做Type Manager的程序;
3. Type Manager 發(fā)現(xiàn)Cleartext pool緩存中沒有這個(gè)版本的文件;
4. Type Manager 從源代碼存儲池中獲取相應(yīng)版本的文件并放入Cleartext pool中;
5. 用戶從Cleartext pool 中得到要求的
文件版本
因此經(jīng)常出現(xiàn)的與VOB相關(guān)的問題大致可以分為以下三類:
1.內(nèi)嵌數(shù)據(jù)庫和存儲池之間不同步問題
這類問題的產(chǎn)生主要是因?yàn)閂OB數(shù)據(jù)庫中有關(guān)存儲池的信息和實(shí)際的存儲池信息不一致造成的,比如:VOB數(shù)據(jù)庫中含有不存在的存儲池,VOB數(shù)據(jù)庫中對于存儲池的訪問控制信息不正確,或者有的存儲池在VOB數(shù)據(jù)庫中沒有記錄。造成這些不一致的原因可能是因?yàn)榫W(wǎng)絡(luò)問題,不成功的備份恢復(fù),或者是用戶錯(cuò)誤地操作了VOB存儲目錄下面的文件或目錄。解決這些問題的方法就是將VOB數(shù)據(jù)庫和存儲池的信息實(shí)施同步。 (來自[SCM503])顯示了一個(gè)典型的此類錯(cuò)誤的view_log中有關(guān)的信息 。
可以看出系統(tǒng)無法找到cleartext pool或source pool相應(yīng)文件。我們可以用checkvob命令來檢測和修復(fù)此類問題:
checkvob -pool -source /vobstg/vob1.vbs 用來檢測vob1的源代碼存儲池問題。
checkvob -fix -pool -source /vobstg/vob1.vbs 用來修復(fù)vob1的源代碼存儲池問題。
下面是checkvob命令對各類問題的解決方法: 問題解決方法 :
找不到存儲池 掃描整個(gè)存儲池目錄,重建各條記錄 ,沒有記錄的存儲池將沒有引用的存儲池放入lost+found目錄 ,存儲池訪問控制錯(cuò)誤 在用戶權(quán)限允許的情況下重建訪問控制信息 。
2.有關(guān)VOB 內(nèi)嵌數(shù)據(jù)庫的問題
當(dāng)VOB內(nèi)嵌數(shù)據(jù)庫本身出現(xiàn)問題時(shí),您將會發(fā)現(xiàn)很多操作無法完成。db_server 和vobrpc_server是和數(shù)據(jù)庫通信的兩個(gè)進(jìn)程,查看它們的日志有助于問題的解決。dbcheck 和 reformatvob可以幫助您從大部分的問題中恢復(fù)。更深層次的內(nèi)嵌數(shù)據(jù)庫本身的問題已經(jīng)超出本文的范疇,請參考文檔[VOB DB]。
內(nèi)嵌數(shù)據(jù)庫另外一種常見問題是由于數(shù)據(jù)庫的某些文件超出上限造成的VOB不可訪問。VOB內(nèi)嵌數(shù)據(jù)庫所存儲的紀(jì)錄是有限的。這可能是因?yàn)?a target="_blank" >
磁盤沒有空間,
數(shù)據(jù)庫文件達(dá)到本身或操作系統(tǒng)的上限。在Schema 53中,數(shù)據(jù)庫可以存儲的記錄大概是224,數(shù)據(jù)庫文件的大小一般不能超過2GB。
當(dāng)內(nèi)嵌數(shù)據(jù)庫數(shù)據(jù)文件(vob_db.d0n,vobdb.k0n)過大時(shí),您可以在ClearCase database server log 中看到db_VISTA 錯(cuò)誤(錯(cuò)誤號為:-900、-909、-912、-914、-919、2)。您可以進(jìn)一步用命令countdb 查看數(shù)據(jù)庫的使用情況,如下。
有三種方法可以幫助您解決此類問題:
1. 您可以將VOB中的一些目錄移走來解決暫時(shí)的限制,也就是將大VOB分裂為幾個(gè)較小的VOB;
2. 手工刪除VERSION_LABEL_LINK, DOT_DOT/NAMESPACE_DIRECTORY_VERSION_ENTRY, 和 OPLOG_ENTRY 的記錄數(shù);
3. 最好的方法是采用或升級到Schema54或以上。升級VOB可以使用reformatvob命令,但是這個(gè)操作一般需要很長很長的時(shí)間。
除了數(shù)據(jù)文件過大以外,控制文件、日志文件、和字符串文件過大也會影響到VOB的訪問。控制文件和日志文件的大小可以在db.conf文件中配置。字符串文件過大可以通過sting_report.exe檢測到。根據(jù)sting_report.exe的
結(jié)果刪除不用的視圖和DO等可以縮小字符串文件的大小。
3.有關(guān)存儲池本身的問題
當(dāng)排除了以上兩種問題的可能性以后,VOB還有問題,那可能是因?yàn)榇鎯Τ乇旧硎艿搅藫p害,首先應(yīng)該檢查VOB存儲目錄下的文本文件中的信息是否正確。例如:如果VOB server的名字改變了應(yīng)該檢查.hostname。
如前文所述,ClearCase VOB存儲目錄下的文件不能用一般的工具進(jìn)行修改。如果您不小心在Windows
瀏覽器中修改了某個(gè)文件或目錄的屬性,可能會造成它們無法訪問。如果是VOB的根目錄,則整個(gè)VOB將無法訪問。在Schema53中可以用fix_prot來修理,在Schema54中可以用vob_sidwalk。
如果問題仍然存在,最后可以用ck_all_tfd_for_nulls.pl命令進(jìn)行檢查,一旦發(fā)現(xiàn)錯(cuò)誤可以將以前備份的存儲池恢復(fù)到受損目錄,然后再運(yùn)行checkvob命令,或者運(yùn)行一次標(biāo)準(zhǔn)的ClearCase恢復(fù)操作。
4.修復(fù)VOB常用工具和手段
checkvob 可以發(fā)現(xiàn)存儲池和內(nèi)嵌數(shù)據(jù)庫的不一致,用-fix選項(xiàng)可以對發(fā)現(xiàn)的錯(cuò)誤進(jìn)行修復(fù)。
ck_all_tfd_for_nulls.pl 在
文本存儲池中查找受損部位。它是一個(gè)系統(tǒng)工具,一般在utils目錄下。
countdb.exe 可以顯示內(nèi)嵌數(shù)據(jù)庫空間的使用情況,一般在utils目錄下。
string_report.exe 用于檢測內(nèi)嵌數(shù)據(jù)庫字符串文件的使用情況,一般在utils目錄下。
db log and vobrpc log files 當(dāng)懷疑內(nèi)嵌數(shù)據(jù)庫有問題時(shí)可以查看這些文件。
dbcheck.exe 可以檢查出80%有關(guān)內(nèi)嵌數(shù)據(jù)庫的問題。
reformatvob 將VOB內(nèi)嵌數(shù)據(jù)庫導(dǎo)出為文本文件,或?qū)?dǎo)出的文件重新導(dǎo)入一個(gè)新的數(shù)據(jù)庫,用于數(shù)據(jù)庫的升級和減小數(shù)據(jù)庫大小。
vob_sidwalk 改變VOB數(shù)據(jù)庫中元素的安全標(biāo)示,也就是用戶和用戶組標(biāo)示。
fix_prot產(chǎn)生或修復(fù).identity/ identity.sd文件。
lsacl 顯示一個(gè)VOB的安全標(biāo)示結(jié)合fix_prot可以修復(fù)對目錄和文件訪問控制問題。
rmtype 刪除VOB中的對象類型,可以用來縮小內(nèi)嵌數(shù)據(jù)庫的大小。
rmver 刪除元素的版本,可以用來縮小內(nèi)嵌數(shù)據(jù)庫的大小。
vob_scrubber_params file 調(diào)整scrubber運(yùn)行的頻率,以免VOB過大,但是如果
參數(shù)太小,會造成系統(tǒng)性能下降。
5.總結(jié)
當(dāng)VOB發(fā)生問題時(shí),應(yīng)該盡量先使用上面提到的工具對問題進(jìn)行定位,確定問題發(fā)生在VOB內(nèi)嵌數(shù)據(jù)庫,存儲池,還是兩者之間的同步。然后使用相應(yīng)的工具進(jìn)行修理。最后提醒一下,作為一個(gè)ClearCase
管理員,應(yīng)該經(jīng)常備份系統(tǒng)關(guān)鍵數(shù)據(jù)。