验证
定义
版本 6.2 中的更改。
validate
validate
命令检查集合的数据和索引的正确性并返回结果。 如果不在背景运行该命令,该命令还会修复集合的计数和数据大小方面的任何不一致。提示
在
mongosh
中,该命令也运行通过validate()
辅助方法运行。辅助方法对
mongosh
用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。5.0 版本中的更改。
从 5.0 版开始,
validate
命令还可以查找集合中的不一致性,并尽可能加以修正。索引不一致包括:
如果
db.collection.validate()
命令检测到任何不一致,将返回警告,然后将索引上的修复标志设置为true
。db.collection.validate()
还会验证任何违反集合模式验证规则的文档。mongosh
中的db.collection.validate()
方法会提供有关validate
的封装器。
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
重要
M 0 、M 2和 M 5集群或无服务器实例不支持此命令。 有关更多信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
该命令具有以下语法:
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 | 字符串 | 要验证的集合名称。 | |
布尔 | 可选。一个标志,确定该命令执行较慢但更彻底的检查还是执行更快但不太彻底的检查。
默认为 对于WiredTiger存储引擎,只有 | ||
布尔 | |||
布尔 | 可选。允许用户执行快速验证以检测无效索引选项的标志,而无需扫描所有文档和索引。
默认为 使用
如果检测到无效索引,validate 命令将提示您使用
5.0.4 版本中的新增功能。 | ||
布尔 | 可选。如果为
6.2 版本新增。 | ||
background | 布尔 | 可选。 如果 默认为 |
行为
性能
validate
命令的运行速度较慢,尤其是在较大的数据集上。
validate
命令获得对集合的独占锁 W
。此操作会阻塞对集合的所有读写操作,直到完成为止。在从节点上运行时,validate
操作可以阻塞该从节点上的所有其他操作,直到其完成为止。
警告
由于验证会影响性能,请考虑仅在从副本集节点上运行 validate
。您可以使用 rs.stepDown()
指示当前主节点成为从节点,避免影响活动的主节点。
数据吞吐量指标
$currentOp
和 currentOp
命令包含用于正在进行的验证操作的 dataThroughputAverage
和 dataThroughputLastSecond
信息。
验证操作的日志消息包括 dataThroughputAverage
和 dataThroughputLastSecond
信息。
集合验证改进
从MongoDB 6.2开始, validate
命令和db.collection.validate()
方法:
限制
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.nInvalidDocuments
集合中无效文档的数量。无效文档是指无法读取的文档,这意味着BSON文档已损坏,存在错误或大小不匹配。
validate.nNonCompliantDocuments
不符合该集合的模式的文档数量。不符合的文档在
nInvalidDocuments
中不计为无效。从 MongoDB 6.2 开始,
nNonCompliantDocuments
还包括不符合 BSON 或时间序列集合要求的文档数量。
validate.nrecords
集合中文档数量。
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.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,其中字段大小包括idKey
和indexKey
的键和值。如果总和超过此大小,则警告字段将显示一条消息。
validate.corruptRecords
一个由
RecordId
值组成的数组,表示无法读取的文档,可能是因为数据已损坏。这些文档在验证期间被报告为已损坏。RecordId
是一个 64 位整数内部密钥,用于唯一标识集合中的文档。"corruptRecords" : [ NumberLong(1), // RecordId 1 NumberLong(2) // RecordId 2 ] 版本 5.0 中的新增功能。
validate.ok
命令成功时值为
1
的整数。如果命令失败,ok
字段的值为0
。