Sobre a Openflow Connector for SQL Server

Nota

O conector está sujeito aos Termos do conector Snowflake.

Este tópico descreve os conceitos básicos, o fluxo de trabalho e as limitações do Openflow Connector for SQL Server.

Sobre Openflow Connector for SQL Server

O Openflow Connector for SQL Server conecta uma instância de banco de dados do SQL Server ao Snowflake e replica dados de tabelas selecionadas quase em tempo real ou de acordo com um cronograma. O conector também cria um log de todas as alterações de dados, disponível juntamente com o estado atual das tabelas replicadas.

Casos de uso

Use esse conector se quiser fazer o seguinte:

  • Replicação da CDC de dados do SQL Server com o Snowflake para geração de relatórios abrangentes e centralizados.

Versões compatíveis do servidor SQL

As seguintes plataformas e versões de banco de dados do SQL Server são compatíveis:

Nota

O conector depende do SQL Server Change Tracking, disponível a partir do SQL Server 2008. As versões anteriores não são compatíveis com esse recurso e são incompatíveis com o conector.

Requisitos do Openflow

  • O tamanho do tempo de execução deve ser pelo menos médio. Use um tempo de execução maior ao replicar grandes volumes de dados, especialmente quando o tamanho das linhas for grande.

  • O conector não oferece suporte a tempos de execução do Openflow de vários nós. Configure o tempo de execução para esse conector com Min nodes e Max nodes definidos como 1.

Limitações

  • Não é possível executar vários conectores do mesmo tipo em uma única instância de tempo de execução.

  • O conector apenas oferece suporte à autenticação de nome de usuário e senha com o SQL Server.

  • O conector replica apenas tabelas com tipos de dados compatíveis com o Snowflake. Para obter uma lista desses tipos de dados, consulte Resumo dos tipos de dados.

  • O conector replica apenas tabelas de banco de dados que contêm chaves primárias.

  • O conector não atualiza os registros existentes no banco de dados Snowflake quando uma nova coluna NOT NULL com um valor padrão é adicionada a um dos bancos de dados de origem.

  • O conector não atualiza os registros existentes no banco de dados do Snowflake quando uma nova coluna é adicionada à lista incluída no Column Filter JSON.

  • Depois que você excluir uma coluna de um dos bancos de dados de origem e adicioná-la novamente com o mesmo nome, as exclusões adicionais causarão erros.

  • Depois que você incluir uma coluna em Column Filter JSON e a excluir, as tentativas de inclusão adicionais causarão erros.

  • O conector oferece suporte a alterações no esquema da tabela de origem, com exceção de alterações nas definições de chave primária, na precisão ou na escala de uma coluna numérica.

  • O conector não é compatível com a operação de truncamento de tabela.

  • O conector não oferece suporte à nova adição de uma coluna depois que ela é descartada.

  • O conector não replica valores individuais maiores que 16 MB. Por padrão, o processamento de um valor desse tipo resulta na marcação da tabela associada como falha permanente. Para impedir falhas na tabela, modifique o parâmetro de destino Oversized Value Strategy.

Nota

Você pode ignorar limitações que afetam determinadas colunas da tabela excluindo as colunas específicas da replicação.

Fluxo de trabalho

O fluxo de trabalho a seguir descreve as etapas para configurar e executar o Openflow Connector for SQL Server:

  1. Um administrador de banco de dados do SQL Server executa as seguintes tarefas:

    1. Define as configurações de replicação do servidor SQL e habilita o rastreamento de alterações nos bancos de dados e nas tabelas que estão sendo replicados.

    2. Cria credenciais para o conector.

    3. (Opcional) Fornece o certificado SSL para conexão com a instância do servidor SQL por meio do SSL.

  2. Um administrador de conta Snowflake executa as seguintes tarefas:

    1. Cria um usuário de serviço para o conector, um banco de dados de destino para armazenar os dados replicados e um warehouse para o conector.

    2. Instala o conector.

    3. Especifica os parâmetros necessários para a definição do fluxo do conector.

    4. Executa o fluxo.

O conector faz o seguinte quando executado no Openflow:

  1. Cria os esquemas e as tabelas de destino que correspondem às tabelas de origem configuradas para replicação.

  2. Inicia a replicação de acordo com o ciclo de vida de replicação da tabela.

    Para obter mais informações, consulte Como as tabelas são replicadas.

Como o conector funciona

As seções a seguir descrevem como o conector funciona em vários cenários, incluindo replicação, alterações no esquema e retenção de dados.

Replicação de dados

O conector oferece suporte à replicação de tabelas de vários bancos de dados de servidor SQL em uma única instância do servidor SQL. O conector cria tabelas replicadas de diferentes bancos de dados em esquemas separados no banco de dados Snowflake de destino.

Referencie as tabelas replicadas combinando o nome do banco de dados de origem, o nome do esquema de origem e o nome da tabela no formato a seguir:

<database_name>.<schema_name>.<table_name>

