validate

在本页面

Definition

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

Note

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

该命令具有以下语法:

db.runCommand( {
   validate: <string>,          // Collection name
   full: <boolean>              // Optional
} )

该命令包含以下字段:

FieldTypeDescription
validatestring要验证的集合的名称。
fullboolean可选的 。一个标志,确定命令是执行较慢但更彻底的检查还是执行较快但次要的检查。


如果是true,请执行更彻底的检查。
如果是false,则省略一些检查,以进行较快但较不彻底的检查。
默认为false
在版本 3.6 中更改。
从 MongoDB 3.6 开始,对于 WiredTiger 存储引擎,只有full验证过程将强制检查点并将所有内存中数据刷新到磁盘,然后再验证磁盘上的数据。
在以前的版本中,WT 存储引擎的数据验证过程始终强制使用检查点。

mongo shell 还提供了一个包装器db.collection.validate()

db.collection.validate();

Behavior

validate命令的速度可能很慢,尤其是在较大的数据集上。

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

Note

由于validate扫描数据结构的方式,即使完全收集验证也无法检测到 MMAPv1 存储引擎数据文件上的所有损坏形式。

Examples

  • 使用默认设置(即full: false)验证集合myCollection
db.runCommand( { validate: "myCollection" } )
  • 对集合myCollection进行完全验证
db.runCommand( { validate: "myCollection", full: true } )

Validate Output

validate会根据您使用的storage engine产生不同的输出。指定{validate: "<collName>", full: true }以获得更详细的输出。

MMAPv1WiredTiger存储引擎共有以下字段:

  • validate. ns

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

  • validate. nIndexes

    • 集合上的索引数。
  • validate. keysPerIndex

    • 包含集合中每个索引的名称和索引条目计数的文档。
"keysPerIndex" : {
   "_id_" : <num>,
   "<index2_name>" : <num>,
   ...
}

从 3.6.13 开始,keysPerIndex仅通过索引名称标识索引。 MongoDB 的早期版本显示索引的完整名称空间。即<db>.<collection>.$<index_name>

  • validate. indexDetails
    • 包含每个索引的索引验证状态的文档。
"indexDetails" : {
   "_id_" : {
      "valid" : <boolean>
   },
   "<index2_name>" : {
      "valid" : <boolean>
   },
   ...
}

从 3.6.13 开始,

  • indexDetails标识无效的特定索引。如果任何索引无效,则早期版本的 MongoDB 会将所有索引标记为无效。

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

  • validate. valid

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

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

    • 一个数组,其中包含指向指向集合中不存在的文档的每个索引条目的信息。
"extraIndexEntries" : [
   {
      "indexName" : <string>,
      "recordId" : <NumberLong>,  // for the non-existent document
      "indexKey" : {
         "<key1>" : <value>,
         ...
      }
   }
   ...
]

Note

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

从 MongoDB 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>,
         ...
      }
   }
   ...
 ]

Note

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

从 MongoDB 3.6.13 开始可用

  • validate. ok
    • 命令执行成功后,值为1的整数。如果命令失败,则ok字段的值为0

以下字段特定于MMAPv1

  • validate. firstExtent

    • 集合中第一个扩展区的磁盘位置。该字段的值还包括名称空间。
  • validate. lastExtent

    • 集合中最后一个扩展区的磁盘位置。该字段的值还包括名称空间。
  • validate. extentCount

    • 集合中的扩展区数。
  • validate. extents

    • validate针对集合中的每个范围返回此文档的一个实例。仅当您为命令指定full选项时,才会返回此嵌入式文档。
  • validate.extents. loc

    • 此扩展区开头的磁盘位置。
  • validate.extents. xnext

    • 此范围之后的盘区位置。如果这是扩展区的链接列表的末尾,则为“ null”。
  • validate.extents. xprev

    • 此盘区之前的盘区的磁盘位置。如果这是范围的链接列表的开头,则为“ null”。
  • validate.extents. nsdiag

    • 此扩展区所属的名称空间(应与验证列表开头显示的名称空间相同)。
  • validate.extents. size

    • 在此范围内的字节数。
  • validate.extents. firstRecord

    • 第一个记录在此范围内的磁盘位置。
  • validate.extents. lastRecord

    • 此范围中最后一条记录的磁盘位置。
  • validate. datasize

    • 所有数据 Logging 的字节数。该值不包括已删除的记录,也不包括扩展区头,记录头,也没有包含任何范围内未分配的文件中的空间。 datasize包含记录padding
  • validate. lastExtentSize

    • 在此集合中创建的最后一个新扩展区的大小。此值确定所创建的* next *范围的大小。
  • validate. padding

    • 1 到 2 之间的浮点值。

MongoDB 创建新记录时,它将使用padding factor确定要添加到记录的额外空间。当 mongo 注意到更新操作正在触发记录移动时,填充因子将由 mongo 自动调整。

  • validate. firstExtentDetails

    • 在此集合中创建的第一个扩展区的大小。此数据类似于extents嵌入式文档提供的数据;但是,数据仅反映集合中的第一个范围,并且始终返回。
  • validate.firstExtentDetails. loc

    • 此扩展区开头的磁盘位置。
  • validate.firstExtentDetails. xnext

    • 此范围之后的盘区位置。如果这是扩展区的链接列表的末尾,则为“ null”,只有在只有一个扩展区的情况下才应该是这种情况。
  • validate.firstExtentDetails. xprev

    • 此盘区之前的盘区的磁盘位置。此值应始终为“ null”。
  • validate.firstExtentDetails. nsdiag

    • 此扩展区所属的名称空间(应与验证列表开头显示的名称空间相同)。
  • validate.firstExtentDetails. size

    • 在此范围内的字节数。
  • validate.firstExtentDetails. firstRecord

    • 第一个记录在此范围内的磁盘位置。
  • validate.firstExtentDetails. lastRecord

    • 此范围中最后一条记录的磁盘位置。
  • validate. objectsFound

    • 集合扫描中实际遇到的记录数。此字段应与nrecords字段具有相同的值。
  • validate. invalidObjects

    • 包含未通过验证检查的 BSON 文档的记录数。

Note

仅当您指定full选项时,此字段才包括在验证输出中。

  • validate. bytesWithHeaders
    • 除了bytesWithHeaders包含记录头之外,这与 datasize 相似。在 2.0 版中,记录标题为每个文档 16 个字节。

Note

仅当您指定full选项时,此字段才包括在验证输出中。

Note

仅当您指定full选项时,此字段才包括在验证输出中。

  • validate. deletedCount

    • 集合中已删除或“免费”记录的数量。
  • validate. deletedSize

    • 集合中所有已删除或“免费”记录的大小。