À propos de Openflow Connector for SQL Server

Note

Ce connecteur est soumis aux conditions d’utilisation de Snowflake Connector.

Cette rubrique décrit les concepts de base, le workflow et les limites de Openflow Connector for SQL Server.

À propos de Openflow Connector for SQL Server

Le Openflow Connector for SQL Server connecte une instance de base de données du serveur SQL à Snowflake et réplique les données des tables sélectionnées en temps quasi réel ou selon une planification. Le connecteur connecte également un journal de toutes les modifications de données, disponible avec l’état actuel des tables répliquées.

Cas d’utilisation

Utilisez ce connecteur si vous souhaitez effectuer les opérations suivantes :

  • Réplication CDC des données du serveur SQL avec Snowflake pour des rapports complets et centralisés.

Versions du serveur SQL prises en charge

Les versions et plateformes suivantes des bases de données du serveur SQL sont prises en charge :

Note

Le connecteur s’appuie sur le suivi des modifications du serveur SQL, qui est disponible à partir du serveur SQL 2008. Les versions antérieures ne prennent pas en charge cette fonctionnalité et sont incompatibles avec le connecteur.

Exigences Openflow

  • La taille de l’environnement d’exécution doit être au moins moyenne. Utilisez un environnement d’exécution plus grand lorsque vous répliquez de grands volumes de données, en particulier lorsque la taille des lignes est importante.

  • Le connecteur ne prend pas en charge les environnements d’exécution Openflow à plusieurs nœuds. Configurez l’environnement d’exécution de ce connecteur avec Min nodes et Max nodes définis sur 1.

Limitations

  • Vous ne pouvez pas exécuter plusieurs connecteurs du même type dans une seule instance d’exécution.

  • Le connecteur ne prend en charge que l’authentification par nom d’utilisateur et mot de passe avec le serveur SQL.

  • Le connecteur ne réplique que les tables dont les types de données sont supportés par Snowflake. Pour obtenir la liste de ces types de données, voir Résumé des types de données.

  • Le connecteur ne réplique que les tables de la base de données qui contiennent des clés primaires.

  • Le connecteur ne met pas à jour les enregistrements existants dans la base de données Snowflake lorsqu’une nouvelle colonne NOT NULL avec une valeur par défaut est ajoutée à l’une des bases de données source.

  • Le connecteur ne met pas à jour les enregistrements existants dans la base de données Snowflake lorsqu’une nouvelle colonne est ajoutée à la liste incluse dans le filtre de colonne JSON.

  • Après avoir supprimé une colonne dans l’une des bases de données sources et l’avoir rajoutée avec le même nom, les suppressions supplémentaires provoquent des erreurs.

  • Après avoir inclus une colonne dans le filtre de colonne JSON et l’avoir exclue, les tentatives d’inclusion supplémentaires provoquent des erreurs.

  • Le connecteur prend en charge les modifications du schéma de la table source, à l’exception des modifications des définitions des clés primaires, de la précision ou de l’échelle d’une colonne numérique.

  • Le connecteur ne prend pas en charge l’opération de troncature de table.

  • Le connecteur ne prend pas en charge le nouvel ajout d’une colonne après sa suppression.

  • Le connecteur ne réplique pas les valeurs individuelles supérieures à 16 MB. Par défaut, le traitement d’une telle valeur entraîne le marquage définitif de l’échec de la table associée. Pour éviter les échecs de table, modifiez le paramètre de destination Stratégie de valeur surdimensionnée.

Note

Vous pouvez contourner les limites affectant certaines colonnes de la table en excluant ces colonnes spécifiques de la réplication.

Workflow

Le workflow suivant décrit les étapes pour configurer et exécuter Openflow Connector for SQL Server :

  1. L’administrateur de la base de données du serveur SQL effectue les tâches suivantes :

    1. Configure les paramètres de réplication de SQL Server et active le suivi des modifications sur les bases de données et les tables en cours de réplication.

    2. Crée des identifiants de connexion pour le connecteur.

    3. (Facultatif) Fournit le certificat SSL pour se connecter à l’instance SQL Server sur SSL.

  2. Un administrateur de compte Snowflake effectue les tâches suivantes :

    1. Crée un utilisateur de service pour le connecteur, une base de données de destination pour stocker les données répliquées, et un entrepôt pour le connecteur.

    2. Installe le connecteur.

    3. Spécifie les paramètres requis pour la définition du flux du connecteur.

    4. Gère le flux.

