所以我有一个网络系统,每个用户都有一个单独的SQLite数据库,作为他们的工作空间。所有数据库文件都位于一个目录中,其数据库名称与用户 ID 匹配。
许多这些数据库是创建的,并且很少(如果有的话)编辑。其他人每天都有很多编辑。
要管理此目录上的备份,您是否建议使用带有cron进程的Subversion设置?我考虑这种方法的一个原因是它允许用户轻松回滚他们编辑的工作区。
所以我有一个网络系统,每个用户都有一个单独的SQLite数据库,作为他们的工作空间。所有数据库文件都位于一个目录中,其数据库名称与用户 ID 匹配。
许多这些数据库是创建的,并且很少(如果有的话)编辑。其他人每天都有很多编辑。
要管理此目录上的备份,您是否建议使用带有cron进程的Subversion设置?我考虑这种方法的一个原因是它允许用户轻松回滚他们编辑的工作区。
如果您可以运行自己的 shell 脚本,您可以将每个数据库转储到纯 SQL 文件:
# sqlite3 user.db .dump .exit > user.sql
然后您可以将 SQL 文件存储在 Subversion 存储库中
从 SQL 文件创建数据库:
# sqlite3 -init user.sql user.db .exit
许多这些数据库是创建的,并且很少(如果有的话)编辑。
如果是这种情况,那么您将不会从 Subversion 中获得很多好处。它是一个版本控制系统,而不是一个备份系统。您不会想要对对象进行差异、合并等版本控制操作,因此我认为您将从传统的备份方法中获得更好的效果。压缩 sqlite 文件(尽可能多地)并将它们归档指定的时间长度。如果您在 Linux 系统上运行它,您可以查看备份脚本,例如 logrotate 脚本,它们对系统日志执行相同的操作。由于 sqlite 数据库很好并且干净地打包在一个文件中,因此可以轻松编写恢复旧版本的脚本(只需解压缩并复制到正确的位置)。
根据每个用户在其数据库中存储的数据量,另一种选择是在存储库中保留表的影子副本。进行更改时,会在旧表被修改之前对其进行复制。这样,您可以在数据库中保留以前(甚至是最后几个)修订的副本,并且可以通过简单的数据库操作来恢复它们,而不必去挖掘旧的备份。这还允许您在不恢复整个数据库的情况下恢复对部分数据库的更改。
您可以做的一件事是:
* 始终在开发时将数据库导出到 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
这样,您可以将 sql 文件保留在 SVN 中,允许您拥有可编辑的可合并文件,并在构建过程或应用程序启动时动态生成您的 bin db 文件。
如果您选择在应用程序启动时构建 db 二进制文件,您还可以将其设为内存数据库,以防应用程序没有足够的权限写入磁盘。你的连接字符串应该是:
数据源=:内存:;版本=3;新=真;
SQLite 数据库文件是明文文件还是二进制文件?如果它们是二进制的,我认为您不会从使用 Subversion 中受益那么多(恕我直言,它不应该用作备份系统)。
相反,如果您想让他们恢复旧版本,请使用正常的备份机制(rsync 等)并将每日备份保存一段时间(取决于您的实际需求)。如果他们想恢复以前的版本,他们可以联系您并重新播放。