Docs 菜单

验证

版本 6.2 中的更改

validate

validate命令检查集合的数据和索引的正确性并返回结果。 如果不在背景运行该命令,该命令还会修复集合的计数和数据大小方面的任何不一致。

提示

mongosh中,该命令也运行通过 validate()辅助方法运行。

辅助方法对 mongosh 用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。

5.0 版本中的更改

从 5.0 版开始,validate 命令还可以查找集合中的不一致性,并尽可能加以修正。

索引不一致包括:

  • 索引是多键的,但没有多键字段。

  • 索引具有多键路径,涵盖非多键字段。

  • 索引没有多键路径,但有多键文档(适用于 3.4 之前构建的索引)。

如果 db.collection.validate() 命令检测到任何不一致,将返回警告,然后将索引上的修复标志设置为 true

db.collection.validate() 还会验证任何违反集合模式验证规则的文档。

注意

validate 命令不支持 视图,在针对视图运行时会引发错误。

mongosh 中的 db.collection.validate() 方法会提供有关 validate 的封装器。

此命令可用于以下环境中托管的部署:

重要

M 0 、M 2和 M 5集群或无服务器实例不支持此命令。 有关更多信息,请参阅不支持的命令。

该命令具有以下语法:

db.runCommand(
{
validate: <string>, // Collection name
full: <boolean>, // Optional
repair: <boolean>, // Optional, added in MongoDB 5.0
metadata: <boolean>, // Optional, added in MongoDB 5.0.4
checkBSONConformance: <boolean> // Optional, added in MongoDB 6.2
background: <boolean> // Optional
}
)

该命令接受以下字段:

字段
类型
说明

validate

字符串

要验证的集合名称。

布尔

可选。一个标志,确定该命令执行较慢但更彻底的检查还是执行更快但不太彻底的检查。

  • 如果为 true,则执行更彻底的检查,但有以下例外:

    • oplog对WiredTiger的 进行全面验证会跳过更彻底的检查。validate.warnings 包括行为通知。

  • 如果为 false,则省略某些检查,以进行更快但不太彻底的检查。

默认为 false

对于WiredTiger存储引擎,只有full验证进程会在验证磁盘数据之前强制设置检查点并将所有内存中数据刷新到磁盘。

布尔

可选。确定命令是否执行修复的标志。

  • 如果为 true,则执行修复。

  • 如果为 false,则不执行修复。

默认为 false

修复只能在独立节点上运行。

此修复修复以下问题:

  • 如果找到缺失的索引条目,则将缺失的键插入索引中。

  • 如果找到额外的索引条目,则从索引中删除额外的键。

  • 如果为非多键索引的索引找到多键文档,则该索引会更改为多键索引。

  • 如果发现未由索引的多键路径指定的多键文档,则会更新该索引的多键路径。

  • 如果发现包含无效 BSON 数据的损坏文档,则会删除这些文档。

有关详细信息,请参阅 的--repair 选项mongod

版本 5.0 中的新增功能

布尔

可选。允许用户执行快速验证以检测无效索引选项的标志,而无需扫描所有文档和索引。

  • 如果为 true,则执行元数据验证扫描。

  • 如果 false,则不执行元数据验证扫描。

默认为 false

{ metadata: true }不支持将使用 的验证命令与任何其他validate 选项一起运行。

metadata 验证选项:

  • 通过仅扫描集合元数据,为您提供更快识别无效索引的方法。

  • collMod命令一起使用时,提供删除和重新创建多个无效索引的替代方法。

metadata 验证选项仅扫描集合元数据以更快地找到无效索引。

如果检测到无效索引,validate 命令将提示您使用 collMod 命令删除无效索引。

db.runCommand( { collMod: <collectionName> } )

5.0.4 版本中的新增功能

布尔

可选。如果为 true,则对集合进行检查,确保 BSON 文档符合 BSON 规范。这些检查会增加完成验证操作的时间。任何问题都会作为警告返回。

checkBSONConformance:

  • 默认值为 false

  • full 设置为 true 时启用。

  • 在以下情况下无法使用:

    • repair 设置为 true

    • metadata 设置为 true

6.2 版本新增

background

布尔

可选。 如果true , MongoDB将在背景运行validate命令。 如果为false ,该命令将修复集合的计数和数据大小方面的任何不一致。

默认为 false

validate 命令的运行速度较慢,尤其是在较大的数据集上。

validate 命令获得对集合的独占锁 W。此操作会阻塞对集合的所有读写操作,直到完成为止。在从节点上运行时,validate 操作可以阻塞该从节点上的所有其他操作,直到其完成为止。

警告

由于验证会影响性能,请考虑仅在副本集节点上运行 validate。您可以使用 rs.stepDown() 指示当前节点成为从节点,避免影响活动的主节点。

$currentOpcurrentOp 命令包含用于正在进行的验证操作的 dataThroughputAveragedataThroughputLastSecond 信息。

验证操作的日志消息包括 dataThroughputAveragedataThroughputLastSecond 信息。

从MongoDB 6.2开始, validate命令和db.collection.validate()方法:

  • 检查集合,确保 BSON 文档符合 BSON 规范。

  • 检查时间序列集合的内部数据是否不一致。

  • 有一个支持全面的 BSON 检查的新选项 checkBSONConformance