Le connecteur effectue les opérations suivantes lorsqu’il est exécuté dans Openflow :

  1. Crée les schémas et les tables de destination correspondant aux tables sources configurées pour la réplication.

  2. Commence la réplication conformément au cycle de vie de la réplication de la table.

    Pour plus d’informations, voir Comment les tables sont-elles répliquées ?.

Fonctionnement du connecteur

Les sections suivantes décrivent comment le connecteur fonctionne dans différents scénarios, notamment la réplication, les modifications de schéma et la conservation des données.

Réplication de données

Le connecteur prend en charge la réplication de tables à partir de plusieurs bases de données SQL Server dans une seule instance SQL Server. Le connecteur crée des tables répliquées à partir de différentes bases de données dans des schémas distincts dans la base de données de destination Snowflake.

Référencez les tables répliquées en combinant le nom de la base de données source, le nom du schéma source, et le nom de la table au format suivant :

<database_name>.<schema_name>.<table_name>

Pour chaque schéma de chaque base de données source en cours de réplication, le connecteur crée un schéma distinct dans la base de données Snowflake de destination. Le nom du schéma de destination est une combinaison du nom de la base de données source et du nom du schéma source, séparés par un caractère tiret bas (_), comme montré dans l’exemple suivant :

<source_database_name>_<source_schema_name>

Le connecteur crée des tables dans le schéma de destination avec le même nom que le nom de la table source, comme montré dans l’exemple suivant :

<destination_database>_<destination_schema_name>.<source_table_name>

Comment les tables sont-elles répliquées ?

Le connecteur réplique les tables dans les zones de préparation suivantes :

  1. Introspection du schéma : le connecteur découvre les colonnes de la table source, y compris les noms et les types de colonnes, puis les valide par rapport aux limites de Snowflake et du connecteur. Les échecs de validation entraînent l’échec de cette préparation et le cycle s’achève. À l’issue de cette préparation, le connecteur crée une table de destination vide.

  2. Chargement d’un instantané : le connecteur copie toutes les données disponibles dans la table source dans la table de destination. Si cette zone de préparation échoue, plus aucune donnée n’est répliquée. Une fois l’opération réussie, les données de la table source sont disponibles dans la table de destination.

  3. Chargement incrémentiel : le connecteur suit les modifications apportées à la table source et applique ces modifications à la table de destination. Ce processus se poursuit jusqu’à ce que la table soit retirée de la réplication. Un échec à ce stade arrête définitivement la réplication de la table source, jusqu’à ce que le problème soit résolu.

Pour plus d’informations sur le contournement du chargement des instantanés et l’utilisation du processus de chargement incrémentiel, consultez Réplication incrémentielle.

Statut de réplication de la table

Les défaillances intermédiaires, telles que les erreurs de connexion, n’empêchent pas la réplication de la table. Toutefois, les défaillances permanentes, telles que les types de données non pris en charge, empêchent la réplication de la table.

Pour résoudre les problèmes de réplication ou vérifier qu’une table a été correctement supprimée du flux de réplication, consultez le magasin d’états des tables (Table State Store) :

  1. Dans le canevas de l’environnement d’exécution Openflow, cliquez avec le bouton droit de la souris sur un groupe de processeurs et choisissez Controller Services. Une table répertoriant les services du contrôleur s’affiche.

  2. Localisez la ligne intitulée Table State Store, cliquez sur le bouton More Trois points verticaux indiquant plus d'options sur le côté droit de la ligne, puis choisissez View State.

Une liste des tables et de leurs états actuels s’affiche. Renseignez le champ de recherche pour filtrer la liste par nom de table. Les états possibles sont :

  • NEW : La table est planifiée pour la réplication, mais la réplication n’a pas commencé.

  • SNAPSHOT_REPLICATION : Le connecteur copie des données existantes. Cet état s’affiche jusqu’à ce que tous les enregistrements soient stockés dans la table de destination.

  • INCREMENTAL_REPLICATION : Le connecteur réplique activement les modifications. Cet état s’affiche après la fin de la réplication des instantanés et continue de s’afficher indéfiniment jusqu’à ce qu’une table soit supprimée de la réplication ou que la réplication échoue.

  • FAILED : La réplication s’est définitivement arrêtée en raison d’une erreur.

