How to corrupt an SQLite database file
16 days ago
- #File Systems
- #Database Corruption
- #SQLite
- SQLite数据库具有高度的抗损坏能力,在崩溃时能自动回滚,但并非绝对免疫。
- 损坏可能源于文件描述符滥用,例如使用不相关数据覆盖数据库文件。
- 事务进行中后台备份进程复制数据可能产生损坏备份;安全方法包括使用sqlite3_rsync、VACUUM INTO和备份API。
- 崩溃后移动、删除或重命名热日志文件(如*-journal或*-wal)会阻碍恢复并可能导致数据库损坏。
- 文件锁定问题,特别是在网络文件系统上或存在POSIX咨询锁定异常时,多进程并发写入可能导致损坏。
- 对同一数据库文件使用多个链接(硬链接或符号链接)可能引发未定义行为及潜在损坏。
- 在子进程中复用带有已打开SQLite连接的进程分叉可能导致锁定问题和损坏。
- 存储设备虚报同步操作(如U盘)可能引发乱序写入导致损坏,使用WAL模式可缓解此问题。
- 禁用SQLite保护机制(如PRAGMA synchronous=OFF)会增加崩溃或断电时的损坏风险。
- SQLite的漏洞(虽罕见)历史上曾引发损坏,例如WAL重置漏洞和表达式索引相关的问题。