2009-10-01 98 views
4

我正在使用Firebird數據庫通過網絡共享我的第一個WinForms應用程序。現在我想知道我應該如何確保數據庫備份和恢復?到目前爲止,我的應用程序使用嵌入式數據庫(SQLite),所以我確信只有我的應用程序訪問數據庫。應用程序本身負責備份和恢復。我可以簡單地複製數據庫文件,就是這樣。如何備份Firebird數據庫?

備份製成:

  1. 自動在每一個應用程序啓動
  2. 每週自動
  3. 由使用者手動

當用戶想從備份中恢復,他可以做這個任何時候,他可以選擇任何類型的備份。所有直接從我的應用程序。

對於新的應用程序,我已經從SQLite轉移到了Firebird。我選擇了Firebird,因爲默認情況下應用程序將使用嵌入式數據庫運行,但也可以與經典服務器一起使用。藉助Firebird,我可以將嵌入式和服務器都用於相同的數據庫文件。

問題是,當數據庫將在服務器上運行時,可能會有許多用戶同時使用數據庫,因此我不知道如何進行備份和恢復。我是否應該省略應用程序中的備份/還原功能,並讓管理員在服務器上進行備份?或者我的應用程序應該包含備份和還原?

共享數據庫對我而言是全新的,所以我不知道最佳實踐。無論如何,數據庫會很小,只有幾個用戶同時工作。

感謝,切赫

回答

0

如果您使用的是共享的數據庫,那麼你或許應該採取的備份/恢復過程中您的應用程序,否則一個用戶可能會破壞或消除其他用戶的工作。

4

不要複製數據庫文件,它會損壞數據庫。
Firebird是一個關係數據庫服務器。 gbak是運行熱備份的官方應用程序。
檢查了這一點:http://firebirdfaq.org/cat5/

+0

如果您首先快照塊設備或文件系統,則複製數據庫文件沒有問題(例如,使用Lars建議的任何Microsoft事件) – MarkR 2009-10-08 06:42:31

2

在共享服務器,你有進行備份幾個選項:

  • 使用文件備份工具,可支持微軟的卷影複製。這將拍攝數據庫的快照。 Firebird被設計爲「存活」這樣的備份。但是,恢復這種備份就像停電一樣,但另一方面,如果您需要指示IT部門如何執行並進行監視,這是一個嚴肅的選擇。

  • 使用gbak.exe將正在使用的數據庫複製到備份文件中。然後,做一個備份。這是推薦的方法,但爲了使其正常工作,您需要檢查gbak.exe的退出代碼以檢查是否沒有錯誤發生。並非所有的IT部門都能夠做到這一點。

但是,在共享服務器上,您必須始終是偏執狂:大型組織中的大多數備份無法恢復,通常問題是人類犯錯誤。因此,我可以推薦第三個選項,它基本上是前兩項的組合:

  • 使用gbak.exe將數據庫複製到備份文件中。如果可能的話,監視gbak的退出代碼。
  • 使用Microsoft卷影複製啓用的備份程序來備份主數據庫和備份文件。

這應該給你一個很好的備份文件來恢復,如果gbak應該失敗,沒有人注意到,你可以回退到正在運行的數據庫文件的原始快照。幾個人必須犯幾個錯誤才能失敗。

+0

這是錯誤的建議。 Firebird數據庫不能被複製爲一個文件即時拷貝 - 在拷貝數據庫文件之前,它應該被nbackup鎖定,否則將有很高的毀壞機會。結果備份將被破壞,並且有很高的機會,有時甚至主數據庫也會被損壞(這取決於Firebird和Forced Writes參數的緩存設置)。我想知道這個建議產生了多少損壞的Firebird數據庫:) – 2015-06-11 19:39:03

0

您可以在C#中使用nbackup來如下:

const String Usuario = "SYSDBA"; 
    const String Contrasena = "masterkey"; 
    String argumentos = String.Format(@"/C nbackup -U {0} -P {1} -B {2} BD.FDB" 
     , Usuario, Contrasena, (Int32) nivelRespaldo); 
    Process process = new Process(); 
    process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    process.StartInfo.FileName = "cmd.exe"; 
    process.StartInfo.Arguments = argumentos; 
    process.Start(); 
    process.Close(); 

如果你想阻止數據庫,同時使備份

 String argumentos = String.Format(@"/C nbackup -U {0} -P {1} -L {2}" 
     , NombreArchivoRespaldo.Usuario, NombreArchivoRespaldo.Contrasena, Glo.NombreBaseDatos); 

不要忘記解鎖

 String argumentos = String.Format(@"/C nbackup -U {0} -P {1} -N {2}" 
     , NombreArchivoRespaldo.Usuario, NombreArchivoRespaldo.Contrasena, Glo.NombreBaseDatos); 

如果要關閉所有連接,請嘗試:

FbConnection.ClearAllPools();