Para cada esquema em cada banco de dados de origem replicado, o conector cria um esquema separado no banco de dados Snowflake de destino. O nome do esquema de destino é uma combinação do nome do banco de dados de origem e do nome do esquema de origem, separados por um caractere de sublinhado (_), conforme mostrado no exemplo a seguir:

<source_database_name>_<source_schema_name>

O conector cria tabelas no esquema de destino com o mesmo nome do nome da tabela de origem, conforme mostrado no exemplo a seguir:

<destination_database>_<destination_schema_name>.<source_table_name>

Como as tabelas são replicadas

O conector replica tabelas nas seguintes áreas de preparação:

  1. Introspecção de esquema: o conector descobre as colunas na tabela de origem, incluindo os nomes e tipos de coluna, e as valida em relação às limitações do Snowflake e do conector. O conector descobre as colunas da tabela de origem, incluindo os nomes e os tipos de colunas, e as valida de acordo com as limitações do Snowflake e do conector. Após a conclusão bem-sucedida desse estágio, o conector cria uma tabela de destino vazia.

  2. Carga de instantâneo: o conector copia todos os dados disponíveis na tabela de origem para a tabela de destino. Se esse estágio falhar, nenhum outro dado será replicado. Se este estágio falhar, o conector deixará de replicar os dados. Após a conclusão bem-sucedida, os dados da tabela de origem estarão disponíveis na tabela de destino.

  3. Carga incremental: o conector rastreia as alterações na tabela de origem e aplica essas alterações à tabela de destino. Esse processo continua até que a tabela seja removida da replicação. A falha nesse estágio interrompe permanentemente a replicação da tabela de origem, até que o problema seja resolvido.

Para obter informações de como ignorar o carregamento de instantâneos e usar o processo de carregamento incremental, consulte Replicação incremental.

Status da replicação da tabela

Falhas temporárias, como erros de conexão, não impedem a replicação das tabelas. Entretanto, falhas permanentes, como tipos de dados incompatíveis, impedem a replicação das tabelas.

Para solucionar problemas de replicação ou verificar se uma tabela foi removida com êxito do fluxo de replicação, consulte o armazenamento de estado de tabela:

  1. Na tela do tempo de execução do Openflow, clique com o botão direito do mouse em um grupo de processadores e escolha Controller Services. Uma tabela que lista os serviços do controlador é exibida.

  2. Localize a linha chamada Table State Store, clique no botão More Três pontos verticais indicando mais opções à direita da linha e escolha View State.

Uma lista de tabelas e os respectivos estados atuais é exibida. Digite na caixa de pesquisa para filtrar a lista por nome da tabela. Os estados possíveis são:

  • NEW: a tabela está agendada para replicação, mas a replicação não foi iniciada.

  • SNAPSHOT_REPLICATION: o conector está copiando os dados existentes. Esse status é exibido até que todos os registros sejam armazenados na tabela de destino.

  • INCREMENTAL_REPLICATION: o conector está replicando as alterações ativamente. Esse status é exibido após o término da replicação do instantâneo e continua a ser exibido indefinidamente até que uma tabela seja removida da replicação ou a replicação falhe.

  • FAILED: a replicação foi interrompida permanentemente devido a um erro.

Nota

A tela de tempo de execução do Openflow não exibe alterações de status de tabela, apenas o status atual da tabela. No entanto, as alterações de status de tabela são registradas em logs quando ocorrem. Procure a seguinte mensagem de log:

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

Se uma falha permanente impedir a replicação da tabela, remova a tabela da replicação. Depois de resolver o problema que causou a falha, você poderá adicionar a tabela de volta à replicação. Para obter mais informações, consulte Reiniciar a replicação da tabela.

Entendendo a retenção de dados

O conector segue uma filosofia de retenção de dados na qual os dados do cliente nunca são excluídos automaticamente. Você mantém total propriedade e controle sobre seus dados replicados, e o conector preserva as informações históricas em vez de removê-las permanentemente.

Essa abordagem tem as seguintes implicações:

  • As linhas excluídas da tabela de origem sofrem exclusão lógica na tabela de destino, em vez de serem removidas fisicamente.

  • As colunas excluídas da tabela de origem são renomeadas na tabela de destino em vez de serem excluídas.

  • As tabelas de registro são mantidas indefinidamente e não são limpas de maneira automática.

Colunas de metadados da tabela de destino

Cada tabela de destino inclui as seguintes colunas de metadados que rastreiam informações de replicação:

Nome da coluna

Tipo

Descrição

_SNOWFLAKE_INSERTED_AT

TIMESTAMP_NTZ

O carimbo de data/hora em que a linha foi inserida originalmente na tabela de destino.

_SNOWFLAKE_UPDATED_AT

TIMESTAMP_NTZ

O carimbo de data/hora em que a linha foi atualizada pela última vez na tabela de destino.

_SNOWFLAKE_DELETED

BOOLEAN

Indica se a linha foi excluída da tabela de origem. Quando true, a linha foi excluída logicamente e não existe mais na origem.

Linhas excluídas logicamente

Quando uma linha é excluída da tabela de origem, o conector não a remove fisicamente da tabela de destino. Em vez disso, a linha é marcada como excluída definindo a coluna de metadados _SNOWFLAKE_DELETED como true.

