細化解析:Informix資料庫的系統維護技巧

來源:互聯網
上載者:User

Informix是一種大型的資料庫管理系統,具備先進的技術、效能和可靠性,在全球範圍的各種應用中使用十分廣泛,包括政府、金融保險、郵政電信、製造及零售等重要行業或領域。本文根據筆者在SCO Unix/Xenix上使用 Informix-4GL 和Informix-SQL的經驗,簡要介紹Informix系統維護中的幾個較為特別的問題及其處理方法。

表文檔的修複

Informix的資料庫是指由若干張表所構成的集合,其中每一張表對應著兩個文檔,即資料文檔(尾碼為.dat)和索引文檔(尾碼為.idx)。當系統出現異常、死機、掉電或非正常關閉時,有時會使一些使用中的表文檔未能正常關閉而出現毀損,當系統再次對這些表進行相關操作時,就會報告“不能檢索下一條記錄”、“不能刪除記錄”等錯誤資訊。

通常,資料文檔是很少發生問題的。要判別資料文檔是否正常,只需執行select * from 〈table—name〉語句或類似的語句即可, 但不能使用where、order by等子句,以免利用到索引文檔, 目的就是純粹從資料文檔中依次讀取資料。

假如資料讀取順利且記錄個數正確,表明該文檔完好無損;反之,則有問題,通常只能用其資料備份來恢複。

假如資料文檔正確無誤,那麼就該檢查相應的索引文檔。Informix提供有一個實用程式bcheck,專門用來檢查和修複

索引文檔,即依次比較資料文檔和索引文檔,倘若不一致,就詢問是否刪除和重建有問題的索引。bcheck有許多選項可供選用,其中-n和-y用於對任何的提問都回答“no”或“yes”,讓系統自動進行一系列的操作。其文法如下:

bcheck [選項] 〈表文檔名〉

要檢查表的索引文檔,應先運行bcheck -n命令。假如一切正常, 說明索引沒有問題。一旦發現有錯誤報表(如有多少個錯誤資料記錄指標、丟失了多少個資料記錄指標或索引結點指標等),則再執行bcheck -y 命令即可將其修複。

Informix-SQL中的語句check table 〈表名〉和repair table 〈表名〉在運行時分別以選項-n和-y調用bcheck命令,

功能相同,不同的只是使用表名而不是表文檔名。

假如索引文檔沒有相應的讀寫權限, 或沒有正確指明其路徑, 在bcheck時會出現“無法開啟索引文檔”的資訊。假如索引文檔被刪除或格式被破壞了,也有同樣的資訊。此時可從資料備份中將對應的索引文檔拷貝回來,也可暫時建立一個欄位和索引均和原表完全一致的新表並將其索引文檔拷貝給原表,再運行bcheck -y命令修複。

資料表空間的回收

Informix對資料表的管理方式較為特別,當資料量增加時,表所佔用的磁碟空間隨之增加;但資料記錄被刪除時,原先所佔用的空間暫不釋放,依然由該表所控制,作為日後增加記錄時使用。為提高系統的效能及有關各表的查詢速度,應及時回收這種“空閑”的磁碟空間。

使用bcheck -s命令可回收索引文檔的空間,其中-s 選項的作用是重新估算索引文檔的大小。要同時回收資料文檔和索引文檔的空間,可讓DBMS(資料庫管理系統)去做表結構的修改工作,但修改前後的表結構及有關許可權要確保相同。可利用Informix-SQL達此目的,最為保險的做法是先給相應的表增加一個欄位,再將該欄位刪除。也可利用alter table 命令“欺騙”DBMS去修改表的結構,如alter table aa modify(bb smallint),其中aa表的欄位bb的類型本來就是smallint。

表的遷移

任何一個Informix資料庫都有九個系統資料表,用於記錄資料庫的有關資訊,其中系統資料表systables(用於描述資料庫中的各表) 中的欄位dirpath指明各表文檔的絕對路徑或相對路徑。

Informix資料庫的搜尋路徑一般由環境變數DBPATH來設定,系統根據DBPATH的正確設定即可找到相應的資料庫及其各表。

遷移Informix資料庫表時(比如從Unix/Xenix的根文檔系統遷移到分離的文檔系統/u),只要重新設定DBPATH,通常系統即可正常運行。假如報告某些表很難找到了(實際上這些表文檔還在,且有關許可權也對),問題就在於systables 表中的dirpath 欄位值採用了絕對路徑, 此時要用update命令修正其值,最好改用相對路徑,即直接改為表文檔名。

系統查詢的最佳化

Informix在執行查詢(特別是多表查詢)指令前,會利用其所提供的最佳化器(cost-based optimizer,基於成本的最佳化器),依據當時系統所記載的有關各表的相關資訊,按照一定的判斷法則進行分析並選擇出一條最有效率的途徑來執行。系統必須掌控各表的正確資料,才不至於做出錯誤的選擇。但出於系統效率上的考慮,不可能隨時修改記錄各表最新狀況的相關文檔,否則會增加許多額外的輸入/輸出負擔。因此, 應定期執行這種資訊的更新操作。

在Informix資料庫的系統資料表systables中有一欄位nrows,專門用來記錄各表的記錄個數。最佳化器在運行法則判斷時,

各表的nrows 值具備很高的參考價值。nrows的更新可通過如下命令來完成,即:

update statistics [for table 〈table—name〉]

其中,方括弧[]中的子句是可選的,用於指定表名,以對該表進行更新;否則,將對資料庫中的各表進行全部更新。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.