使用Subversion对SQLite数据库进行版本控制。好主意还是坏主意?

时间:2009-11-20 18:10:12

标签: svn sqlite backup backup-strategies

所以我有一个网络系统,每个用户都有一个单独的SQLite数据库,作为一种工作空间。所有数据库文件都位于一个目录中,其数据库名称与用户ID匹配。

许多这些数据库都已创建,很少(如果有的话)进行编辑。其他人每天都有很多编辑。

要管理此目录中的备份,建议您使用Subversion进程设置cron吗?我正在考虑这种方法的一个原因是它允许用户轻松回滚他们编辑的工作区。

4 个答案:

答案 0 :(得分:3)

如果您可以运行自己的shell脚本,则可以将每个数据库转储到纯SQL文件:

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

然后您可以将SQL文件存储在Subversion存储库

从SQL文件创建数据库:

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

答案 1 :(得分:2)

  

创建了许多这些数据库   很少,如果有的话,编辑。

如果是这种情况,那么你将无法从Subversion中获得很多好处。它是版本控制系统,而不是备份系统。你不会想要在对象上做diff,merge等版本控制操作,所以我认为你会从传统的备份方法中获得更好的里程。压缩sqlite文件(尽可能多)并将它们存档指定的时间长度。如果您在Linux系统上运行它,您可以查看备份脚本,例如对系统日志执行相同操作的logrotate脚本。由于sqlite数据库很好并且干净地打包在一个文件中,因此可以轻松编写恢复旧版本的脚本(只需解压缩并复制到正确的位置)。

根据每个用户在其数据库中存储的数据量,另外一种方法是在存储库中保留表的卷影副本。进行更改时,在修改旧表之前会复制该表。这样,您可以保留数据库中先前(甚至最后几个)修订版本的副本,并可以使用简单的数据库操作来恢复它们,而不必去挖掘旧备份。这也允许您将更改还原到数据库的一部分,而不会还原整个数据库。

答案 2 :(得分:1)

你可以做的一件事是:
*始终在开发时将数据库导出到sql文件 *在MSBuild自定义任务中或在应用程序启动时以任何方便的初始化步骤将sql文件转换为数据库文件。
*要将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

这样你就可以在SVN中保存sql文件,允许你拥有可编辑的可合并文件 并且只需在构建过程中或应用程序启动时即时生成bin db文件。

如果您选择在应用程序启动时构建db二进制文件,则还可以将其设置为内存数据库,以防您的应用程序没有足够的权限写入磁盘。您的连接字符串应为:

  

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

答案 3 :(得分:0)

SQLite数据库文件是明文文件还是二进制文件?如果它们是二进制的,我认为你不会因为使用Subversion而受益(因为恕我直言,它不应该用作备份系统)。

相反,如果您想允许它们恢复旧版本,请使用常规备份机制(rsync等)并在一段时间内保存每日备份(取决于您的实际要求)。如果他们想要恢复以前的版本,他们可以接近你并重新播放。

相关问题