La consulta CHECK TABLE en ClickHouse se utiliza para realizar una comprobación de validación de una tabla específica o de sus particiones. Garantiza la integridad de los datos al verificar las sumas de comprobación y otras estructuras internas de datos.
En particular, compara los tamaños reales de los archivos con los valores esperados almacenados en el servidor. Si los tamaños de los archivos no coinciden con los valores almacenados, significa que los datos están corruptos. Esto puede deberse, por ejemplo, a una caída del sistema durante la ejecución de la consulta.
Sintaxis
La sintaxis básica de la consulta es la siguiente:
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 el nombre de la tabla que desea comprobar.partition_expression: (Opcional) Si desea comprobar una partición concreta de la tabla, puede usar esta expresión para especificarla.part_name: (Opcional) Si desea comprobar una parte concreta de la tabla, puede añadir un literal de cadena para especificar el nombre de la parte.FORMAT format: (Opcional) Permite especificar el formato de salida del resultado.SETTINGS: (Opcional) Permite ajustes adicionales.- (Opcional): check_query_single_value_result: Este ajuste controla si la salida es detallada (
0) o resumida (1). - También se pueden aplicar otros ajustes. Si no necesita un orden determinista en los resultados, puede establecer max_threads en un valor superior a uno para acelerar la consulta.
- (Opcional): check_query_single_value_result: Este ajuste controla si la salida es detallada (
La respuesta de la consulta depende del valor del ajuste check_query_single_value_result.
En el caso de check_query_single_value_result = 1, solo se devuelve la columna result con una única fila. El valor de esta fila es 1 si la comprobación de integridad se supera y 0 si los datos están corruptos.
Con check_query_single_value_result = 0, la consulta devuelve las siguientes columnas:
part_path: Indica la ruta a la parte de datos o el nombre del archivo.is_passed: Devuelve 1 si la comprobación de esta parte se completa correctamente; en caso contrario, 0.message: Cualquier mensaje adicional relacionado con la comprobación, como errores o mensajes de éxito.
La consulta CHECK TABLE admite los siguientes motores de tabla:
Ejecutarla sobre tablas con otros motores de tabla provoca una excepción NOT_IMPLEMENTED.
Los motores de la familia *Log no proporcionan recuperación automática de datos en caso de fallo. Use la consulta CHECK TABLE para detectar la pérdida de datos a tiempo.
Ejemplos
Por defecto, la consulta CHECK TABLE muestra el estado general de la comprobación de la tabla:
CHECK TABLE test_table;┌─result─┐
│ 1 │
└────────┘Si desea ver el estado de la comprobación de cada parte de datos por separado, puede usar la configuración check_query_single_value_result.
Además, para comprobar una partición concreta de la tabla, puede usar la palabra clave PARTITION.
CHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0┌─part_path────┬─is_passed─┬─message─┐
│ 201003_7_7_0 │ 1 │ │
│ 201003_3_3_0 │ 1 │ │
└──────────────┴───────────┴─────────┘Del mismo modo, puede comprobar una parte específica de la tabla con la palabra clave PART.
CHECK TABLE t0 PART '201003_7_7_0'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0┌─part_path────┬─is_passed─┬─message─┐
│ 201003_7_7_0 │ 1 │ │
└──────────────┴───────────┴─────────┘Tenga en cuenta que cuando la parte no existe, la consulta devuelve un error:
CHECK TABLE t0 PART '201003_111_222_0'DB::Exception: No such data part '201003_111_222_0' to check in table 'default.t0'. (NO_SUCH_DATA_PART)Obtener un resultado 'corrupto'
Elimine el archivo de suma de comprobación existente:
rm /var/lib/clickhouse-server/data/default/t0/201003_3_3_0/checksums.txtCHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0┌─part_path────┬─is_passed─┬─message──────────────────────────────────┐
│ 201003_7_7_0 │ 1 │ │
│ 201003_3_3_0 │ 1 │ Checksums recounted and written to disk. │
└──────────────┴───────────┴──────────────────────────────────────────┘Si falta el archivo checksums.txt, se puede restaurar. Se recalculará y se reescribirá durante la ejecución del comando CHECK TABLE para la partición específica, y el estado seguirá mostrándose como 'is_passed = 1'.
Puede comprobar todas las tablas (Replicated)MergeTree existentes de una sola vez mediante la consulta CHECK ALL TABLES.
CHECK ALL TABLES
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0┌─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 │ │
└──────────┴──────────┴─────────────┴───────────┴─────────┘Para comprobar el estado de toda una base de datos en lugar de la integridad de tablas individuales, utilice la consulta CHECK DATABASE. Está pensada principalmente para bases de datos con el motor DataLakeCatalog, donde verifica que el catálogo externo sea accesible.
Si los datos están corruptos
Si la tabla está corrupta, puede copiar los datos no corruptos a otra tabla. Para ello:
- Cree una tabla nueva con la misma estructura que la tabla dañada. Para ello, ejecute la consulta
CREATE TABLE <new_table_name> AS <damaged_table_name>. - Establezca el valor de
max_threadsen 1 para procesar la siguiente consulta en un solo hilo. Para ello, ejecute la consultaSET max_threads = 1. - Ejecute la consulta
INSERT INTO <new_table_name> SELECT * FROM <damaged_table_name>. Esta operación copia los datos no corruptos de la tabla dañada a otra tabla. Solo se copiarán los datos anteriores a la parte corrupta. - Reinicie
clickhouse-clientpara restablecer el valor demax_threads.