创建、修改和删除更改日记帐

管理员可以创建、删除和重新创建更改日记帐。 当当前更新序列号 (USN) 值接近最大可能 USN 值时,管理员应删除日记帐,如USN_JOURNAL_DATA结构的 MaxUsn 成员所示。 管理员还可以删除并重新创建更改日志以回收磁盘空间。 若要执行此和所有其他非编程更改日志操作,必须具有系统管理员权限。 也就是说,你必须是管理员组的成员。

若要以编程方式在指定卷上创建或修改更改日志,请使用 FSCTL_CREATE_USN_JOURNAL 控制代码。

创建新的更改日志或修改现有更改日志时,NTFS 文件系统会根据 CREATE_USN_JOURNAL_DATA 结构中的信息设置该更改日志的信息, FSCTL_CREATE_USN_JOURNAL 将其作为输入。 CREATE_USN_JOURNAL_DATA 具有 成员 MaximumSizeAllocationDelta

MaximumSize 是更改日志的目标最大大小(以字节为单位)。 更改日志可以增大到大于此值,但在 NTFS 文件系统检查点处,NTFS 文件系统会检查日志,并在其大小超过 MaximumSize 值加上 AllocationDelta 的值时对其进行剪裁。 (在 NTFS 文件系统检查点处,操作系统会将记录写入 NTFS 文件系统日志文件,以便 NTFS 文件系统确定从故障中恢复所需的处理。)

AllocationDelta 是每次分配或解除分配内存时添加到末尾并从更改日志开头删除的字节数。 换句话说,分配和解除分配以此大小的单位进行。 群集大小的整数倍数是此成员的合理值。

如果管理员将现有更改日志修改为具有更大的 MaximumSize 值,例如,如果卷重新编制索引的频率过高,则更改日志只会接收新条目,直到超过新的最大大小。

若要删除更改日志,请使用 FSCTL_DELETE_USN_JOURNAL 控制代码。 使用此操作时,它会遍历卷上的所有文件,并将每个文件的 USN 重置为零。 然后,该操作会删除现有的更改日志。 此操作在系统重启期间一直持续到完成。 在此过程中读取、创建或修改更改日志的任何尝试都失败,错误代码 ERROR_JOURNAL_DELETE_IN_PROGRESS

还可以使用 FSCTL_DELETE_USN_JOURNAL 控制代码来确定某个其他进程启动的删除是否正在进行中。 例如,应用程序在启动时可以确定是否正在进行删除。 由于日志删除在系统重启时仍然存在,因此系统重启时启动的服务和应用程序应检查进行正在进行的删除。

更改日志不一定在启动时创建。 若要创建更改日志,管理员可以显式执行此操作,或者启动另一个需要更改日志的服务。