Datenbanken abgleichen

budking

Mitglied
Hallo zusammen.


Mein Problem:
Ich habe eine lokale sql-Datenbank die mindestens zweimal täglich mit einer mysql-Datenbank im Internet abgeglichen werden muss. Veränderungen werden nur auf der sql-Datenbank vorgenommen, sprich es ist nur der Weg sql-DB --> mysql-DB nötig.

Zur Zeit lese ich die sql-DB mit einem php Skript aus und übertrage die Daten dann mit hilfe eines Formulars ins Internet, wo die Daten wieder mit Hilfe eines php-Skriptes in die mysql-Datenbank eingelesen werden. Die Tabellen der mysql-DB lösche ich dabei jedes mal und lese sie komplett neu ein.

Da die sql-DB aber immer größer wird, müssen inzwischen jedesmal fast 5mb übertragen werden müssen, was mit einem DSL-Light Anschluss (mehr gibts hier leider nicht) recht viel Zeit in Anspruch nimmt.

Gibt es eine Möglichkeit mit Hilfe von php festzustellen wann eine sql-Tabelle zum letzten mal geändert wurde, damit ich nur die Tabellen hochladen muss, die sich auch wirklich geändert haben?

Vielleicht könnt Ihr mir ja auch noch ein paar weitere Denkanstöße geben, wie ich das Datenvolumen minimieren kann.

Vielen Dank für eure Hilfe.

Viele Grüße
Markus
 
am schlauesten wäre es doch einen Timestamp mit in deine lokale DB einzubauen. Daran könntest du dann sehen wann eine Tabelle zuletzt geändert wurde.
Würde eben bedeuten du fügst in deine lokale DB eine neue Zwischentabelle ein, die alle Tabellennamen und einen Timestamp enthält. Jedesmal wenn du an einer tabelle etwas änderst, aktualisierst du den Timestamp. Beim auslesen der lokalen Datei nimmst du eben nur die Tabellen die seit deinem letzten auslesen (Timestamps merken) verändert wurden. Somit müsstest du nicht soviel hochladen ;)
 
Das ist leider nicht möglich, da die lokale Datenbank von einem ERP-System beschrieben wird, auf welches ich keinen Einfluss nehmen kann.

Edit:
Ich bin jetzt am überlegen, ob ich den sql-Profiler im Hintergrund mitlaufen lasse, die ausgeführten querys in einer weiteren Tabelle mitprotokolliere und dann jedesmal beim update nur die aufgezeichneten querys ins Internet übertrage und die Tabelle danach wieder leere.

Das Problem was hierbei entsteht ist, dass ich noch keine Möglichkeit gefunden habe, nur bestimmte Tabellen aufzuzeichnen.
Die lokale Datenbank besteht aus über 500 Tabellen, wovon ich lediglich 22 Tabellen im Internet benötige. Die überflüssigen querys könnte ich zwar vor dem übertragen mit Hilfe von php Filtern, ich weis allerdings nicht wie stark der sql-Profiler die Datenbankperformance beeinflusst.

Also für weiter Tipps wäre ich dankbar.

Viele Grüße
Markus
 
Zuletzt bearbeitet:
budking hat gesagt.:
Das ist leider nicht möglich, da die lokale Datenbank von einem ERP-System beschrieben wird, auf welches ich keinen Einfluss nehmen kann

das hab ich fast befürchtet :)
ok also du willst nun also per php die lokale DB überprüfen und schauen was geändert wurde... hmmm...
ich fürchte fast dazu bietet SQL keine Funktion?! Ich hab eben nochmal mit google gesucht, aber nichts gefunden.
Eine möglichkeit die mir eben noch einfällt: Nimm das letzte Backup der lokalen DB und vergleiche es mit dem eben erstellen Backup. Alle identischen Daten werden herausgenommen und dann pflegst du die neuen daten online ein.
 
OK, das mit dem sql-Profiler funktioniert auch nicht wirklich. Bei den WHERE Bedingungen schreibt er immer etwas von "WHERE Current Of Cursor (und dann eine Nummer)".

Ich kan diese Cursorposition aber nicht nachvollziehen.

