PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come eseguire query sugli aggiornamenti incrementali di Postgres da un punto specificato (un timestamp o un ID transazione)?

Quello che vuoi veramente è la decodifica logica di PostgreSQL 9.4 supporto, che ti consente di estrarre un flusso di modifiche dal server. Per usarlo è necessario un plug-in di decodifica logica che trasformi il flusso di modifiche sul server in qualcosa che la tua app può consumare. Ci sono un certo numero in fase di sviluppo, ma è ancora abbastanza presto.

Dato che hai notato in un commento che stai utilizzando AWS RDS, in questo momento sei sfortunato, poiché RDS al momento della scrittura non offre alcun plug-in di decodifica e avresti bisogno dei privilegi di superutente per installarli.

Non puoi usare xmin e xmax per la copia incrementale completa, perché non puoi eseguire letture sporche in PostgreSQL, quindi non puoi vedere se una tupla è stata DELETE d. Per utilizzare gli ID transazione devi impedire il VACUUM dalla rimozione di righe "morte", ovvero righe che nessuna transazione corrente deve ancora eseguire correttamente. Dovresti anche essere in grado di eseguire letture sporche. Nessuno di questi ha soluzioni facili in PostgreSQL.

Se hai tabelle di solo inserimento (oppure fai inserimenti e aggiornamenti, non elimini mai e non cambi mai la chiave primaria di una riga), quindi puoi eventualmente utilizzare la transazione xmin. Dovrai occuparti di transaction-id wraparound controllando pg_database.datfrozenxid e pg_class.relfrozenxid per la relazione di interesse. Per i dettagli, vedere il codice sorgente e i commenti nel codice. VACUUM e la mancanza di letture sporche non è un problema se non elimini mai una voce, poiché non è necessario visualizzare le righe "scomparse".

Usa la decodifica logica in 9.4+ se possibile. Per le versioni precedenti, se è necessaria una replica completa, è necessario accumulare una coda di modifiche con trigger.

Se puoi vietare completamente le eliminazioni e le modifiche alla chiave primaria, puoi utilizzare xmin per trovare le righe modificate, a patto di assicurarsi che non siano presenti delete s eseguito o qualsiasi update s che cambiano primary key s.