PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como consultar atualizações incrementais do postgres desde um ponto especificado (um carimbo de data/hora ou um ID de transação)?


O que você realmente quer é a decodificação lógica do PostgreSQL 9.4 support, que permite extrair um mudança de fluxo do servidor. Para usá-lo, você precisa de um plug-in de decodificação lógica que transforme o fluxo de mudança no servidor em algo que seu aplicativo possa consumir. Há um número em desenvolvimento, mas ainda é muito cedo.

Como você observou em um comentário que está usando o AWS RDS, neste momento você está sem sorte, pois o RDS no momento da redação não oferece nenhum plug-in de decodificação e você precisaria de privilégios de superusuário para instalá-los.

Você não pode usar xmin e xmax para cópia incremental completa, porque você não pode fazer leituras sujas no PostgreSQL, então você não pode ver se uma tupla foi DELETE d. Para usar IDs de transação, você precisa evitar VACUUM de remover linhas "mortas", ou seja, linhas que nenhuma transação atual ainda precisa executar corretamente. Você também precisa ser capaz de fazer leituras sujas. Nenhum deles tem soluções fáceis no PostgreSQL.

Se você tiver tabelas somente para inserção (ou você faz inserções e atualizações, nunca exclui e nunca altera a chave primária de uma linha), então você pode usar a transação xmin. Você terá que lidar com transaction-id wraparound verificando pg_database.datfrozenxid e pg_class.relfrozenxid para a relação de interesse. Consulte o código-fonte e os comentários no código para obter detalhes. VACUUM e a falta de leituras sujas não é um problema se você nunca excluir uma entrada, pois não precisa ver as linhas "desaparecidas".

Use decodificação lógica em 9.4+, se possível. Para versões mais antigas, se você precisar de replicação completa, precisará acumular uma fila de alterações com gatilhos.

Se você pode proibir exclusões e alterações de chave primária completamente, você pode usar xmin para encontrar linhas alteradas, contanto que você tome cuidado para garantir que não haja delete s executado, ou qualquer update s que alteram a primary key s.