Note

Le canevas de l’environnement d’exécution Openflow n’affiche pas les modifications de l’état de la table, mais uniquement l’état actuel de la table. Toutefois, les modifications de l’état des tables sont enregistrées dans les journaux lorsqu’elles se produisent. Recherchez le message de journal suivant :

Replication state for table <database_name>.<schema_name>.<table_name> changed from <old_state> to <new_state>
Copy

Si une défaillance permanente empêche la réplication d’une table, supprimez la table de la réplication. Après avoir résolu le problème à l’origine de l’échec, vous pouvez ajouter à nouveau la table à la réplication. Pour plus d’informations, voir Redémarrer la réplication des tables.

Comprendre la conservation des données

Le connecteur suit une logique de conservation des données où les données client ne sont jamais automatiquement supprimées. Vous conservez la propriété et le contrôle total de vos données répliquées, et le connecteur préserve les informations historiques au lieu de les supprimer définitivement.

Cette approche a les implications suivantes :

  • Les lignes supprimées de la table source sont supprimées de manière douce dans la table de destination plutôt que d’être supprimées physiquement.

  • Les colonnes supprimées de la table source sont renommées dans la table de destination au lieu d’être supprimées.

  • Les tables de journal sont conservées indéfiniment et ne sont pas automatiquement nettoyées.

Colonnes de métadonnées de la table de destination

Chaque table de destination comprend les colonnes de métadonnées suivantes qui suivent les informations de réplication :

Nom de la colonne

Type

Description

_SNOWFLAKE_INSERTED_AT

TIMESTAMP_NTZ

Horodatage du moment où la ligne a été initialement insérée dans la table de destination.

_SNOWFLAKE_UPDATED_AT

TIMESTAMP_NTZ

Horodatage de la dernière mise à jour de la ligne dans la table de destination.

_SNOWFLAKE_DELETED

BOOLEAN

Indique si la ligne a été supprimée de la table source. Lorsque true, la ligne a été supprimée temporairement et n’existe plus dans la source.

Lignes supprimées temporairement

Lorsqu’une ligne est supprimée de la table source, le connecteur ne la supprime pas physiquement de la table de destination. Au lieu de cela, la ligne est marquée comme supprimée en définissant la colonne de métadonnées _SNOWFLAKE_DELETED sur true.

Cette approche vous permet de :

  • Conserver les données historiques à des fins d’audit ou de conformité.

  • Interroger les enregistrements supprimés lorsque cela est nécessaire.

  • Décider quand et comment supprimer définitivement des données en fonction de vos besoins.

Pour interroger uniquement les lignes actives (non supprimées), filtrez sur la colonne _SNOWFLAKE_DELETED :

SELECT * FROM my_table WHERE _SNOWFLAKE_DELETED = FALSE;
Copy

Pour interroger les lignes supprimées :

SELECT * FROM my_table WHERE _SNOWFLAKE_DELETED = TRUE;
Copy

Colonnes supprimées

Lorsqu’une colonne est supprimée de la table source, le connecteur ne supprime pas la colonne correspondante de la table de destination. Au lieu de cela, la colonne est renommée en ajoutant le suffixe __SNOWFLAKE_DELETED pour préserver les valeurs historiques.

Par exemple, si une colonne nommée EMAIL est supprimée de la table source, elle est renommée en EMAIL__SNOWFLAKE_DELETED dans la table de destination. Les lignes qui existaient avant la suppression de la colonne conservent leurs valeurs d’origine, tandis que les lignes ajoutées après la suppression affichent NULL dans cette colonne.

Vous pouvez toujours interroger les valeurs historiques à partir de la colonne renommée :

SELECT EMAIL__SNOWFLAKE_DELETED FROM my_table;
Copy

Colonnes renommées