validate 命令不再支持 afterClusterTime。因此,validate 不能与因果一致的会话相关联。

从 MongoDB 6.0 开始,如果唯一索引的密钥格式不兼容,validate 命令将返回一条消息。该消息会说明使用了旧格式。

validate命令将collStats输出中集合的计数和数据大小统计信息更新为正确的值。

注意

如果发生非正常关闭,计数和数据大小统计信息可能不准确。

  • 要使用默认验证设置(特别是 full: false)验证集合 myCollection

    db.runCommand( { validate: "myCollection" } )
  • 要对集合 myCollection 执行全面验证,请指定 full: true

    db.runCommand( { validate: "myCollection", full: true } )
  • 要修复集合 myCollection,请指定 repair: true

    db.runCommand( { validate: "myCollection", repair: true } )
  • 要验证 myCollection 集合中的元数据,请指定 metadata: true

    db.runCommand( { validate: "myCollection", metadata: true } )
  • 要在 myCollection 中执行额外的 BSON 一致性检查,请指定 checkBSONConformance: true

    db.runCommand( { validate: "myCollection", checkBSONConformance: true } )

注意

根据 MongoDB 实例的具体配置,输出可能有所不同。

指定 full:true 以获得更详细的输出。

validate.uuid

集合的通用唯一标识符 (UUID)。

6.2 版本新增

validate.nInvalidDocuments

集合中无效文档的数量。无效文档是指无法读取的文档,这意味着BSON文档已损坏,存在错误或大小不匹配。

validate.nNonCompliantDocuments

不符合该集合的模式的文档数量。不符合的文档在 nInvalidDocuments 中不计为无效。

从 MongoDB 6.2 开始,nNonCompliantDocuments 还包括不符合 BSON时间序列集合要求的文档数量。

validate.nrecords

集合中文档数量。

validate.nIndexes

集合上已验证的索引数量。

validate.keysPerIndex

一个文档,包含了集合中每个索引的名称和索引条目数。

"keysPerIndex" : {
"_id_" : <num>,
"<index2_name>" : <num>,
...
}

keysPerIndex 仅通过名称标识索引。

validate.indexDetails

一个文档,包含每个索引的索引验证状态。

"indexDetails" : {
"_id_" : {
"valid" : <boolean>
},
"<index2_name>" : {
"valid" : <boolean>
},
...
}
  • indexDetails 标识无效的一个或多个特定索引。如果任何索引无效,MongoDB 的早期版本会将所有索引标记为无效。

  • indexDetails 仅通过名称标识索引。MongoDB 的早期版本显示索引的完整命名空间,即 <db>.<collection>.$<index_name>

validate.ns

集合的完整命名空间名称。命名空间包括格式为 database.collection 的数据库名称和集合名称。

validate.valid

布尔值,如果 validate 确定集合的所有方面都有效,则其为 true。如果为 false,请参阅 errors 字段以获取更多信息。

validate.repaired

如果 validate 修复了该集合,则为 true 的布尔值。

validate.warnings

一个数组,包含有关验证操作本身的警告消息(如有)。警告消息并不表示集合本身无效。例如:

"warnings" : [
"Could not complete validation of table:collection-28-6471619540207520785. This is a transient issue as the collection was actively in use by other operations."
],
validate.errors

如果集合无效(即 valid 为 false),则此字段将包含一条描述验证错误的消息。

validate.extraIndexEntries

一个数组,包含指向集合中不存在的文档的每个索引条目的信息。

"extraIndexEntries" : [
{
"indexName" : <string>,
"recordId" : <NumberLong>, // for the non-existent document
"indexKey" : {
"<key1>" : <value>,
...
}
}
...
]

注意

对于 extraIndexEntries 数组,所有 indexKey 字段大小的总和限制为 1MB,其中这些字段大小包括 indexKey 的键和值。如果总和超过此大小,则警告字段将显示一条消息。

validate.missingIndexEntries

一个数组,包含缺少相应索引条目的每个文档的信息。

"missingIndexEntries" : [
{
"indexName" : <string>,
"recordId" : <NumberLong>,
"idKey" : <_id key value>, // The _id value of the document. Only present if an ``_id`` index exists.
"indexKey" : { // The missing index entry
"<key1>" : <value>,
...
}
}
...
]

注意

对于 missingIndexEntries 数组,idKey 字段大小及其所有 indexKey 字段大小总和的上限为 1MB,其中字段大小包括 idKeyindexKey 的键和值。如果总和超过此大小,则警告字段将显示一条消息。

validate.corruptRecords

一个由 RecordId 值组成的数组,表示无法读取的文档,可能是因为数据已损坏。这些文档在验证期间被报告为已损坏。RecordId 是一个 64 位整数内部密钥,用于唯一标识集合中的文档。

"corruptRecords" : [
NumberLong(1), // RecordId 1
NumberLong(2) // RecordId 2
]

版本 5.0 中的新增功能

validate.ok

命令成功时值为 1 的整数。如果命令失败,ok 字段的值为 0