Strategie di sync tra database

cdtux

Utente Èlite
1,722
764
CPU
I7 3770
Scheda Madre
Asrock Z77 Extreme 4
Hard Disk
Samsung 850 pro 250GB
RAM
Corsair Vengeance LP 16GB
Scheda Video
EVGA GTX670 SC
Monitor
Dell U2412M
Alimentatore
Corsair TX850M
Case
Corsair Graphite 760T
Sistema Operativo
Debian / Kali Linux / Win
Devo creare uno script per sincronizzare i dati di due database eterogenei sia per tecnologie (MSSQL e Postgress) che per struttura delle tabelle/dati.
Mi trovo ad avere un db "master" (MSSQL) sul quale ho accesso in sola lettura (non posso "toccarlo" in alcun modo) e un db "slave" (Postgress) che invece posso implementare a mio piacimento.
Sul db master i vari dati che mi interessano sono divisi tra n tabelle (che ovviamente non hanno timestamp!!! :cav:), sul db slave invece le tabelle sono state unificate e sono stati inseriti dei nuovi fields che mi servono.

Per mantenere in sync i dati pensavo di utilizzare gli hash.
In soldoni, calcolo l'hash (item per item) dei dati del master ogni X minuti/ore, lo confronto con l'hash precedente salvato in una tabella (del tipo: id + old_hash + new_hash + timestamp) e in caso aggiorno i dati.
Anche se non mi sembra un metodo molto efficente, le performance non dovrebbero essere un problema visto che la quantità degli item non è grandissima (sono circa 10k items e se ne aggiungono circa 1k/anno).

Ci sono altre strategie/metodi che potrei utilizzare per sincronizzare i dati dei due db??
 

Ibernato

Utente Èlite
4,013
1,808
Sistema Operativo
Windows 10 Pro
Devo creare uno script per sincronizzare i dati di due database eterogenei sia per tecnologie (MSSQL e Postgress) che per struttura delle tabelle/dati.
Mi trovo ad avere un db "master" (MSSQL) sul quale ho accesso in sola lettura (non posso "toccarlo" in alcun modo) e un db "slave" (Postgress) che invece posso implementare a mio piacimento.
Sul db master i vari dati che mi interessano sono divisi tra n tabelle (che ovviamente non hanno timestamp!!! :cav:), sul db slave invece le tabelle sono state unificate e sono stati inseriti dei nuovi fields che mi servono.

Per mantenere in sync i dati pensavo di utilizzare gli hash.
In soldoni, calcolo l'hash (item per item) dei dati del master ogni X minuti/ore, lo confronto con l'hash precedente salvato in una tabella (del tipo: id + old_hash + new_hash + timestamp) e in caso aggiorno i dati.
Anche se non mi sembra un metodo molto efficente, le performance non dovrebbero essere un problema visto che la quantità degli item non è grandissima (sono circa 10k items e se ne aggiungono circa 1k/anno).

Ci sono altre strategie/metodi che potrei utilizzare per sincronizzare i dati dei due db??
Stanno sullo stesso server i DB? I dati li modifichi solo da pannello DB o tramite qualche pagina?
 

cdtux

Utente Èlite
1,722
764
CPU
I7 3770
Scheda Madre
Asrock Z77 Extreme 4
Hard Disk
Samsung 850 pro 250GB
RAM
Corsair Vengeance LP 16GB
Scheda Video
EVGA GTX670 SC
Monitor
Dell U2412M
Alimentatore
Corsair TX850M
Case
Corsair Graphite 760T
Sistema Operativo
Debian / Kali Linux / Win
Sono entrambi sulla stessa macchina fisica: MSSQL su una VM win e Postgress su docker (linux)

EDIT: lo slave è il db di una api sviluppata con flask, quindi lo script di sync sarà scritto in python

EDIT2: il master è il db di un gestionale, quindi ha una sua GUI
 

icox

Utente Attivo
388
169
Hai guardato se il gestionale in questione ha qualche funzione di export o se ha qualche api pubblica? Chiedo perche' a volte espongono funzioni del genere e magari riesci a ricavarti anche il timestamp del dato (potrebbe essere salvato altrove ad uso "interno" del gestionale).

Se non c'e' verso di parlare col gestionale ed il master non puoi maneggiarlo credo che la tua soluzione sia la piu' sensata.
 
  • Mi piace
Reactions: cdtux

cdtux

Utente Èlite
1,722
764
CPU
I7 3770
Scheda Madre
Asrock Z77 Extreme 4
Hard Disk
Samsung 850 pro 250GB
RAM
Corsair Vengeance LP 16GB
Scheda Video
EVGA GTX670 SC
Monitor
Dell U2412M
Alimentatore
Corsair TX850M
Case
Corsair Graphite 760T
Sistema Operativo
Debian / Kali Linux / Win
Hai guardato se il gestionale in questione ha qualche funzione di export o se ha qualche api pubblica? Chiedo perche' a volte espongono funzioni del genere e magari riesci a ricavarti anche il timestamp del dato (potrebbe essere salvato altrove ad uso "interno" del gestionale).

Se non c'e' verso di parlare col gestionale ed il master non puoi maneggiarlo credo che la tua soluzione sia la piu' sensata.
Api pubbliche non le ha.
Per funzioni di export cosa intendi?? tipo dump del db??

Diciamo poi che il master non vorrei maneggiarlo a prescindere per evitare rogne con eventuali update del software gestionale.. già il db è incasinato di suo :cav:
Comunque, teoricamente, potrei anche creare un superuser per avere il totale controllo del db.

Hai provato a usare questo gestionale?
Ci do un'occhiata.. Grazie
 

icox

Utente Attivo
388
169
Per funzioni di export cosa intendi?? tipo dump del db??
Si, un dump o un export in un formato X che avra' scelto chi ha realizzato il tutto. Era piu' che altro un'idea per vedere se saltavano fuori dei timestamp o altri indici, in modo da non dover ogni volta calcolare un hash per verificare se una determinata tupla esiste gia' nella tabella di destinazione (se ho ben inteso quello che vuoi fare).
 
  • Mi piace
Reactions: cdtux

cdtux

Utente Èlite
1,722
764
CPU
I7 3770
Scheda Madre
Asrock Z77 Extreme 4
Hard Disk
Samsung 850 pro 250GB
RAM
Corsair Vengeance LP 16GB
Scheda Video
EVGA GTX670 SC
Monitor
Dell U2412M
Alimentatore
Corsair TX850M
Case
Corsair Graphite 760T
Sistema Operativo
Debian / Kali Linux / Win
Purtroppo il dump del db non è di aiuto (in tutto il db non c'è un campo datetime|time|date nemmeno a pagarlo oro, ad esempio le date sono tutte varchar!!! :cav: ).

Penso procederò come ho descritto nel primo post.. vediamo come va..

:brindiamo::thanks:
 

Entra

oppure Accedi utilizzando

Discussioni Simili