gpt4 book ai didi

sqlite - 如何增量备份SQLite数据库?

转载 作者:行者123 更新时间:2023-12-03 14:45:29 53 4
gpt4 key购买 nike

我想高频备份数据库,但是完全备份的成本是不能接受的。
看来SQLite没有API直接进行增量备份。但是我发现有一个数据更改通知回调似乎很有用。
https://www.sqlite.org/c3ref/update_hook.html
回调的参数是操作类型,日期数据库名称,表名称和rowID。但是,我不知道是否可以通过这些信息为这一行日期生成备份信息(例如,SQL语句),而无需了解表的详细信息。这意味着,对于具有不同结构的表,是否存在一种通用的方法来为此操作生成备份?
我知道有一些异常(exception)情况,即不会调用回调,并且如果我定期进行完整备份,我认为这是可以接受的。

最佳答案

我一直在考虑这个想法,虽然尚未得到SQLite的正式认可,但从理论上讲,这听起来似乎很合理。

SQLite备份api本质上使您可以获得实时数据库文件的工作快照。同样,使用VACCUM INTO,您可以更新现有的备份数据库文件。 https://www.sqlite.org/lang_vacuum.html#vacuuminto

这只是很好的备份,我们需要增量备份(有点像git)

假设我们想每小时备份一次数据库,它的1GB数据库写的次数相对较少,每天存储24GB听起来就太过分了。

我们可以利用SQLite文件格式,它本质上是固定的100字节标题+(page_size * num_pages)。 SQLite将始终围绕页面边界进行写操作。 page_size和num_pages存储在100字节的 header 中。请参阅存储规范https://www.sqlite.org/fileformat.html

因此,我们可以做的是创建一个引用文件,该文件只是具有哈希列表的文件。假设我们使用sha256(这是新的git版本使用的),因此它将是一个文件(例如backups/2020-02-22-19-12-00.txt)

sha256(header)
sha256(page1)
sha256(page2)
sha256(page3)

我们将相应的页面作为单独的文件存储,就像git在对象目录中一样。

例如objects/ab/cdef12343 ..

前两个字母用作目录名称,因此目录中没有太多文件。

或者,您可以仅将页面文件上传到任何云存储提供商,例如GCS,S3,Azure Blob,DO空间。这样可以进行多区域备份。

由于我们不会存储页面的重复副本,因此与database_size * num_backups相比,所有备份的文件总大小都非常小。

您甚至可以使用哈希文件来同步/还原SQLite文件。这就是Dropbox/rsync同步文件的方式。哈希文件告诉我们哪些页面已更改,并且我们仅下载更改的对象并更新文件中的这些范围。

关于sqlite - 如何增量备份SQLite数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29154646/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com