Sobre a Openflow Connector for PostgreSQL¶
Nota
O conector está sujeito aos Termos do conector Snowflake.
Este tópico descreve os conceitos básicos do Openflow Connector for PostgreSQL, seu fluxo de trabalho e suas limitações.
Sobre Openflow Connector for PostgreSQL¶
O Openflow Connector for PostgreSQL conecta uma instância do banco de dados PostgreSQL ao Snowflake e replica dados de tabelas selecionadas quase em tempo real ou de acordo com o cronograma. O conector também cria um registro de todas as alterações de dados, disponível ao longo do estado atual das tabelas replicadas.
Casos de uso¶
Use esse conector se quiser fazer o seguinte:
Replicação CDC de dados PostgreSQL com o Snowflake para geração de relatórios abrangentes e centralizados.
Versões PostgreSQL compatíveis¶
As versões do PostgreSQL a seguir têm suporte.
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
|
|---|---|---|---|---|---|---|---|---|
Sim |
Sim |
Sim |
Sim |
Sim |
Sim |
Sim |
Sim |
|
Sim |
Sim |
Sim |
Sim |
Sim |
Sim |
Sim |
Sim |
|
Sim |
Sim |
Sim |
Sim |
Sim |
Sim |
Sim |
||
Sim |
Sim |
Sim |
Sim |
Sim |
Sim |
Sim |
||
Sim |
Sim |
Sim |
Sim |
Sim |
Sim |
Sim |
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¶
O conector é compatível com o PostgreSQL versão 11 ou posterior.
O conector é compatível apenas com a autenticação de nome de usuário e senha com PostgreSQL.
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.
O conector não replica tabelas com dados que excedam as limitações de tipo do Snowflake. Uma exceção a essa regra são colunas do tipo de dados de data e hora que contêm valores fora do intervalo. Para obter mais informações, consulte Suporte para valores fora do intervalo.
O conector exige que cada tabela replicada tenha uma chave primária e que a identidade da réplica da tabela seja a mesma da chave primária.
O conector oferece suporte a alterações no esquema da tabela de origem, com exceção da alteração das definições de chave primária, da precisão ou da escala de uma coluna numérica.
O conector não oferece suporte à nova adição de uma coluna depois que ela é descartada.
Nota
As limitações que afetam determinadas colunas da tabela podem ser contornadas com a exclusão dessas colunas específicas da replicação.
Fluxo de trabalho¶
Um administrador de banco de dados define as configurações de replicação PostgreSQL, cria uma publicação e credenciais para o conector. Opcionalmente, eles entregam o certificado SSL.
Um administrador de conta Snowflake executa as seguintes tarefas:
Cria um usuário de serviço para o conector, um warehouse para o conector e um banco de dados de destino para o qual replicar.
Instala o conector.
Especifica os parâmetros necessários para o modelo de fluxo.
Executa o fluxo. O conector realiza as seguintes tarefas quando executado no Openflow:
Cria um esquema para tabelas de diários.
Cria os esquemas e as tabelas de destino que correspondem às tabelas de origem configuradas para replicação.
Inicia a replicação seguindo o ciclo de vida de replicação de tabela.
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.
Como as tabelas são replicadas¶
Introspecção de esquema: o conector descobre as colunas na tabela de origem, seus nomes, tipos e, em seguida, irá validá-las de acordo com as limitações do Snowflake e do conector. As falhas de validação fazem com que esse estágio falhe, e o ciclo se complete. Após a conclusão bem-sucedida da introspecção de esquema, o conector cria uma tabela de destino vazia.
Carga de instantâneo: o conector copia todos os dados disponíveis na tabela de origem para a tabela de destino. A falha nesse estágio encerra o ciclo, e nenhum outro dado é replicado. Após a conclusão bem-sucedida, todo o conjunto de dados da tabela de origem estará disponível na tabela de destino.
Carga incremental: o conector continua rastreando as alterações na tabela de origem e copiando-as para a tabela de destino. Isso 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.
Nota
Este conector pode ser configurado para iniciar imediatamente a replicação de alterações incrementais para tabelas recém-adicionadas, ignorando a fase de carregamento de instantâneos. Essa opção costuma ser útil ao reinstalar o conector em uma conta em que já existem dados replicados e você deseja continuar a replicação sem precisar criar novos instantâneos das tabelas.
Para obter detalhes sobre como ignorar o carregamento de instantâneos e usar o processo de carregamento incremental, consulte Replicação incremental.
Importante
Falhas temporárias, como erros de conexão, não impedem a replicação das tabelas. Falhas permanentes, como tipos de dados incompatíveis, impedem a replicação das tabelas. Se uma falha permanente impedir a replicação de uma tabela, remova-a da lista de tabelas replicadas. Depois de resolver o problema que causou a falha, você pode adicionar a tabela de volta à lista de tabelas replicadas.
Suporte ao valor TOASTed¶
O conector oferece suporte à replicação de tabelas com valores TOAST para colunas dos tipos: array, bytea, json, jsonb, text, varchar, xml.
Sempre que o conector encontra um valor TOASTed no fluxo CDC, ele substitui um espaço reservado padrão de __previous_value_unchanged, formatado para o tipo de coluna fornecido e o armazena na tabela de diário. A consulta MERGE então contabiliza os valores de espaço reservado, de modo que a tabela de destino contenha sempre o último valor não relacionado a TOASTed.
Suporte para valores fora do intervalo¶
O conector oferece suporte à replicação de tabelas com colunas dos tipos date, timestamp e timestamptz que contêm valores fora do intervalo. Se o conector encontrar um valor fora do intervalo no fluxo CDC, ele substitui um espaço reservado padrão com base no tipo da coluna.
Tipo de coluna |
Valor do espaço reservado |
|---|---|
|
|
|
|
|
|
Nota
Os valores -Infinity e Infinity também são substituídos pelos respectivos espaços reservados para todos os três tipos.
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:
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.
Localize a linha chamada Table State Store, clique no botão More
à 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>
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 descartadas da tabela de origem são renomeadas na tabela de destino em vez de serem descartadas.
As tabelas de diário 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 |
|---|---|---|
|
TIMESTAMP_NTZ |
O carimbo de data/hora em que a linha foi inserida originalmente na tabela de destino. |
|
TIMESTAMP_NTZ |
O carimbo de data/hora em que a linha foi atualizada pela última vez na tabela de destino. |
|
BOOLEAN |
Indica se a linha foi excluída da tabela de origem. Quando |
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;
Para consultar linhas excluídas:
SELECT * FROM my_table WHERE _SNOWFLAKE_DELETED = TRUE;
Colunas descartadas¶
Quando uma coluna é descartada da tabela de origem, o conector não descarta a coluna correspondente da tabela de destino. Em vez disso, a coluna é renomeada anexando o sufixo __SNOWFLAKE_DELETED para preservar os valores históricos.
Por exemplo, se uma coluna chamada EMAIL for descartada da tabela de origem, ela será renomeada para EMAIL__SNOWFLAKE_DELETED na tabela de destino. As linhas que existiam antes do descarte da coluna mantêm os valores originais, enquanto as linhas adicionadas após o descarte terão NULL nessa coluna.
Você ainda pode consultar os valores históricos da coluna renomeada:
SELECT EMAIL__SNOWFLAKE_DELETED FROM my_table;
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 renomeada e uma coluna descartada 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: descartar 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êmNULLnesta coluna.B: contém valores de depois da renomeação. As linhas que existiam antes da renomeação têmNULLnesta 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;
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;
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;
Importante
Não é recomendável modificar manualmente a estrutura da tabela de destino (como descartar ou renomear colunas), pois isso pode interferir na replicação em andamento e causar inconsistências nos dados.
Tabelas de diário¶
Durante a replicação incremental, as alterações do banco de dados de origem são gravadas primeiro em tabelas de diário antes de serem mescladas às tabelas de destino. O conector não remove automaticamente os dados das tabelas de diário, pois esses dados podem ser úteis para fins de auditoria, depuração ou reprocessamento.
As tabelas de diário 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 de época 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 diário poderá ter o nome SALES.ORDERS_JOURNAL_1705320000_1.
Importante
Não descarte tabelas de diário enquanto a replicação estiver em andamento. A remoção de uma tabela de diário ativa pode causar perda de dados ou falhas na replicação. Descarte tabelas de diário somente depois que a tabela de origem correspondente tiver sido completamente removida da replicação.
Gerenciando o armazenamento de tabelas de diário¶
Se você precisar gerenciar os custos de armazenamento removendo dados de diário antigos, poderá criar uma tarefa do Snowflake que limpe periodicamente as tabelas de diário para tabelas que não estão mais sendo replicadas.
Antes de implementar a limpeza de diários, verifique se:
As tabelas de origem correspondentes foram completamente removidas da replicação.
Você não precisa mais dos dados de diário 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 PostgreSQL: Mapeamento de dados para entender como o conector mapeia tipos de dados para tipos de dados do Snowflake. Consulte Configure o Openflow Connector for PostgreSQL para configurar o conector.