FirebirdSQL/問答篇/資料庫損毀時危機處理
出自VFP Wiki
Q:Interbase 資料庫發生錯誤 'database file appears corrupt (wrong type page) -
page xxxx is of wrong type',應如何解決?
A:資料庫用久了難免發生損壞,你可以使用 Interbase 的命令列工具 gfix 來修復,
或者建立一個新的資料庫,並且把有問題的資料庫中的所有資料複製到新的資料庫。 你可以採取其中一種方式:
1.修復資料庫
1) 再執行修復動作前寄得先把要修復的資料庫做一份備份,免得愈修愈慘卻無法挽回。 2) 執行 gfix -v -f database.gdb 3) 如果上一個步驟報告資料庫有損壞,則執行: gfix -m -i database.gdb 4) 重複步驟 2 看看損壞是否修復好了。
2.挽救資料
1) 建立一個新的資料庫,此資料庫的 metadata 要和損壞的資料庫相同:
A) 執行 gbak -m 以備份 metadata。可以將它回存以建立一個新的資料庫。 B) 執行 isql -x -a 以讀取 metadata 並儲存成為一個 script 檔案。 執行 isql -i scriptfile 將會建立一個新的資料庫。
2) 複製資料至新的資料庫:
A) 可以利用 Delphi 的 datapump 工具把所有的資料表複製到新的資料庫中。 B) 也可以使用 isql 來執行資料表對資料表的複製。
以上資料來源為 Interbase Corporation.
> 什麼是 Dialect?
Dialect 譯成中文是〔方言〕的意思,在 InterBase 6 指的是資料庫能 夠了解的 SQL 語法(方言的等級)。 當你的資料庫從 IB5 升級到 IB6 時,資料庫會是 dialect 1。你可以把 它改成 dialect 3。 Dialect 3 增加或重新定義了一些新的關鍵字。例如在 dialect 1,一個 整數 (integer) 是 32 位元,在 dialect 3 則是 64 位元;Dialect 1 的 Date 欄位型態同時包含了日期及時間,而在 dialect 3, Date 就只 是日期,而 Time 則是時間,Timestamp 則包含日期及時間。 另外,dialect 3 的 SQL 命令只能用單引號來代表字串,雙引號則用於 資料表或欄位名稱上面。例如:
select * from "employee" where empno='A001'
如果你在建立資料表及欄位時全部以英文大寫字母命名,你就可以少寫一 些雙引號,像這樣:
select * from employee where empno='A001'
相反的,如果你命名時用小寫或大小寫混用或包含空白字元,你就必須加 上雙引號。 另外,如果物件名稱和 InterBase 的識別字相同,則不管大小寫都要加 雙引號。
另外還有一種 Dialect 2,可以用來幫你從 IB5 升級到 IB6 資料庫時,
檢測 metadata,以找出由 dialect 1 升級到 dialect 3 的問題。
<<<<修復資料庫 1。先複製備份資料庫, 將interbase\bin目錄下的gbak & gfix 複製到資料庫同一目錄,在命令行作如下操作: 2。用gbak 被份資料庫 調用如下: GBAK -USER "sysdba" -PAS "masterkey" -e -nt -V -ig -l -g TEST.GDB TEST.GBK ; 如果不行 3。用gfix 重複修復 gfix -m -f -user "sysdba" -pas "masterkey" test.gdb 4.恢復 GBAK -USER "sysdba" -PAS "masterkey" -R -P 4096 -V test.GBK test.GDB 注意 -p 參數 4096 要根據樹據庫創建時的page size清況決定