2014-12-05 80 views
1

我正在寻找每日备份sqlite数据库的正确解决方案。该数据库大约5GB,定期增长,每秒接收新数据并以WAL模式。该服务是全天候服务的,因此在备份期间无法停止任何事情。虽然需要检查,但可能会将数据库锁定几秒钟(分钟)。目的不是要在备份中保留最后的数据,而是为了避免在重大崩溃的情况下丢失“太多”的数据。备份将至少在一天内运行,如果不需要太长时间,备份可能会更频繁。备用SQlite备份解决方案

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

  • 我试过.dump命令。除非试图恢复数据(使用.read),否则这种方式运行良好。如此大的查询(大约10GB .sql文件)会占用系统上的所有内存,并被操作系统(Linux)杀死。

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

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

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

谢谢。

回答

0

SQLite的备份API在检测到数据库已更改时重新启动。 (在sqlite3外壳,这种检查是每100页之后进行。)

在WAL模式,读者不会阻止作家,所以它不会伤害通过读取整个数据库而无需重新启动进行备份。 编写您自己的备份程序,只需要为所有DB页面调用sqlite3_step一次(请参阅API example)。

1

@CL:谢谢你的回答。我完全忽略了备份API的重新启动。

如果它有利于他人:我投了一杆LVM解决方案,它运行得非常好。 简而言之:

  • 创建/装载托管DB文件的逻辑卷的快照。
  • 使用sqlite .backup命令行 - 或者直接将文件从快照中复制出来。
  • 卸载/删除快照。
  • 做什么,你必须做你的数据库复制/备份。

一个浓缩 “如何使用LVM” 可以在这里找到:http://www.howtogeek.com/howto/40702/how-to-manage-and-use-lvm-logical-volume-management-in-ubuntu/