SQLite数据库在达到一定规模后是否容易变得腐败?

时间:2018-03-20 17:41:01

标签: sqlite

我正在运行一个Python脚本,每分钟都会将数据插入到SQLite数据库中;数据库中有数百万行。

一旦数据库增长到某个大小,它是否有可能变得腐败(或效率低下),以至于无法插入更多数据?

例如,当我今天FTP到我的远程服务器时,我注意到数据库的大小为590,052,352字节。但是,当我几分钟后刷新时,数据库的大小没有增加(应该有)。

当查看数据库的“最后修改”时间戳时,我意识到没有插入超过40小时的数据。因此,我查看了错误日志,但没有任何内容表明存在任何问题。

然后我将数据库从data.db重命名为data-1521564403.db,并创建了一个名为data.db的全新数据库。执行此操作后,python脚本可以再次将数据插入此新数据库,而不会出现任何问题。

上周我注意到了类似的问题。在那个例子中,数据库达到了632 MB的大小,之后它开始向错误日志添加错误,说重复的数据被插入到具有UNIQUE约束的字段中。但是,我知道这是不可能的,因为python脚本确保检查没有插入重复数据。所以我遵循了重命名数据库然后创建新数据库的相同过程,问题得到解决,数据可以再次插入。

所以我的问题是,SQLite数据库在达到一定大小或包含一定数量的行后是否会停止工作(或变得效率低下)?

谢谢!

1 个答案:

答案 0 :(得分:0)

 reasons due to which SQLite database moves to non-accessible state:

文件覆盖操作 - >可以覆盖SQLite文件,因为这些文件是普通的磁盘文件,没有任何方法可以保护数据库免受此类操作的侵害。

  • 运行文件描述符:关闭并重新打开文件Decryptor可能会覆盖在SQLite日志文件上管理的线程,在这种情况下,数据应继续到服务器被替换并且之后显示损坏
  • 事务处于运行模式时还原:在系统后端运行的备份进程可能会尝试在事务未完成时创建SQLite文件的备份。备份将保存以前状态的一些日志和早期事务的一些日志,最后事务ID将不匹配,用户将看到损坏问题。
  • Hot Journal Deletion:对于数据库SQLite的恢复,使用具有相同数据库名称的辅助日志文件,只添加后缀-journal或-wal。在SQLite数据库修复期间,如果服务器由于重命名,删除或文件移动而找不到日志文件,则无法自动恢复数据库。

文件锁定问题:为了协调并发进程,SQLite使用锁定数据库工具,其背后的原因是避免了两个不同进程对探索数据损坏的单个数据库所做的更改。

  • 缺少锁定详细信息:那些被视为锁定数据库的可靠来源的文件系统可能会有一些无法解决的错误,并且当任何数据库线程被锁定时,这种类型的系统可能会增加数据损坏。
  • Posix Advisory Lock取消:此工具对于运行SQLite的所有UNIX系统进行默认锁定非常重要,Close()系统调用通常会中断此操作,并进一步生成SQLite线程损坏。这种腐败背后的主要原因可能是SQLite数据库多个副本的链接 两个锁定协议的矛盾:SQLite3 vfs和SQLite3打开v2(),这两个协议以SQLite数据库处理而闻名,在使用这两个协议的SQLite系统中,肯定会发生矛盾
  • 重命名或取消链接数据库:一旦重命名实际上不存在于同一位置的SQLite数据库文件,它可能是取消链接或重命名SQLite数据库或文件的结果,这也不是一个好习惯,因为它将负责破坏SQLite数据库

文件的多个链接:如果您已将SQLite数据库链接到具有网络连接的多个链接,那么它将再次显示损坏情况。 - 数据库同步失败:如果SQLite Server的sync命令扮演I / O障碍而不是真正的同步角色,那么任何失败都可能会让你觉得有进一步的回滚动作,你可以说它违反了ACID属性。在这种情况下,数据库将处于阻力模式。

  • 不支持同步请求的磁盘驱动器:对于无序磁盘请求,SQLite没有任何内置方法,提交回滚可能会影响数据库的持久性,但它不会实际损坏数据库。要防止数据库同步操作失败,用户应使用SQLite WAL模式。
  • 限制数据同步的PRAGMA:通过将PRAGMA同步设置设置为OFF状态,省略所有同步操作。此设置有助于提高SQLite数据库的性能,但遗憾的是,当操作系统重新排序所有操作时,它会显示损坏。

闪存和磁盘驱动器故障:对于SQLite用户来说,硬盘和磁盘驱动器内容的变化可能非常烦人。

  • 不安全的闪存控制器:在硬盘驱动器未受电源保护的情况下,将数据库内容从一种文件格式转换或写入另一种文件格式是导致SQLite数据库中断的另一个已知原因。
  • 没有更多的数据存储能力:当磁盘没有数据存储空间并且您正在尝试向其中写入内容时,可能会发生SQLite损坏。

由于SQLite文件和数据库转移到无法访问的模式,因此内存损坏,操作系统中的其他问题以及SQLite错误也被列入关键原因。