Die Datenbankbackups sind inzwischen etwa 1,5Gb groß.
Was ich glaube ich noch nicht gesagt habe, die updates sollen nach Möglichkeit automatisch ausgeführt werden, und mir fällt zur Zeit keine Möglichkeit ein die Backups irgendwie automatisch abzugleichen.
 
budking hat gesagt.:
OK, das mit dem sql-Profiler funktioniert auch nicht wirklich. Bei den WHERE Bedingungen schreibt er immer etwas von "WHERE Current Of Cursor (und dann eine Nummer)".

Ich kan diese Cursorposition aber nicht nachvollziehen.

Die Datenbankbackups sind inzwischen etwa 1,5Gb groß.
Was ich glaube ich noch nicht gesagt habe, die updates sollen nach Möglichkeit automatisch ausgeführt werden, und mir fällt zur Zeit keine Möglichkeit ein die Backups irgendwie automatisch abzugleichen.

hm schreib dir nen .sql parser in Java? ;) der liest die .sql Datei ein, legt alles in Tabellen Objekten ab und vergleicht dann eine .sql Datei mit einer anderen .sql Datei. Er vergleicht alle Tabellen Objekte miteinander und schmeiss identische Einträge raus. Das ganze könntest du automatisch jeden Tag über einen Task starten lassen. Alles ist möglich ;)
 
OK, mir ist gerade aufgefallen, das die Tabellen bereits einen Timestamp enthalten, der jedes mal geändert wird, wenn ein Eintrag geändert wird. Der wurd mir nur in Access nicht angezeigt, weil er binär abgelegt wird.

Ich habe allerdings Probleme mit diesem Timestamp zu arbeiten.

Wenn ich mir zum Beispiel den Ttimstamp einer bestimmten Zeile per Abfrage suche und dann im Umkehrschluss versuche mit diesem Timestamp in einer weiteren Abfrage versuche wieder die selbe Zeile zu finden bekomme ich eine Fehlermeldung.

PHP:
1<?php
2
3include('./includes/rickrowe.php');
4
5$query = "SELECT TIMESTAMP_KEC, NAME1LI FROM KUNDE WHERE KUNR = '600566'";
6$queryexe = odbc_do($connectionstring, $query);
7
8while(odbc_fetch_row($queryexe))
9{
10    $TIMESTAMP_KEC = odbc_result($queryexe, 1);
11}
12
13$query = "SELECT NAME1LI FROM KUNDE WHERE TIMESTAMP_KEC = '$TIMESTAMP_KEC'";
14$queryexe = odbc_do($connectionstring, $query);
15
16while(odbc_fetch_row($queryexe))
17{
18    $NAME1LI = odbc_result($queryexe, 1);
19}
20
21echo $NAME1LI;
22
23?>

Die Fehlermeldung sieht so aus:

Warning: odbc_do(): SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Unclosed quotation mark before the character string ''., SQL state 37000 in SQLExecDirect in c:\www\dokumente\rowe\kenfax\test2.php on line 14

Warning: odbc_fetch_row(): supplied argument is not a valid ODBC result resource in c:\www\dokumente\rowe\kenfax\test2.php on line 16

Vielen Dank für Hilfe.
 
Zuletzt bearbeitet:
OK, habe das Problem behoben. Der Code sieht jetzt wie folgt aus.

PHP:
1<?php
2
3include('./includes/rickrowe.php');
4
5$query = "SELECT cast(TIMESTAMP_KEC as bigint), NAME1LI FROM KUNDE WHERE KUNR = '600566'";
6$queryexe = odbc_do($connectionstring, $query);
7
8while(odbc_fetch_row($queryexe))
9{
10    $TIMESTAMP_KEC = odbc_result($queryexe, 1);
11}
12
13$query = "SELECT NAME1LI FROM KUNDE WHERE cast(TIMESTAMP_KEC as bigint) = '$TIMESTAMP_KEC'";
14$queryexe = odbc_do($connectionstring, $query);
15
16while(odbc_fetch_row($queryexe))
17{
18    $NAME1LI = odbc_result($queryexe, 1);
19}
20
21echo $NAME1LI;
22
23?>
 
Zurück