Ripristina il backup con modifiche recenti (non incluse nel backup)

0

Per un'applicazione web mi è stato chiesto di progettare una strategia di backup. Al momento ci sono backup completi orari (database e file). Alla luce del GDPR , e poiché è proprio il modo in cui dovrebbe funzionare, è necessario ripristinare le recenti modifiche che si verificano tra due backup anche.

Ad esempio:

14:00 Create backup
14:05 John deletes his account
14:34 Server crashes
14:44 Backup restored - User 1 is not deleted

Credo che questo non sia raro e dovrebbe esserci una sorta di best practice. Ad esempio un secondo database su un secondo server che memorizza le modifiche incrementali dall'ultimo backup e le ripristina dopo un arresto anomalo. Queste modifiche incrementali possono essere eliminate dopo ogni backup riuscito. Ma a mio parere è piuttosto complicato.

Mentre scrivevo questo ho pensato che forse la replica fosse la strada da percorrere qui?

O c'è un altro metodo a cui non ho pensato?

    
posta Tim 27.03.2018 - 16:02
fonte

2 risposte

2

Soluzione 1: utilizza le funzionalità del database

Molti sistemi di database utilizzano i registri per garantire la coerenza transazionale. Osservando la documentazione del DBMS è possibile trovare un modo per utilizzare tali registri ai fini del ripristino.

Ad esempio, su un RDBMS Oracle si sono chiamati così redo logs , che può essere archiviato automaticamente e che puoi mettere su un altro disco. In caso di arresto anomalo, il ripristino verrà eseguito da un backup, quindi verranno applicati i registri di ripristino fino all'ultima modifica completata. Verranno perse solo le transazioni incomplete (ciò significa che dovrai informare l'utente della corretta cancellazione del suo account dopo il commit riuscito, e non prima).

Crea un registro eventi

L'altra alternativa consiste nel gestire un tipo di registro di ripristino a livello di applicazione.

L'idea è basata su una coda di eventi: la tua app non scrive direttamente sul db ma genera eventi / comandi. Questi eventi vengono registrati prima di essere elaborati.

In caso di arresto anomalo, ripristina il db, recupera l'ultimo evento che è stato elaborato al suo interno, quindi ripristina semplicemente gli eventi successivi nel log sulla coda degli eventi e consente al processore degli eventi di rielaborarli.

Sembra facile, ma richiede che la tua app sia progettata per funzionare in modo asincrono con l'evento e il feedback dell'evento (cioè un altro tipo di evento).

    
risposta data 27.03.2018 - 19:20
fonte
0

Come accennato, i database seri hanno un tat di redo-log che può essere eseguito parzialmente o completamente, come desiderato.

Nota, tuttavia, che a seconda della natura dell'azione che stai tentando di saltare, il tuo database potrebbe essere danneggiato dal processo:
Immagina Joe che cancelli un record [questa è l'azione che vuoi recuperare]. Nelle seguenti transazioni, l'inesistenza di questo record ha conseguenze potenziali, ad esempio quando le istruzioni selezionate non lo contengono, le somme sono calcolate in modo diverso, la logica aziendale prende decisioni diverse, ecc., Con conseguenti ulteriori conseguenze. Ti troverai presto nei guai.

Forse un nuovo utente ha scelto "John" come username in quanto gratuito. Hai intenzione di respingere questo retroattivamente perché hai recuperato il vecchio "John"? Cosa succede se il nuovo 'John' ha ordinato materiale e lo ha già pagato?

A seconda della natura dell'azione da annullare, questo potrebbe o potrebbe non essere un problema, ma devi sempre considerarlo attentamente.

    
risposta data 28.03.2018 - 06:13
fonte

Leggi altre domande sui tag