Romanticus
Grünschnabel
Hallo,
ich habe folgende Situation:
eine produktive Datenbank und eine Datenbank, die als Datewarehouse (DW) dient. Beides sind MySql 5.x DBs mit der MyISAM-Engine. Die Daten werden einmal pro woche aus der produktiven Datenbank ins DW exportiert. Es gibt aber Tabellen, die relativ groß sind (> 500.000 Zeilen), bei denen sich aber relativ selten was ändert. Da die Änderungen aber sehr wichtig sind, müssen sie auf jeden Fall schnellstmöglich im DW auftauchen. Folgende Möglichkeiten sehe ich zur Lösung:
1. Die Tabelle wird jedes Mal komplett neu ins DW übertragen. Nachteil - es kann passieren, dass wegen 100 geänderten Datensätzen mehr als 500.000 übertragen werden, was sehr teuer ist.
2. Ich lege in der operativen Datenbank eine zusätzliche Tabelle (update_log), die die Änderungen protokollieren soll. Die Tabelle, die auf Änderungen überwacht werden soll, bekommt einen ONINSERT- und einen ONUPDATE-Trigger, die den Wert updated in der Tabelle update_log für den betroffenen Datensatz auf 1 setzt. Nachdem die Daten ins DW übertragen wurden, rufe ich eine Prozedur, die alle updated-Werte wieder zurücksetzt.
Nachteil dieser Methode ist, dass ich mehr Daten in der operativen Datenbank habe. Zweitens besteht die Gefahr, dass Inkonsistenzen entstehen, da der Extraktions-Prozess zu lange dauert um die betroffenen Tabellen für diese Zeit zu locken.
Was denkt Ihr, wie man dieses Problem am elegantesten lösen könnte?
Gruß,
Romanticus
ich habe folgende Situation:
eine produktive Datenbank und eine Datenbank, die als Datewarehouse (DW) dient. Beides sind MySql 5.x DBs mit der MyISAM-Engine. Die Daten werden einmal pro woche aus der produktiven Datenbank ins DW exportiert. Es gibt aber Tabellen, die relativ groß sind (> 500.000 Zeilen), bei denen sich aber relativ selten was ändert. Da die Änderungen aber sehr wichtig sind, müssen sie auf jeden Fall schnellstmöglich im DW auftauchen. Folgende Möglichkeiten sehe ich zur Lösung:
1. Die Tabelle wird jedes Mal komplett neu ins DW übertragen. Nachteil - es kann passieren, dass wegen 100 geänderten Datensätzen mehr als 500.000 übertragen werden, was sehr teuer ist.
2. Ich lege in der operativen Datenbank eine zusätzliche Tabelle (update_log), die die Änderungen protokollieren soll. Die Tabelle, die auf Änderungen überwacht werden soll, bekommt einen ONINSERT- und einen ONUPDATE-Trigger, die den Wert updated in der Tabelle update_log für den betroffenen Datensatz auf 1 setzt. Nachdem die Daten ins DW übertragen wurden, rufe ich eine Prozedur, die alle updated-Werte wieder zurücksetzt.
Nachteil dieser Methode ist, dass ich mehr Daten in der operativen Datenbank habe. Zweitens besteht die Gefahr, dass Inkonsistenzen entstehen, da der Extraktions-Prozess zu lange dauert um die betroffenen Tabellen für diese Zeit zu locken.
Was denkt Ihr, wie man dieses Problem am elegantesten lösen könnte?
Gruß,
Romanticus