En raison de limitations dans les mécanismes CDC (Change Data Capture), le connecteur ne peut pas faire la distinction entre une colonne renommée et une colonne supprimée, suivie de l’ajout d’une nouvelle colonne. Par conséquent, lorsque vous renommez une colonne dans la table source, le connecteur traite cela comme deux opérations distinctes : supprimer la colonne d’origine et ajouter une nouvelle colonne avec le nouveau nom.

Par exemple, si vous renommez une colonne A en B dans la table source, la table de destination contiendra :

  • A__SNOWFLAKE_DELETED : Contient les valeurs d’avant le changement de nom. Les lignes ajoutées après le changement de nom affichent NULL dans cette colonne.

  • B : Contient les valeurs d’après le changement de nom. Les lignes qui existaient avant le changement de nom affichent NULL dans cette colonne.

Interrogation de colonnes renommées

Pour récupérer les données des colonnes d’origine et des colonnes renommées en une seule colonne unifiée, utilisez une expression COALESCE ou CASE :

SELECT
    COALESCE(B, A__SNOWFLAKE_DELETED) AS A_RENAMED_TO_B
FROM my_table;
Copy

Vous pouvez également utiliser une expression CASE :

SELECT
    CASE
        WHEN B IS NOT NULL THEN B
        ELSE A__SNOWFLAKE_DELETED
    END AS A_RENAMED_TO_B
FROM my_table;
Copy

Création d’une vue pour des colonnes renommées

Plutôt que de modifier manuellement la table de destination, vous pouvez créer une vue qui présente la colonne renommée comme une seule colonne unifiée. Cette approche est recommandée, car elle préserve les données d’origine et évite les problèmes potentiels liés à la réplication en cours.

CREATE VIEW my_table_unified AS
SELECT
    *,
    COALESCE(B, A__SNOWFLAKE_DELETED) AS A_RENAMED_TO_B
FROM my_table;
Copy

Important

La modification manuelle de la structure de la table de destination (par exemple, la suppression ou le renommage de colonnes) n’est pas recommandée, car elle peut interférer avec la réplication en cours et entraîner des incohérences de données.

Tables de journal

Lors de la réplication incrémentielle, les modifications de la base de données source sont d’abord écrites dans les tables de journal avant d’être fusionnées dans les tables de destination. Le connecteur ne supprime pas automatiquement les données des tables de journal, car ces données peuvent être utiles à des fins d’audit, de débogage ou de retraitement.

Les tables de journal sont créées dans le même schéma que les tables de destination correspondantes et suivent cette convention de dénomination :

<TABLE_NAME>_JOURNAL_<timestamp>_<number>

Où :

  • <TABLE_NAME> est le nom de la table de destination.

  • <timestamp> est l’horodatage de création au format d’époque Unix (secondes depuis le 1er janvier 1970), garantissant l’unicité.

  • <number> commence à 1 et incrémente chaque fois que le schéma de la table de destination change, soit en raison de modifications de schéma dans la table source, soit en raison de modifications des filtres de colonnes.

Par exemple, si votre table de destination est SALES.ORDERS, la table du journal peut être nommée SALES.ORDERS_JOURNAL_1705320000_1.

Important

Ne supprimez pas les tables de journal pendant la réplication en cours. La suppression d’une table de journal active peut entraîner des pertes de données ou des échecs de réplication. Ne supprimez les tables de journal qu’une fois que la table source correspondante a été entièrement retirée de la réplication.

Gestion du stockage des tables de journal

Si vous devez gérer les coûts de stockage en supprimant les anciennes données du journal, vous pouvez créer une tâche Snowflake qui nettoie périodiquement les tables de journal pour les tables qui ne sont plus répliquées.

Avant d’implémenter le nettoyage du journal, vérifiez que :

  • Les tables sources correspondantes ont été entièrement retirées de la réplication.

  • Vous n’avez plus besoin des données du journal à des fins d’audit ou de traitement.

Pour plus d’informations sur la création et la gestion de tâches pour le nettoyage automatisé, consultez Introduction aux tâches.

Prochaines étapes

Examinez Openflow Connector for SQL Server : Mappage de données pour comprendre comment le connecteur fait correspondre les types de données aux types de données Snowflake.

Examinez Paramétrez Openflow Connector for SQL Server pour configurer le connecteur.