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

> Documentation de CHECK TABLE

# Instruction CHECK TABLE

La requête `CHECK TABLE` dans ClickHouse sert à effectuer une vérification sur une table donnée ou sur ses partitions. Elle garantit l’intégrité des données en vérifiant les sommes de contrôle et d’autres structures de données internes.

Elle compare notamment les tailles réelles des fichiers aux valeurs attendues stockées sur le serveur. Si les tailles des fichiers ne correspondent pas aux valeurs stockées, cela signifie que les données sont corrompues. Cela peut être causé, par exemple, par un plantage du système pendant l’exécution de la requête.

<Warning>
  La requête `CHECK TABLE` peut lire toutes les données de la table et mobiliser certaines ressources, ce qui la rend coûteuse en ressources.
  Tenez compte de l’impact potentiel sur les performances et l’utilisation des ressources avant d’exécuter cette requête.
  Cette requête n’améliorera pas les performances du système et vous ne devez pas l’exécuter si vous n’êtes pas sûr de ce que vous faites.
</Warning>

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

La syntaxe de base de la requête est la suivante :

```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` : Spécifie le nom de la table que vous souhaitez vérifier.
* `partition_expression` : (Facultatif) Si vous souhaitez vérifier une partition spécifique de la table, vous pouvez utiliser cette expression pour la spécifier.
* `part_name` : (Facultatif) Si vous souhaitez vérifier une partie spécifique de la table, vous pouvez ajouter un littéral de chaîne pour spécifier le nom de la partie.
* `FORMAT format` : (Facultatif) Permet de spécifier le format de sortie du résultat.
* `SETTINGS` : (Facultatif) Permet d'ajouter des paramètres supplémentaires.
  * (Facultatif) : [check\_query\_single\_value\_result](/fr/reference/settings/session-settings#check_query_single_value_result) : Ce paramètre détermine si la sortie est détaillée (`0`) ou résumée (`1`).
  * D'autres paramètres peuvent également être appliqués. Si vous n'avez pas besoin d'un ordre déterministe pour les résultats, vous pouvez définir max\_threads sur une valeur supérieure à un afin d'accélérer la requête.

La réponse à la requête dépend de la valeur du paramètre `check_query_single_value_result`.
Lorsque `check_query_single_value_result = 1`, seule la colonne `result`, avec une seule ligne, est renvoyée. La valeur de cette ligne est `1` si la vérification d'intégrité réussit, et `0` si les données sont corrompues.

Avec `check_query_single_value_result = 0`, la requête renvoie les colonnes suivantes :

* `part_path` : Indique le chemin vers la partie de données ou le nom du fichier.
  * `is_passed` : Renvoie 1 si la vérification de cette partie réussit, 0 sinon.
  * `message` : Tout message supplémentaire lié à la vérification, comme des erreurs ou des messages de réussite.

La requête `CHECK TABLE` prend en charge les moteurs de table suivants :

* [Log](/fr/reference/engines/table-engines/log-family/log)
* [TinyLog](/fr/reference/engines/table-engines/log-family/tinylog)
* [StripeLog](/fr/reference/engines/table-engines/log-family/stripelog)
* [MergeTree family](/fr/reference/engines/table-engines/mergetree-family/mergetree)

Son exécution sur des tables utilisant d'autres moteurs de table provoque une exception `NOT_IMPLEMENTED`.

Les moteurs de la famille `*Log` n'assurent pas de récupération automatique des données en cas de défaillance. Utilisez la requête `CHECK TABLE` pour détecter rapidement toute perte de données.

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

Par défaut, la requête `CHECK TABLE` affiche l’état général de la vérification de la table :

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

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

Si vous souhaitez voir le statut de vérification de chaque partie de données, vous pouvez utiliser le paramètre `check_query_single_value_result`.

De plus, pour vérifier une partition précise de la table, vous pouvez utiliser le mot-clé `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 │         │
└──────────────┴───────────┴─────────┘
```

De même, vous pouvez vérifier une partie précise de la table à l’aide du mot-clé `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 │         │
└──────────────┴───────────┴─────────┘
```

Notez que si la partie n'existe pas, la requête renvoie une erreur :

```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">
  ### Obtenir un résultat « Corrompu »
</div>

<Warning>
  Avertissement : la procédure décrite ici, y compris la manipulation manuelle de fichiers ou leur suppression directe dans le répertoire de données, est réservée aux environnements expérimentaux ou de développement. Ne **tentez pas** cette opération sur un serveur de production, car elle peut entraîner une perte de données ou d’autres conséquences imprévues.
</Warning>

Supprimez le fichier de somme de contrôle existant :

```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. │
└──────────────┴───────────┴──────────────────────────────────────────┘
```

Si le fichier checksums.txt est absent, il peut être restauré. Il sera recalculé et réécrit lors de l’exécution de la commande `CHECK TABLE` pour la partition concernée, et le statut restera signalé comme 'is\_passed = 1'.

Vous pouvez vérifier en une seule fois toutes les tables `(Replicated)MergeTree` existantes à l’aide de la requête `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">
  ## Si les données sont corrompues
</div>

Si la table est corrompue, vous pouvez copier les données non corrompues dans une autre table. Pour ce faire :

1. Créez une nouvelle table avec la même structure que la table endommagée. Pour ce faire, exécutez la query `CREATE TABLE <new_table_name> AS <damaged_table_name>`.
2. Définissez `max_threads` sur 1 afin d'exécuter la requête suivante dans un seul thread. Pour ce faire, exécutez la query `SET max_threads = 1`.
3. Exécutez la query `INSERT INTO <new_table_name> SELECT * FROM <damaged_table_name>`. Cette requête copie les données non corrompues de la table endommagée vers une autre table. Seules les données situées avant la partie corrompue seront copiées.
4. Redémarrez `clickhouse-client` pour réinitialiser la valeur de `max_threads`.
