Retour à l'accueil

MV dans ClickHouse : perte de données et contrôle

L'article analyse les mécanismes de perte de données dans les vues matérialisées ClickHouse lors du changement de schémas de table. Décrit l'insertion de bloc, le paramètre ignore_errors et la surveillance via system.query_views_log. Recommandations pour des pipelines stables.

Perte de données dans MV ClickHouse : comment vous protéger
Advertisement 728x90

Vues matérialisées dans ClickHouse : Scénarios de perte de données

Les vues matérialisées (MV) dans ClickHouse fonctionnent comme des déclencheurs sur les opérations INSERT dans un environnement append-only. Elles capturent les modifications de données sans prise en charge des opérations UPDATE ou DELETE. Les MV sont fiables lorsque les règles sont respectées, mais les changements de schéma de table peuvent entraîner une perte de données.

Risque principal : ClickHouse permet de modifier les tables source et cible indépendamment des MV actives. Cela le distingue des SGBD traditionnels.

Flux de travail classique

Créer des tables de test et une MV pour la démonstration :

Google AdInline article slot
-- Source table
DROP TABLE IF EXISTS test_orders;
CREATE TABLE test_orders (
    order_id String,
    order_dt Datetime
)
ENGINE = MergeTree
ORDER BY order_id;

-- Target table
DROP TABLE IF EXISTS final_test_orders;
CREATE TABLE final_test_orders (
    order_id String,
    order_dt Datetime
)
ENGINE = MergeTree
ORDER BY order_id;

-- MV to redirect data
DROP VIEW IF EXISTS mv_final_test_orders;
CREATE MATERIALIZED VIEW mv_final_test_orders
TO default.final_test_orders (
    order_id String,
    order_dt Datetime
)
AS SELECT order_id, order_dt FROM test_orders;

Insérer des données :

INSERT INTO test_orders VALUES 
('QWE123', '2025-03-01 12:00:00'),
('RTY456', '2025-03-01 13:00:00'),
('XYZ789', '2025-03-01 14:00:00');

La requête SELECT * FROM final_test_orders renverra tous les enregistrements correctement.

Modification du schéma de la table cible

Changer le type de colonne dans final_test_orders :

Google AdInline article slot
DROP TABLE IF EXISTS final_test_orders;
CREATE TABLE final_test_orders (
    order_id UInt64,
    order_dt Datetime
)
ENGINE = MergeTree
ORDER BY order_id;

Répéter l'insertion dans test_orders. La MV générera une erreur de conversion de String vers UInt64. Les données seront écrites dans la table source mais pas dans la cible. L'INSERT échouera en raison de l'atomicité des blocs.

ClickHouse insère les données par blocs. Une erreur dans la MV interrompt l'ensemble de l'INSERT, mais des blocs partiels peuvent persister.

Ignorer les erreurs des MV

Le paramètre materialized_views_ignore_errors=true supprime les erreurs des MV :

Google AdInline article slot
INSERT INTO test_orders SETTINGS materialized_views_ignore_errors = true VALUES 
('QWE123', '2025-03-01 12:00:00'),
('RTY456', '2025-03-01 13:00:00'),
('XYZ789', '2025-03-01 14:00:00');

Les données sont validées dans test_orders, mais rien n'apparaît dans final_test_orders. Il s'agit d'une perte contrôlée dans la table cible.

Surveillance des erreurs via les journaux système

Utiliser system.query_views_log pour suivre les échecs des MV :

SELECT event_time, view_name, exception
FROM system.query_views_log 
WHERE event_date = today() AND exception_code != 0
ORDER BY event_time DESC
LIMIT 1000;

La requête renvoie l'horodatage de l'erreur, le nom de la MV et le texte de l'exception. Configurez des alertes pour ces événements en production.

Combiner materialized_views_ignore_errors=true avec une surveillance minimise les risques.

Pertes non contrôlées dues à des incohérences de colonnes

Les MV utilisent les noms de colonnes, pas les positions. Les colonnes manquantes sont remplies avec des valeurs par défaut sans erreur.

Renommer la colonne :

DROP TABLE IF EXISTS final_test_orders;
CREATE TABLE final_test_orders (
    orders String,
    order_dt Datetime
)
ENGINE = MergeTree
ORDER BY orders;

L'insertion dans test_orders réussira. Dans final_test_orders, la colonne orders sera remplie de chaînes vides — perte de données silencieuse.

Recommandations pour l'utilisation des MV

  • Vérifier les colonnes dans la table cible lors de la création d'une MV.
  • Tester les MV après déploiement.
  • Éviter les changements de schéma sur les tables avec des MV actives.
  • Mettre en place des alertes sur system.query_views_log.

Points clés :

  • Les MV sont un ETL non contrôlé sans garanties transactionnelles.
  • Les insertions par blocs créent un risque de pertes partielles en cas d'erreur.
  • materialized_views_ignore_errors=true préserve les données source mais nécessite une surveillance.
  • Les incohérences de noms de colonnes entraînent des échecs silencieux.
  • La documentation ClickHouse met en garde contre les risques des MV.

— Editorial Team

Advertisement 728x90

Lire ensuite