定义
在版本6.2中进行了更改。
validatevalidate命令检查集合的数据和索引的正确性并返回结果。该命令还会修复集合的计数和数据大小方面的任何不一致。提示
在
mongosh中,该命令也可以通过validate()辅助方法运行。助手方法对于
mongosh用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。在版本5.0中进行了更改。
从版本5.0 开始,
validate命令还可以查找集合中的不一致之处,并在可能的情况下进行修复。索引不一致包括:
如果
db.collection.validate()命令检测到任何不一致,将返回警告,然后将索引上的修复标志设置为true。db.collection.validate()还会验证任何违反集合模式验证规则的文档。注意
validate命令不支持视图,在针对视图运行时会引发错误。
兼容性
此命令可用于以下环境中托管的部署:
- MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
重要
M0 和 Flex 集群不支持此命令。有关更多信息,请参阅不支持的命令。
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存储引擎,只有 | |
| 布尔 | ||
| 布尔 | 可选。允许用户执行快速验证以检测无效索引选项的标志,而无需扫描所有文档和索引。
默认为
如果检测到无效索引,validate 命令将提示您使用 5.0.4版本新增。 | |
| 布尔 | 可选。如果为
6.2版本新增。 | |
| 布尔 |
行为
性能
validate命令可能会很慢,尤其是在较大的数据集上。
validate命令获取集合上的独占锁W 。这将区块对集合的所有读取和写入,直到操作完成。在从节点(secondary node from replica set)上运行时,validate 操作可以区块该从节点(secondary node from replica set)上的所有其他操作,直到完成为止。
警告
由于验证会影响性能,请考虑仅在从节点(secondary nodevalidate from replica set)副本集上运行 。您可以使用rs.stepDown() 指示当前主节点(primary node in the replica set)节点成为从节点(secondary node from replica set),以避免影响活动的主节点 (primary node in the replica set)节点。
数据吞吐量指标
$currentOp 和 currentOp 命令包含用于正在进行的验证操作的 dataThroughputAverage 和 dataThroughputLastSecond 信息。
验证操作的日志消息包括 dataThroughputAverage 和 dataThroughputLastSecond 信息。
集合验证改进
从MongoDB6.2 开始,validate 命令和db.collection.validate() 方法:
从MongoDB 8.3 开始,validate 命令和 db.collection.validate() 方法会检查集合,以确保集合没有任何超过 16 MB 的document。
限制
validate命令不再支持 afterClusterTime。因此, validate不能与因果一致的会话关联。
时间序列集合是在MongoDB 5.0 中引入的。从 v5.2 开始,存储时间序列测量值的默认内部格式已更改。由于此更改:
在 v5.2 之前创建的时间序列集合可能同时包含旧格式和新格式的文档。在内部,此类集合被标记为
timeseriesBucketsMayHaveMixedSchemaData: true。在 v5.2 或更高版本中创建的时间序列集合将始终包含新格式的文档。在内部,此类集合被标记为
timeseriesBucketsMayHaveMixedSchemaData: false或根本不标记。
当标志为 true 时,时间序列查询会同时考虑新格式和旧格式。当标志为 false 或缺失时,时间序列查询仅考虑新格式。
由于 SERVER-91194 中描述的错误,在某些情况下该标志可能会丢失。在5 v.2 之前创建的时间序列集合出现这种情况时,读取查询结果可能不完整。也就是说,某些文档可能会丢失,尽管它们仍然存储在磁盘上。
要确定您是否受此影响,请对您的时间序列集合运行validate 。如果集合受错误影响,该命令将返回错误。在这种情况下,您的读取查询结果可能不正确。
如果受影响,升级到已修复的版本,并为每个受影响的集合将 timeseriesBucketsMayHaveMixedSchemaData设立为 true,以确保将来对该集合的查询返回正确的结果。此进程的完整步骤位于此处。
索引键格式
从 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在版本8.1中进行了更改。
包含每个索引的索引验证状态和索引规范的文档。
"indexDetails" : { "_id_" : { "valid" : <boolean>, "spec" : <document> }, "<index2_name>" : { "valid" : <boolean>, "spec" : <document> }, ... } indexDetails标识无效的一个或多个特定索引。如果任何索引无效,MongoDB 的早期版本会将所有索引标记为无效。indexDetails仅通过名称索引索引。早期版本的MongoDB显示索引的完整命名空间;即<db>.<collection>.$<index_name>。spec文档是索引规范,它因索引的定义方式而异。一些示例spec文档字段包括:spec.v。索引版本。spec.unique。一个布尔值,表示索引是否唯一。spec.key。索引键标识符。spec.name。索引名称。
8.1版本新增。
validate.repairedtrue如果validate修复了集合,则为 的布尔值。
validate.repairMode8.2版本新增。
一个字符串,表示
validate命令尝试修复的数据不一致类型(如果检测到)。 可能的repairMode值包括:None:不执行任何修复操作。FixErrors:尝试修复任何验证错误。AdjustMultikey:尝试通过调整多键元元数据来修复多键不一致问题。
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的键和值。如果总和超过此大小,则警告字段会显示一条消息。
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,其中字段大小包括idKey和indexKey。如果总和超过此大小,则警告字段会显示一条消息。
validate.corruptRecords一个由
RecordId值组成的数组,表示无法读取的文档,可能是因为数据已损坏。这些文档在验证期间被报告为已损坏。RecordId是一个 64 位整数内部密钥,用于唯一标识集合中的文档。"corruptRecords" : [ Long(1), // RecordId 1 Long(2) // RecordId 2 ] 版本 5.0 中的新增功能。
validate.ok1命令成功时值为ok的整数。如果命令失败,则 字段的值为0。