验证
定义
在版本中更改中6.2.
validate
命令
validate
命令检查集合的数据和索引的正确性,并返回结果。如果您不在后台运行此命令,该命令还将修复集合计数和数据大小中的任何不一致。提示
在
mongosh
中,此命令也可以通过validate()
辅助方法.辅助方法对于
mongosh
用户来说很方便,但它们可能不会返回与数据库命令相同级别的信息。在不需要便利性或需要额外的返回字段的情况下,请使用数据库命令。在版本中更改中5.0.
从版本5.0开始,
validate
命令还可以在集合中找到不一致之处,并在可能的情况下修复它们。索引不一致包括
如果
db.collection.validate()
命令检测到任何不一致性,则会返回警告,并将索引上的修复标志设置为true
。db.collection.validate()
还会验证任何违反集合模式验证规则的文档。db.collection.validate()
方法在mongosh
中为validate
提供包装。
兼容性
此命令在以下环境中托管的部署中可用
MongoDB Atlas:云中MongoDB部署的全面托管服务
重要
此命令不支持在M0、M2和M5集群或无服务器实例中。有关更多信息,请参阅不支持命令。
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 } )
命令字段
命令包含以下字段
字段 | 类型 | 描述 | |
---|---|---|---|
验证 | 字符串 | 要验证的集合名称。 | |
布尔值 | 可选。一个标志,用于确定命令是执行较慢但更彻底的检查还是较快的但不太彻底的检查。
默认为 对于WiredTiger存储引擎,只有完整的验证过程会在验证磁盘上的数据之前强制执行检查点并将所有内存数据刷新到磁盘。 | ||
布尔值 | |||
布尔值 | 可选。一个标志,允许用户快速验证以检测无效的索引选项,而无需扫描所有文档和索引。
默认为 使用 The
如果检测到无效索引,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()
方法
检查集合以确保BSON文档符合BSON规范。
检查时间序列集合中的内部数据不一致性。
新增了一个名为
checkBSONConformance
的选项,该选项可以启用全面的BSON检查。
限制
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.nNonCompliantDocuments
不符合集合模式的文档数量。不符合规范的文档不计入
nInvalidDocuments
.从MongoDB 6.2版本开始,
nNonCompliantDocuments
还包括不符合BSON 或 时间序列集合要求的文档数量。
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
为假),则此字段将包含描述验证错误的消息。
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
。