Docs 菜单

Docs 主页开发应用程序MongoDB Manual

验证

在此页面上

  • 定义
  • 语法
  • 命令字段
  • 行为
  • 举例
  • 验证输出

版本 6.2 中的更改

validate

validate命令检查集合的数据和索引的正确性并返回结果。

提示

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

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

5.0 版本中的更改

从版本5开始。 0中, validate命令还可以查找集合中的不一致之处,并在可能的情况下进行修复。

索引不一致包括:

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

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

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

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

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

注意

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

db.collection.validate()中的 方法提供了mongosh validate的包装器。

该命令具有以下语法:

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
}
)

该命令接受以下字段:

字段
类型
说明
validate
字符串
要验证的集合名称。
布尔

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

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

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

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

默认为 false

从 MongoDB 3.6 开始,对于 WiredTiger 存储引擎,只有 full 验证过程会在验证磁盘数据之前设置检查点并将所有内存数据刷新到磁盘。

在以前的版本中,WT 存储引擎的数据验证过程始终设置检查点。

布尔

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

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

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

默认为 false

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

此修复修复以下问题:

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

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

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

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

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

提示

另请参阅:

版本 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 版本新增

validate命令可能会很慢,尤其是在处理较大的数据集时。

validate命令获取集合上的独占锁W 。这将阻止对集合的所有读取和写入,直到操作完成。在辅助节点上运行时, validate操作可以阻止该辅助节点上的所有其他操作,直到完成为止。

警告

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

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

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

从 MongoDB 6开始。 2 、 validate命令和db.collection.validate()方法:

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

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

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

MongoDB 驱动程序会自动为与 因果一致会话 关联的操作设置 afterClusterTime 。从 MongoDB4 开始。2 中,validate 命令不再支持 afterClusterTime 。因此,validate 不能与 因果一致的会话关联。

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

  • 要使用默认验证设置(特别是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>,
...
}

从 MongoDB 4开始。 2 (以及4 . 0 . 10 + 和3 . 6 . 13 +), keysPerIndex仅通过名称标识索引。早期版本的 MongoDB 显示索引的完整命名空间;即<db>.<collection>.$<index_name>

validate.indexDetails

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

"indexDetails" : {
"_id_" : {
"valid" : <boolean>
},
"<index2_name>" : {
"valid" : <boolean>
},
...
}

从 MongoDB 4.2(以及 4.0.10+ 和 3.6.13+)开始,

  • 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为假),则该字段将包含一条描述验证错误的消息。

validate.extraIndexEntries

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

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

注意

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

从 MongoDB 4.2(以及 4.0.10+ 和 3.6.13+)开始提供

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字段大小的总和限制为1 MB,其中字段大小包括idKeyindexKey 。如果总和超过此大小,则警告字段会显示一条消息。

从 MongoDB 4.2(以及 4.0.10+ 和 3.6.13+)开始提供

validate.corruptRecords

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

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

版本 5.0 中的新增功能

validate.ok

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

← top