SQLite3的secure-delete机制如何实现?无法随机写入文件中间时
SQLite secure_delete 实现机制详解
首先明确:SQLite完全不需要重写已删除内容之后的所有字节,它是靠数据库的页式存储结构来高效完成覆盖操作的,具体逻辑如下:
- 数据库按固定大小的页组织:SQLite把整个数据库文件分割成大小统一的页(默认4KB,可通过
PRAGMA page_size查看/修改),所有表数据、索引、元数据都存在这些页里。删除数据时,不会直接“挖掉”文件中间的字节,只是标记页内的对应空间为空闲,等待后续复用。 - secure_delete 直接覆盖页内空闲空间:开启该选项后,当数据被删除释放出页内的空闲空间时,SQLite会立即用零字节覆盖这些空闲区域——不是覆盖整个页,只覆盖被删除数据占用的那部分。因为文件系统支持随机写入,SQLite可以直接定位到磁盘上的目标页位置,修改页内指定区域的内容,完全不需要移动后面的任何数据。
- 整页删除的处理:如果删除操作释放了整个页(比如删除表的最后几条数据,刚好空出一整页),SQLite会把这整个页的内容全部写零,然后标记为空闲页,同样不需要触动其他页的数据。
举个例子:假设你的数据库有2GB数据,中间某一页里有几条被删除的记录,开启secure_delete后,SQLite只需要找到这一页,把记录原来占用的字节写成零就完事了,IO量只有几KB,和后面的2GB数据完全无关,不会有大量IO开销。
你可以自己验证:开启PRAGMA secure_delete = ON;,删除数据后用十六进制编辑器打开数据库文件,定位到对应页,会看到原来的记录内容已经被零覆盖,而其他页的数据没有任何变化。
内容的提问来源于stack exchange,提问作者Limina102
相关产品推荐
相关产品推荐

