小巧. 快速. 可靠.
三选二.
真空

1. 语法

vacuum-stmt

VACUUM schema-name INTO filename

2. 描述

VACUUM 命令重建数据库文件,将其压缩到最小的磁盘空间。应用程序可能出于多种原因这样做

默认情况下,VACUUM 在主数据库上运行。 附加数据库 可以通过将适当的 schema-name 附加到 VACUUM 语句来进行真空处理。

兼容性警告:版本 3.15.0(2016-10-14)中添加了真空处理附加数据库的功能。在此之前,添加到 VACUUM 语句中的 schema-name 将被静默忽略,并且将真空处理“main”模式。

2.1. 带有 INTO 子句的 VACUUM

如果包含 INTO 子句,则原始数据库文件将保持不变,并且将在由 INTO 子句的参数指定的名称的文件中创建一个新数据库。该参数是一个标量 表达式,例如文本文字。新数据库将包含与原始数据库相同的逻辑内容,已完全真空处理。

带有 INTO 子句的 VACUUM 命令是 备份 API 的替代方法,用于生成实时数据库的备份副本。使用 VACUUM INTO 的优点是生成的备份数据库大小最小,因此可能减少了文件系统 I/O 量。此外,所有已删除的内容都将从备份中清除,不会留下任何取证痕迹。另一方面,备份 API 使用更少的 CPU 周期,可以增量执行。

INTO 子句中的文件名可以是任意 SQL 表达式,该表达式计算为字符串。INTO 子句命名的文件之前必须不存在,或者它必须是一个空文件,否则 VACUUM INTO 命令将失败并出现错误。

如果启用了 URI 文件名,则 INTO 的参数可以是 URI 文件名。如果以下任何条件为真,则启用 URL 文件名

VACUUM INTO 命令在事务意义上是事务性的,因为它生成的输出数据库是原始数据库的一致快照。但是,如果 VACUUM INTO 命令因意外关机或电源故障而中断,则生成的输出数据库可能不完整且损坏。此外,SQLite 在生成的数据库上不会调用 fsync() 或 FlushFileBuffers(),以确保它在完成之前已到达非易失性存储器。

3. VACUUM 的工作原理

VACUUM 命令通过将数据库的内容复制到临时数据库文件,然后用临时文件的内容覆盖原始文件来工作。覆盖原始文件时,将使用回滚日志或 write-ahead log WAL 文件,就像对任何其他数据库事务一样。这意味着在对数据库执行 VACUUM 时,需要两倍于原始数据库文件大小的空闲磁盘空间。

VACUUM INTO 命令的工作方式相同,只是它使用 INTO 子句中命名的文件来代替临时数据库,并且省略了将真空处理后的数据库复制回原始数据库之上的步骤。

VACUUM 命令可能会更改任何没有显式 INTEGER PRIMARY KEY 的表中条目的 ROWID

如果在尝试运行 VACUUM 的数据库连接上存在打开的事务,则 VACUUM 会失败。未完成的 SQL 语句通常会保持读事务打开,因此如果在同一个连接上存在未完成的 SQL 语句,则 VACUUM 可能会失败。VACUUM(但不是 VACUUM INTO)是写入操作,因此如果另一个数据库连接持有阻止写入的锁,则 VACUUM 会失败。

在删除数据后回收空间的替代方法是自动真空模式,该模式使用 auto_vacuum pragma 启用。当为数据库启用 auto_vacuum 时,在删除数据后可以回收空闲页面,从而导致文件缩小,而无需使用 VACUUM 重建整个数据库。但是,使用 auto_vacuum 会导致额外的数据库文件碎片。并且 auto_vacuum 不会像 VACUUM 那样压缩数据库中部分填充的页面。

此页面上次修改时间 2023-12-05 14:43:20 UTC