备用SQlite备份解决方案

时间:2014-12-05 14:04:34

标签: linux sqlite backup

我正在为sqlite数据库的每日备份寻找合适的解决方案。数据库大约5GB,定期增长,每秒接收新数据并处于WAL模式。该服务是24/7,因此在备份期间无法停止任何操作。尽管需要检查,但是可以将DB锁定几秒钟(几分钟)。目的不是备份中的最后一个数据,而是避免在发生重大崩溃时丢失“太多”数据。备份至少会在一天内运行,如果不需要太长时间,可能会更频繁地运行。

  • 我尝试了.backup命令,但是数据库的传输非常慢(10分钟后只有几MB,3小时后仍然很远) - 这可能是由于持续的写入活动

  • 我尝试了.dump命令。除了尝试恢复数据(使用.read)之外,这种方法效果很好。这么大的查询(大约10GB的.sql文件)占用了系统上的所有RAM,并被操作系统(Linux)杀死。

  • 我读到了LVM和创建快照的能力 - 这可能是一个有趣的解决方案,但目前主机不支持LVM。

  • 我也在考虑将备份程序集成到访问此数据库的代码中,但同样,我希望备份程序是独立的。我也不明白为什么这个解决方案会比'.backup'命令更快。

任何建议,除了“添加一些RAM”?

感谢。

2 个答案:

答案 0 :(得分:1)

@CL:谢谢你的回答。我完全跳过了重启备份API。

如果它对其他人有益:我对LVM解决方案有所了解,它的效果非常好。 简而言之:

  • 创建/安装托管数据库文件的逻辑卷的快照。
  • 使用sqlite .backup命令行 - 或者只是将文件复制出快照。
  • 卸载/删除快照。
  • 执行您的数据库复制/备份操作。

精简"如何使用LVM"可在此处获取:http://www.howtogeek.com/howto/40702/how-to-manage-and-use-lvm-logical-volume-management-in-ubuntu/

答案 1 :(得分:0)

SQLite的备份API在检测到DB已更改时重新启动。 (在sqlite3 shell中,此检查在每100页后完成。)

在WAL模式下,读者不会阻止编写器,因此在不重新启动的情况下通过读取整个数据库来进行备份不会有任何损失。 编写自己的备份程序,只需为所有数据库页面调用sqlite3_step一次(参见API example)。