5

我有一个使用 SQLite 进行存储的应用程序,我想知道使用Windows DFS 复制将数据库文件备份到安装了应用程序的冷备用实例的第二台服务器是否安全。

可能相关的细节:

  1. 尽管 DFS 支持双向复制,但在这种情况下,只有主数据库文件被写入,因此复制实际上是单向的。
  2. 主数据库文件与正在写入它的进程位于同一服务器上。
  3. 目前 SQLite 配置为使用标准Rollback Journal,但如果需要,我可以切换到Write-Ahead Log

如果 DFS 在复制期间锁定了主数据库文件,那么我认为只要锁定时间不长,这种方法就可以工作。但是,我找不到有关如何实现 DFS 的足够信息。

更新:我已经在测试环境中实现了这个,并且已经运行了几天。在那段时间里我没有遇到任何问题,所以我很想采用这个解决方案。

4

1 回答 1

2

考虑到DFS 复制面向文件和文件夹:

DFS 复制是一种高效的多主复制引擎,可用于跨有限带宽网络连接在服务器之间保持文件夹同步。

如果您关心一致性并保留所有数据,我可能会尽量避免它,如SQLite 备份文档所述:

从历史上看,SQLite 数据库的备份(副本)是使用以下方法创建的:

  1. 使用 SQLite API(即 shell 工具)在数据库文件上建立共享锁。
  2. 使用外部工具(例如 unix 'cp' 实用程序或 DOS 'copy' 命令)复制数据库文件。
  3. 放弃在步骤 1 中获得的数据库文件上的共享锁。

此过程在许多情况下运行良好,并且通常非常快。但是,这种技术有以下缺点:

  1. 任何希望在创建备份时写入数据库文件的数据库客户端必须等到共享锁被放弃。
  2. 它不能用于将数据复制到内存数据库或从内存数据库复制数据。
  3. 如果在复制数据库文件时发生电源故障或操作系统故障,则备份数据库可能会在系统恢复后损坏。

在 DFS 的情况下,它甚至不会在复制之前锁定数据库。

我认为您最好的选择是使用某种热复制,您可能想要使用SQLite Online Backup API,您可以查看本教程关于使用 Online Backup API 创建热备份

或者,如果您想要更简单的东西,您可以尝试使用SymmetricDS,这是一个与 SQLite 兼容的开源数据库复制系统。

还有其他选项(例如 litereplicator.io),但这个是封闭源代码,仅限于旧 SQLite 版本和约 50MB 大小的数据库

附言。如果您真的需要 HA、复制或此类功能,我可能会远离 SQLite。根据您选择的编程语言,很可能您已经抽象了 DB 层,您可以使用 MySQL 或 PosgreSQL。

于 2019-10-13T19:20:01.887 回答