-
Notifications
You must be signed in to change notification settings - Fork 476
Add docs on INSPECT statement for v26.1 #22023
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,142 @@ | ||
| --- | ||
| title: INSPECT | ||
| summary: Use the INSPECT statement to run data consistency validation checks against tables or databases. | ||
| toc: true | ||
| docs_area: reference.sql | ||
| --- | ||
|
|
||
| The `INSPECT` [statement]({% link {{ page.version.version }}/sql-statements.md %}) runs a data consistency validation job against a table or database and records any errors it finds. To display errors recorded by an inspection job, use [`SHOW INSPECT ERRORS`]({% link {{ page.version.version }}/show-inspect-errors.md %}). | ||
|
|
||
| {{site.data.alerts.callout_info}} | ||
| `INSPECT` is used to verify data integrity. It does not automatically repair errors. | ||
| {{site.data.alerts.end}} | ||
|
|
||
| ## Required privileges | ||
|
|
||
| To run `INSPECT` and view its results, the user must have: | ||
|
|
||
| - The `INSPECT` system-level [privilege]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges) is required to run the `INSPECT` statement. | ||
| - The `VIEWSYSTEMTABLE` system-level [privilege]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges), which is required to view the results of [`SHOW INSPECT ERRORS`]({% link {{ page.version.version }}/show-inspect-errors.md %}). | ||
|
|
||
| ## Synopsis | ||
|
|
||
| <div> | ||
| {% remote_include https://raw.githubusercontent.com/cockroachdb/generated-diagrams/{{ page.release_info.crdb_branch_name }}/grammar_svg/inspect_table.html %} | ||
| </div> | ||
|
|
||
| <div> | ||
| {% remote_include https://raw.githubusercontent.com/cockroachdb/generated-diagrams/{{ page.release_info.crdb_branch_name }}/grammar_svg/inspect_database.html %} | ||
| </div> | ||
|
|
||
| ## Parameters | ||
|
|
||
| Parameter | Description | ||
| ----------|------------ | ||
| `table_name` | The [table]({% link {{ page.version.version }}/create-table.md %}) to inspect. | ||
| `db_name` | The [database]({% link {{ page.version.version }}/create-database.md %}) to inspect. | ||
| `opt_as_of_clause` | Optional. Run the inspection against a historical read timestamp using `INSPECT ... AS OF SYSTEM TIME {expr}`. For an example, see [`INSPECT` at a specific timestamp](#inspect-at-a-specific-timestamp). For more information about historical reads, see [`AS OF SYSTEM TIME`]({% link {{ page.version.version }}/as-of-system-time.md %}). | ||
| `opt_inspect_options_clause` | Optional. Control which [indexes]({% link {{ page.version.version }}/indexes.md %}) are inspected using `INSPECT ... WITH OPTIONS (...)`. For an example, see [`INSPECT` a table for specific indexes](#inspect-a-table-for-specific-indexes). See [Options](#options). | ||
|
|
||
| ### Options | ||
|
|
||
| Option | Description | ||
| -------|------------ | ||
| `INDEX ALL` | Inspect all supported index types in the target table or database. This is the default. | ||
| `INDEX ({index_name} [, ...])` | Inspect only the specified indexes. Note that `INDEX ALL` and this option are mutually exclusive. | ||
| `DETACHED` | Run `INSPECT` in detached mode so the statement returns to the SQL client after the job is created (instead of waiting for the job to complete). For an example, see [`INSPECT` a table without waiting for completion](#inspect-a-table-without-waiting-for-completion). This option allows `INSPECT` to run inside a [multi-statement transaction]({% link {{ page.version.version }}/run-multi-statement-transactions.md %}). | ||
|
|
||
| ## Considerations | ||
|
|
||
| - `INSPECT` always runs as a [background job]({% link {{ page.version.version }}/show-jobs.md %}). | ||
| - By default, `INSPECT` causes the SQL client to wait for the background job to complete and returns a `NOTICE` with the job ID. To return to the client as soon as the job is created (without waiting for it to finish), use the [`DETACHED` option](#options). | ||
| - `INSPECT` can be run inside a [multi-statement transaction]({% link {{ page.version.version }}/run-multi-statement-transactions.md %}) if the `DETACHED` option is used. Otherwise, it needs to be run in an [implicit transaction]({% link {{ page.version.version }}/transactions.md %}#individual-statements). | ||
| - `INSPECT` runs with low priority under the [admission control]({% link {{ page.version.version }}/admission-control.md %}) subsystem and may take time on large datasets. Plan to run it during periods of lower system load. | ||
| - The following index types are unsupported: | ||
| - [Vector indexes]({% link {{ page.version.version }}/vector-indexes.md %}) | ||
| - [Partial indexes]({% link {{ page.version.version }}/partial-indexes.md %}) | ||
| - [Expression indexes]({% link {{ page.version.version }}/expression-indexes.md %}) | ||
| - [Hash-sharded indexes]({% link {{ page.version.version }}/hash-sharded-indexes.md %}) | ||
| - [Inverted indexes]({% link {{ page.version.version }}/inverted-indexes.md %}) | ||
| - Unsupported index types are automatically skipped when using the default `INDEX ALL` behavior. If an unsupported index type is directly requested using `INDEX {index_name}`, the statement will fail before starting. | ||
|
|
||
| ## Examples | ||
|
|
||
| ### `INSPECT` a table (all supported indexes) | ||
|
|
||
| {% include_cached copy-clipboard.html %} | ||
| ~~~ sql | ||
| INSPECT TABLE movr.public.users; | ||
| ~~~ | ||
|
|
||
| ~~~ | ||
| NOTICE: waiting for INSPECT job to complete: 1141477630617223169 | ||
| If the statement is canceled, the job will continue in the background. | ||
| ~~~ | ||
|
|
||
| ### `INSPECT` a table for specific indexes | ||
|
|
||
| {% include_cached copy-clipboard.html %} | ||
| ~~~ sql | ||
| INSPECT TABLE movr.public.vehicles WITH OPTIONS INDEX (vehicles_auto_index_fk_city_ref_users); | ||
| ~~~ | ||
|
|
||
| ~~~ | ||
| NOTICE: waiting for INSPECT job to complete: 1141477560713150465 | ||
| If the statement is canceled, the job will continue in the background. | ||
| ~~~ | ||
|
|
||
| ### `INSPECT` a table without waiting for completion | ||
|
|
||
| {% include_cached copy-clipboard.html %} | ||
| ~~~ sql | ||
| INSPECT TABLE movr.public.vehicles WITH OPTIONS DETACHED; | ||
| ~~~ | ||
|
|
||
| ~~~ | ||
| NOTICE: INSPECT job 1141773037670301697 running in the background | ||
| ~~~ | ||
|
|
||
| ### `INSPECT` at a specific timestamp | ||
|
|
||
| {% include_cached copy-clipboard.html %} | ||
| ~~~ sql | ||
| INSPECT TABLE movr.public.users AS OF SYSTEM TIME '-10s'; | ||
| ~~~ | ||
|
|
||
| ~~~ | ||
| NOTICE: waiting for INSPECT job to complete: 1141477013029322753 | ||
| If the statement is canceled, the job will continue in the background. | ||
| ~~~ | ||
|
|
||
| ### Checking `INSPECT` job status | ||
|
|
||
| When you issue the `INSPECT` statement, a `NOTICE` message is returned to the client showing the job ID: | ||
|
|
||
| ~~~ | ||
| NOTICE: waiting for INSPECT job to complete: 1141477013029322753 | ||
| If the statement is canceled, the job will continue in the background. | ||
| ~~~ | ||
|
|
||
| You can check the status of the `INSPECT` job using a statement like the following: | ||
|
|
||
| {% include_cached copy-clipboard.html %} | ||
| ~~~ sql | ||
| SELECT * FROM [SHOW JOBS] WHERE job_id = 1141477013029322753; | ||
| ~~~ | ||
| ~~~ | ||
| job_id | job_type | description | user_name | status | running_status | created | started | finished | modified | fraction_completed | error | coordinator_id | ||
| ----------------------+----------+---------------------------------+-----------+-----------+----------------+------------------------+------------------------+------------------------+------------------------+--------------------+-------+----------------- | ||
| 1141477013029322753 | INSPECT | INSPECT TABLE movr.public.users | node | succeeded | NULL | 2026-01-14 20:12:19+00 | 2026-01-14 20:12:19+00 | 2026-01-14 20:12:19+00 | 2026-01-14 20:12:19+00 | 1 | | 1 | ||
| ~~~ | ||
|
|
||
| ### Viewing `INSPECT` results | ||
|
|
||
| To view errors found by an inspection job, use [`SHOW INSPECT ERRORS`]({% link {{ page.version.version }}/show-inspect-errors.md %}). Errors are stored in an internal system table and are subject to a 90 day retention policy. | ||
|
|
||
| ## See also | ||
|
|
||
| - [`SHOW INSPECT ERRORS`]({% link {{ page.version.version }}/show-inspect-errors.md %}) | ||
| - [`SHOW JOBS`]({% link {{ page.version.version }}/show-jobs.md %}) | ||
| - [Jobs page in DB Console]({% link {{ page.version.version }}/ui-jobs-page.md %}) | ||
| - [`AS OF SYSTEM TIME`]({% link {{ page.version.version }}/as-of-system-time.md %}) | ||
| - [Supported privileges]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges) | ||
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,117 @@ | ||||||||||
| --- | ||||||||||
| title: SHOW INSPECT ERRORS | ||||||||||
| summary: The SHOW INSPECT ERRORS statement lists issues detected by the INSPECT data consistency checker. | ||||||||||
| toc: true | ||||||||||
| docs_area: reference.sql | ||||||||||
| --- | ||||||||||
|
|
||||||||||
| The `SHOW INSPECT ERRORS` [statement]({% link {{ page.version.version }}/sql-statements.md %}) displays errors recorded by an [`INSPECT`]({% link {{ page.version.version }}/inspect.md %}) job. | ||||||||||
|
|
||||||||||
| `SHOW INSPECT ERRORS` shows results for a single `INSPECT` job at a time; it does not aggregate results across jobs. By default, it returns errors from the most recent completed, successful `INSPECT` job for the specified table. To view errors from a specific job, use `SHOW INSPECT ERRORS FOR JOB {job_id}`. | ||||||||||
|
|
||||||||||
| ## Required privileges | ||||||||||
|
|
||||||||||
| To run `SHOW INSPECT ERRORS`, the user must have: | ||||||||||
|
|
||||||||||
| - The `INSPECT` system-level [privilege]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges), which is required to run the [`INSPECT` statement]({% link {{ page.version.version }}/inspect.md %}). | ||||||||||
| - The `VIEWSYSTEMTABLE` system-level [privilege]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges), which is required to view the output of `SHOW INSPECT ERRORS`. | ||||||||||
|
|
||||||||||
| ## Synopsis | ||||||||||
|
|
||||||||||
| <div> | ||||||||||
| {% remote_include https://raw.githubusercontent.com/cockroachdb/generated-diagrams/{{ page.release_info.crdb_branch_name }}/grammar_svg/show_inspect_errors.html %} | ||||||||||
| </div> | ||||||||||
|
|
||||||||||
| ## Parameters | ||||||||||
|
|
||||||||||
| Parameter | Syntax | Description | ||||||||||
| ----------|----------|------------ | ||||||||||
| `opt_for_table_clause` | `FOR TABLE {table_name}` | Optional. Show errors for the specified [table]({% link {{ page.version.version }}/create-table.md %}). | ||||||||||
| `opt_for_job_clause` | `FOR JOB {job_id}` | Optional. Show errors produced by the job ID returned by the [`INSPECT` statement]({% link {{ page.version.version }}/inspect.md %}). | ||||||||||
| `opt_with_details` | `WITH DETAILS` | Optional. Include structured error metadata from the `details` column ([JSON]({% link {{ page.version.version }}/jsonb.md %})) in the results. | ||||||||||
|
|
||||||||||
| ## Response | ||||||||||
|
|
||||||||||
| `SHOW INSPECT ERRORS` returns the following columns, with one row per issue detected. | ||||||||||
|
|
||||||||||
| Field | Description | ||||||||||
| ------|------------ | ||||||||||
| `job_id` | The ID of the [`INSPECT`]({% link {{ page.version.version }}/inspect.md %}) job that detected the issue. | ||||||||||
| `error_type` | The type of inconsistency detected. For more information, see [Error types](#error-types). | ||||||||||
| `aost` | The [`AS OF SYSTEM TIME`]({% link {{ page.version.version }}/as-of-system-time.md %}) timestamp used by the validation [job]({% link {{ page.version.version }}/show-jobs.md %}) (if any). | ||||||||||
| `database_name` | The [database]({% link {{ page.version.version }}/create-database.md %}) containing the schema object with an issue. | ||||||||||
| `schema_name` | The [schema]({% link {{ page.version.version }}/schema-design-overview.md %}) containing the object with an issue. | ||||||||||
| `object_name` | The [table]({% link {{ page.version.version }}/create-table.md %}) or [index]({% link {{ page.version.version }}/indexes.md %}) with an issue. | ||||||||||
| `primary_key` | The [primary key]({% link {{ page.version.version }}/primary-key.md %}) of the row involved in the issue, if applicable. | ||||||||||
| `details` | This column is present only if `WITH DETAILS` is specified. It contains structured metadata ([JSON]({% link {{ page.version.version }}/jsonb.md %})) describing the issue. | ||||||||||
|
|
||||||||||
| ### Error types | ||||||||||
|
|
||||||||||
| The `INSPECT` implementation reports the following `error_type` values: | ||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The errors we report are a bit different. We have these 3 currently defined (more are coming in 26.2):
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. thank you! I've updated the table as follows, let me know what you think - i also added a line about contacting support for the
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The internal error ended up being a catch all for any error that occurs while INSPECT runs its queries. For example, if INSPECT hits something like a GC timeout, it will surface as an internal error. Data corruption can show up this way, but it definitely isn’t the norm. Some assessment of the underlying error is needed before deciding whether to contact support. For the other errors, those represent actual data corruption that we’ve detected. We don’t currently tell the user how to fix those issues, so if they want them resolved, they’ll likely need to contact support.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i've updated as follows, PTAL. Tried to capture the nuance around the catch all error may not mean needing to contact Support, while emphasizing for the other errors that users should definitely contact Support.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These look good to me. Maybe @rafiss can sanity check the support callout here to ensure it's okay. |
||||||||||
|
|
||||||||||
| Error type | Meaning | ||||||||||
| ----------|--------- | ||||||||||
| `missing_secondary_index_entry` | A row in the [primary index]({% link {{ page.version.version }}/primary-key.md %}) is missing a corresponding entry in a [secondary index]({% link {{ page.version.version }}/indexes.md %}). If you see this error, [contact Support]({% link {{ page.version.version }}/support-resources.md %}). | ||||||||||
| `dangling_secondary_index_entry` | A [secondary index]({% link {{ page.version.version }}/indexes.md %}) entry exists, but the referenced [primary index]({% link {{ page.version.version }}/primary-key.md %}) row does not. If you see this error, [contact Support]({% link {{ page.version.version }}/support-resources.md %}). | ||||||||||
| `internal_error` | An error occurred while `INSPECT` was running its validation queries (for example, an [MVCC GC timeout]({% link {{ page.version.version }}/ui-queues-dashboard.md %}#mvcc-gc-queue)). The cause of this error type is usually not related to data validity. Investigate the underlying job error details and cluster logs to determine the cause before deciding whether to [contact Support]({% link {{ page.version.version }}/support-resources.md %}). | ||||||||||
|
|
||||||||||
| ## Examples | ||||||||||
|
|
||||||||||
| ### Show the latest errors for a table | ||||||||||
|
|
||||||||||
| {% include_cached copy-clipboard.html %} | ||||||||||
| ~~~ sql | ||||||||||
| SHOW INSPECT ERRORS FOR TABLE movr.public.users; | ||||||||||
| ~~~ | ||||||||||
|
|
||||||||||
| ### Show errors for a specific inspection job | ||||||||||
|
|
||||||||||
| When you issue the [`INSPECT` statement]({% link {{ page.version.version }}/inspect.md %}), a `NOTICE` message is returned to the client showing the job ID, e.g., | ||||||||||
|
|
||||||||||
| {% include_cached copy-clipboard.html %} | ||||||||||
| ~~~ sql | ||||||||||
| INSPECT TABLE movr.public.users AS OF SYSTEM TIME '-10s'; | ||||||||||
| ~~~ | ||||||||||
|
|
||||||||||
| ~~~ | ||||||||||
| NOTICE: waiting for INSPECT job to complete: 1141477013029322753 | ||||||||||
| If the statement is canceled, the job will continue in the background. | ||||||||||
| ~~~ | ||||||||||
|
|
||||||||||
| To show errors for a job, issue the following statement: | ||||||||||
|
|
||||||||||
| {% include_cached copy-clipboard.html %} | ||||||||||
| ~~~ sql | ||||||||||
| SHOW INSPECT ERRORS FOR JOB 1141477013029322753; | ||||||||||
| ~~~ | ||||||||||
|
|
||||||||||
| If there are no errors associated with that job ID, the output is: | ||||||||||
|
|
||||||||||
| ~~~ | ||||||||||
| SHOW INSPECT ERRORS 0 | ||||||||||
| ~~~ | ||||||||||
|
|
||||||||||
| Note that if you issue a job ID for a nonexistent job, you will see the same output as for a job with no errors: | ||||||||||
|
|
||||||||||
| {% include_cached copy-clipboard.html %} | ||||||||||
| ~~~ sql | ||||||||||
| SHOW INSPECT ERRORS FOR JOB 0; | ||||||||||
| ~~~ | ||||||||||
|
|
||||||||||
| ~~~ | ||||||||||
| SHOW INSPECT ERRORS 0 | ||||||||||
| ~~~ | ||||||||||
|
|
||||||||||
| ### Show errors with details | ||||||||||
|
|
||||||||||
| {% include_cached copy-clipboard.html %} | ||||||||||
| ~~~ sql | ||||||||||
| SHOW INSPECT ERRORS FOR TABLE movr.public.users WITH DETAILS; | ||||||||||
| ~~~ | ||||||||||
|
|
||||||||||
| ## See also | ||||||||||
|
|
||||||||||
| - [`INSPECT`]({% link {{ page.version.version }}/inspect.md %}) | ||||||||||
| - [`SHOW JOBS`]({% link {{ page.version.version }}/show-jobs.md %}) | ||||||||||
| - [Jobs page in DB Console]({% link {{ page.version.version }}/ui-jobs-page.md %}) | ||||||||||
| - [Authorization]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges) | ||||||||||
Uh oh!
There was an error while loading. Please reload this page.