我有一个 sqlite db,它已经增长到 30gb,而且我每天仍在向它推送数据。我有几个服务使用 libsqlite3 向它写入数据。很快它就会变得太大而无法在本地保存。对我来说,迁移到分布式设置的最佳方法是什么?我能想到的一种方法是 sshfs,但如果我的机器处于离线状态,它将不起作用。一个解决方案是将我最近使用的数据库部分缓存在本地,并将其余部分保存在其他地方,这将是完美的。大多数时候,我会使用最近推送的数据。我可以开始存档多年前的数据,但访问它需要手动操作。
我有一个 sqlite db,它已经增长到 30gb,而且我每天仍在向它推送数据。我有几个服务使用 libsqlite3 向它写入数据。很快它就会变得太大而无法在本地保存。对我来说,迁移到分布式设置的最佳方法是什么?我能想到的一种方法是 sshfs,但如果我的机器处于离线状态,它将不起作用。一个解决方案是将我最近使用的数据库部分缓存在本地,并将其余部分保存在其他地方,这将是完美的。大多数时候,我会使用最近推送的数据。我可以开始存档多年前的数据,但访问它需要手动操作。
如果我正确理解了您的环境,那么最好的方法是进行“基于时间戳”的分区。将当前业务对象保留在数据库的操作副本中,将历史业务对象移动到存档数据库。设置从当前数据库到存档数据库的单向 ETL。
首先将整个数据库复制到具有大量存储空间的桌面。然后你有两种相互竞争的方法,选择看起来更简单的方法:
现在您有了一个存档和工作数据库。将工作数据库复制到您的工作平台。然后考虑 ETL。
有一个不错的 ETL for sqlite 作为扩展:https://sqlite.org/sessionintro.html它允许您轻松创建批处理,其中包含工作数据库中的所有新更改,这些更改将在存档数据库中重复。但缺点是 - 您需要更新客户端应用程序才能启用和使用该扩展。
另一种方法是制作一个单独的应用程序。它会扫描工作数据库中的过期业务对象,将它们提取到某个传输文件(通常是 json)中,从工作数据库中删除这些对象并对其进行清理。然后,您必须将传输文件移动到存档端并将它们加载到存档数据库中。这不是一个容易的解决方案,但它可靠、易于客户理解,并且即使您由于某种原因无法修改客户端应用程序也可以实现。