> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8a08bda2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Documentação do Check Table

# Instrução CHECK TABLE

A consulta `CHECK TABLE` no ClickHouse é usada para realizar uma verificação em uma tabela específica ou em suas partições. Ela garante a integridade dos dados ao verificar os checksums e outras estruturas internas de dados.

Em particular, ela compara os tamanhos reais dos arquivos com os valores esperados armazenados no servidor. Se os tamanhos dos arquivos não corresponderem aos valores armazenados, isso significa que os dados estão corrompidos. Isso pode ser causado, por exemplo, por uma falha do sistema durante a execução da consulta.

<Warning>
  A consulta `CHECK TABLE` pode ler todos os dados da tabela e reter alguns recursos, o que a torna intensiva em termos de recursos.
  Considere o possível impacto no desempenho e no uso de recursos antes de executar esta consulta.
  Esta consulta não melhora o desempenho do sistema, e você não deve executá-la se não tiver certeza do que está fazendo.
</Warning>

<div id="syntax">
  ## Sintaxe
</div>

A sintaxe básica da consulta é a seguinte:

```sql theme={null}
CHECK TABLE table_name [PARTITION partition_expression | PART part_name] [FORMAT format] [SETTINGS check_query_single_value_result = (0|1) [, other_settings]]
```

* `table_name`: Especifica o nome da tabela que você quer verificar.
* `partition_expression`: (Opcional) Se você quiser verificar uma partição específica da tabela, pode usar esta expressão para especificá-la.
* `part_name`: (Opcional) Se você quiser verificar uma parte específica da tabela, pode adicionar um literal de string para especificar o nome da parte.
* `FORMAT format`: (Opcional) Permite especificar o formato de saída do resultado.
* `SETTINGS`: (Opcional) Permite definir configurações adicionais.
  * (Opcional): [check\_query\_single\_value\_result](/pt-BR/reference/settings/session-settings#check_query_single_value_result): Essa configuração controla se a saída será detalhada (`0`) ou resumida (`1`).
  * Outras configurações também podem ser aplicadas. Se você não precisar de uma ordem determinística para os resultados, pode definir max\_threads como um valor maior que um para acelerar a consulta.

A resposta da consulta depende do valor da configuração `check_query_single_value_result`.
No caso de `check_query_single_value_result = 1`, apenas a coluna `result`, com uma única linha, é retornada. O valor nessa linha é `1` se a verificação de integridade for aprovada e `0` se os dados estiverem corrompidos.

Com `check_query_single_value_result = 0`, a consulta retorna as seguintes colunas:

* `part_path`: Indica o caminho para a parte de dados ou o nome do arquivo.
  * `is_passed`: Retorna 1 se a verificação dessa parte for bem-sucedida; caso contrário, retorna 0.
  * `message`: Quaisquer mensagens adicionais relacionadas à verificação, como erros ou mensagens de sucesso.

A consulta `CHECK TABLE` oferece suporte aos seguintes motores de tabela:

* [Log](/pt-BR/reference/engines/table-engines/log-family/log)
* [TinyLog](/pt-BR/reference/engines/table-engines/log-family/tinylog)
* [StripeLog](/pt-BR/reference/engines/table-engines/log-family/stripelog)
* [família MergeTree](/pt-BR/reference/engines/table-engines/mergetree-family/mergetree)

Executá-la em tabelas com outros motores de tabela gera uma exceção `NOT_IMPLEMENTED`.

Os motores da família `*Log` não oferecem recuperação automática de dados em caso de falha. Use a consulta `CHECK TABLE` para detectar perda de dados rapidamente.

<div id="examples">
  ## Exemplos
</div>

Por padrão, a consulta `CHECK TABLE` mostra o status geral da verificação da tabela:

```sql title="Query" theme={null}
CHECK TABLE test_table;
```

```text title="Response" theme={null}
┌─result─┐
│      1 │
└────────┘
```

Se você quiser ver o status da verificação de cada parte de dados separadamente, pode usar a configuração `check_query_single_value_result`.

Além disso, para verificar uma partição específica da tabela, você pode usar a palavra-chave `PARTITION`.

```sql title="Query" theme={null}
CHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
```

```text title="Response" theme={null}
┌─part_path────┬─is_passed─┬─message─┐
│ 201003_7_7_0 │         1 │         │
│ 201003_3_3_0 │         1 │         │
└──────────────┴───────────┴─────────┘
```

Da mesma forma, você também pode verificar uma parte específica da tabela usando a palavra-chave `PART`.

```sql title="Query" theme={null}
CHECK TABLE t0 PART '201003_7_7_0'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
```

```text title="Response" theme={null}
┌─part_path────┬─is_passed─┬─message─┐
│ 201003_7_7_0 │         1 │         │
└──────────────┴───────────┴─────────┘
```

Observe que, quando a parte não existe, a consulta retorna um erro:

```sql title="Query" theme={null}
CHECK TABLE t0 PART '201003_111_222_0'
```

```text title="Response" theme={null}
DB::Exception: No such data part '201003_111_222_0' to check in table 'default.t0'. (NO_SUCH_DATA_PART)
```

<div id="receiving-a-corrupted-result">
  ### Obtendo um resultado 'Corrompido'
</div>

<Warning>
  Aviso: o procedimento descrito aqui, incluindo a manipulação manual ou a remoção de arquivos diretamente do diretório de dados, destina-se apenas a ambientes experimentais ou de desenvolvimento. **Não** tente fazer isso em um servidor de produção, pois isso pode levar à perda de dados ou a outras consequências indesejadas.
</Warning>

Remova o arquivo de checksum existente:

```bash theme={null}
rm /var/lib/clickhouse-server/data/default/t0/201003_3_3_0/checksums.txt
```

```sql title="Query" theme={null}
CHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
```

```text title="Response" theme={null}
┌─part_path────┬─is_passed─┬─message──────────────────────────────────┐
│ 201003_7_7_0 │         1 │                                          │
│ 201003_3_3_0 │         1 │ Checksums recounted and written to disk. │
└──────────────┴───────────┴──────────────────────────────────────────┘
```

Se o arquivo checksums.txt estiver ausente, ele poderá ser restaurado. Ele será recalculado e gravado novamente durante a execução do comando CHECK TABLE para a partição específica, e o status continuará sendo informado como 'is\_passed = 1'.

Você pode verificar de uma só vez todas as tabelas `(Replicated)MergeTree` existentes usando a consulta `CHECK ALL TABLES`.

```sql theme={null}
CHECK ALL TABLES
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
```

```text theme={null}
┌─database─┬─table────┬─part_path───┬─is_passed─┬─message─┐
│ default  │ t2       │ all_1_95_3  │         1 │         │
│ db1      │ table_01 │ all_39_39_0 │         1 │         │
│ default  │ t1       │ all_39_39_0 │         1 │         │
│ db1      │ t1       │ all_39_39_0 │         1 │         │
│ db1      │ table_01 │ all_1_6_1   │         1 │         │
│ default  │ t1       │ all_1_6_1   │         1 │         │
│ db1      │ t1       │ all_1_6_1   │         1 │         │
│ db1      │ table_01 │ all_7_38_2  │         1 │         │
│ db1      │ t1       │ all_7_38_2  │         1 │         │
│ default  │ t1       │ all_7_38_2  │         1 │         │
└──────────┴──────────┴─────────────┴───────────┴─────────┘
```

<div id="if-the-data-is-corrupted">
  ## Se os dados estiverem corrompidos
</div>

Se a tabela estiver corrompida, você pode copiar os dados não corrompidos para outra tabela. Para isso:

1. Crie uma nova tabela com a mesma estrutura da tabela danificada. Para isso, execute a consulta `CREATE TABLE <new_table_name> AS <damaged_table_name>`.
2. Defina o valor de `max_threads` como 1 para processar a próxima consulta em uma única thread. Para isso, execute a consulta `SET max_threads = 1`.
3. Execute a consulta `INSERT INTO <new_table_name> SELECT * FROM <damaged_table_name>`. Esse comando copia os dados não corrompidos da tabela danificada para outra tabela. Apenas os dados anteriores à parte corrompida serão copiados.
4. Reinicie o `clickhouse-client` para redefinir o valor de `max_threads`.
