2009-11-20 16 views
1

所以我有一個網絡系統,每個用戶都可以得到一個單獨的SQLite數據庫,它可以作爲他們的工作空間。所有數據庫文件都位於一個數據庫名稱與用戶ID匹配的目錄中。使用Subversion對SQLite數據庫進行版本控制。好主意或壞主意?

許多這些數據庫是創建的,很少,如果有的話,編輯。其他人每天都有很多編輯。

要管理此目錄上的備份,您是否會建議使用Subversion設置cron進程?我正在考慮這種方法的一個原因是它可以讓用戶輕鬆地回滾他們編輯的工作區。

回答

0

SQLite數據庫文件是純文本文件還是二進制文件?如果它們是二進制文件,我認爲你從使用Subversion中獲益不多(因爲恕我直言,它不應該用作備份系統)。

相反,如果你要允許他們恢復舊版本使用普通的備份機制(rsync的等)並保存每日備份的一段時間(取決於你的實際需求)。如果他們想恢復以前的版本,他們可以接近你,你在回放

3

如果你可以運行自己的shell腳本,你可以每個數據庫轉儲到普通的SQL文件:

# sqlite3 user.db .dump .exit > user.sql

然後你可以存儲在Subversion版本庫

SQL文件創建數據庫從SQL文件恢復:

# sqlite3 -init user.sql user.db .exit

2

這些數據庫中的很多都創建了 ,並且很少編輯。

如果是這種情況,那麼你不會從Subversion中獲得很多好處。它是一個版本控制系統,而不是備份系統。您不會希望對對象進行版本控制操作(比如差異,合併等),所以我認爲您會從傳統的備份方法中獲得更好的效果。壓縮sqlite文件(儘可能多)並將它們存檔一段指定的時間。如果您正在Linux系統上運行此操作,則可以查看備份腳本,例如logrotate腳本,這些腳本可以爲系統日誌執行相同的操作。由於sqlite數據庫很好,並且乾淨地打包在一個文件中,因此恢復舊版本可以很容易地編寫腳本(只是解壓並複製到正確的位置)。

根據每個用戶有多少數據在他們的數據庫中存儲,一個額外的選擇是保持表的卷影副本在你的倉庫。當進行更改時,在修改之前複製舊錶格。這樣你可以保留以前的(甚至是過去幾年)數據庫中的修訂版本的副本,可以將其與一個簡單的數據庫操作,而不必去挖掘出舊的備份恢復。這也可以讓你恢復到數據庫的一部分的變化,而不會恢復整個事情。

1

你可以做的一件事是:
*開發時總是將數據庫導出到sql文件。
*轉換的sql文件,數據庫文件或者在一個MSBuild自定義任務或在任何方便的初始化步驟,當您的應用程序啓動。
*要導入SQL文件恢復到數據庫文件,可以使用類似於C#:

  string sql = System.IO.File.ReadAllText(SqlFile); 
      SQLiteConnection.CreateFile(DatabaseFile); 

      string ConnectionString = @"Data Source=" + DatabaseFile; 

      using (SQLiteConnection cn = new SQLiteConnection(ConnectionString)) 
      { 
       using (SQLiteCommand cmd = new SQLiteCommand(sql, cn)) 
       { 
        cn.Open(); 
        cmd.ExecuteNonQuery(); 
       }//cmd 
      }//cn 

這樣你可以讓你的SQL文件SVN,讓您可編輯的可合併文件 和公正在構建過程中或應用程序啓動時即時生成bin數據庫文件。

如果您選擇在您的應用程序啓動中構建數據庫二進制文件,那麼也可以將其作爲內存數據庫,以防應用程序沒有足夠的權限寫入磁盤。你的連接字符串應該是:

Data Source =:memory:; Version = 3; New = True;

相關問題