Essa abordagem permite:

  • Reter dados históricos para fins de auditoria ou conformidade.

  • Consultar registros excluídos quando necessário.

  • Decidir quando e como remover dados permanentemente com base em suas necessidades.

Para consultar apenas linhas ativas (não excluídas), filtre pela coluna _SNOWFLAKE_DELETED:

SELECT * FROM my_table WHERE _SNOWFLAKE_DELETED = FALSE;
Copy

Para consultar linhas excluídas:

SELECT * FROM my_table WHERE _SNOWFLAKE_DELETED = TRUE;
Copy

Colunas removidas

Quando uma coluna é removida da tabela de origem, o conector não remove a coluna correspondente da tabela de destino. Em vez disso, a coluna é renomeada com a adição do sufixo __SNOWFLAKE_DELETED para preservar os valores históricos.

Por exemplo, se uma coluna chamada EMAIL for removida da tabela de origem, ela será renomeada para EMAIL__SNOWFLAKE_DELETED na tabela de destino. As linhas que existiam antes da remoção da coluna mantêm os valores originais, enquanto as linhas adicionadas após a remoção terão NULL nessa coluna.

Você ainda pode consultar os valores históricos da coluna renomeada:

SELECT EMAIL__SNOWFLAKE_DELETED FROM my_table;
Copy

Colunas renomeadas

Devido às limitações nos mecanismos de captura de dados de alteração (change data capture, CDC), o conector não consegue distinguir entre uma coluna sendo renomeada e uma coluna sendo removida seguida da adição de uma nova coluna. Como resultado, quando você renomeia uma coluna na tabela de origem, o conector trata isso como duas operações separadas: remover a coluna original e adicionar uma nova coluna com o novo nome.

Por exemplo, se você renomear uma coluna de A para B na tabela de origem, a tabela de destino conterá:

  • A__SNOWFLAKE_DELETED: contém valores de antes da renomeação. As linhas adicionadas após a renomeação têm NULL nesta coluna.

  • B: contém valores de depois da renomeação. As linhas que existiam antes da renomeação têm NULL nesta coluna.

Consultando colunas renomeadas

Para recuperar dados das colunas original e renomeada como uma única coluna unificada, use uma expressão COALESCE ou CASE:

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

Como alternativa, usando uma expressão CASE:

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

Criando uma exibição para colunas renomeadas

Em vez de modificar manualmente a tabela de destino, você pode criar uma exibição que apresente a coluna renomeada como uma única coluna unificada. Essa abordagem é recomendada porque preserva os dados originais e evita possíveis problemas com a replicação contínua.

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

Importante

Não é recomendável modificar manualmente a estrutura da tabela de destino (como excluir ou renomear colunas), pois isso pode interferir na replicação em andamento e causar inconsistências nos dados.

Tabelas de registro

Durante a replicação incremental, as alterações do banco de dados de origem são gravadas primeiro em tabelas de registro antes de serem mescladas às tabelas de destino. O conector não remove automaticamente os dados das tabelas de registro, pois esses dados podem ser úteis para fins de auditoria, depuração ou reprocessamento.

As tabelas de registro são criadas no mesmo esquema que as respectivas tabelas de destino e seguem esta convenção de nomenclatura:

<TABLE_NAME>_JOURNAL_<timestamp>_<number>

Onde:

  • <TABLE_NAME> é o nome da tabela de destino.

  • <timestamp> é o carimbo de data/hora de criação no formato Unix (segundos desde 1º de janeiro de 1970), garantindo a exclusividade.

  • <number> começa em 1 e incrementa sempre que o esquema da tabela de destino é alterado, seja devido a alterações no esquema da tabela de origem ou a modificações nos filtros de coluna.

Por exemplo, se a tabela de destino for SALES.ORDERS, a tabela de registro poderá ter o nome SALES.ORDERS_JOURNAL_1705320000_1.

Importante

Não exclua tabelas de registro enquanto a replicação estiver em andamento. A remoção de uma tabela de registro ativa pode causar perda de dados ou falhas na replicação. Exclua tabelas de registro somente depois que a tabela de origem correspondente tiver sido completamente removida da replicação.

Gerenciando o armazenamento de tabelas de registro

Se você precisar gerenciar os custos de armazenamento removendo dados de registro antigos, poderá criar uma tarefa do Snowflake que limpe periodicamente as tabelas de registro para tabelas que não estão mais sendo replicadas.

Antes de implementar a limpeza de registros, verifique se:

  • As tabelas de origem correspondentes foram completamente removidas da replicação.

  • Você não precisa mais dos dados de registro para fins de auditoria ou processamento.

Para obter informações sobre como criar e gerenciar tarefas para limpeza automatizada, consulte Introdução às tarefas.

Próximos passos

Consulte Openflow Connector for SQL Server: Mapeamento de dados para entender como o conector mapeia tipos de dados para tipos de dados do Snowflake.

Consulte Configure o Openflow Connector for SQL Server para configurar o conector.