Kalle_B: Gleiche Tabelle in zwei Datenbanken: Gleich oder ungleich?

Hallöle,

ich habe zwei Server mit den gleichen MySQL-Tabellen. Dient zur Sicherung, falls ein Server ausfällt.

Gearbeitet wird auf dem ORIGINAL (vom Admin umschaltbar), die Tabellen müssen ab und zu per Mausklick zur KOPIE übertragen werden.

Nun hätte ich gerne eine Anzeige pro Tabelle, ob ORIGINAL und KOPIE übereinstimmen. Die Anzahl der Datensätze zeige ich zwar an, aber bei gleicher Satzzahl könnte der Inhalt des ORIGINALS durch Datenänderung abweichen.

Ich möchte wissen, welche Tabelle ich zum Kopieren anklicken muss.

Gibt es so etwas wie eine Quersumme über alle Datenfelder einer Tabelle?

Lieben Gruß, Kalle

  1. Gibt es so etwas wie eine Quersumme über alle Datenfelder einer Tabelle?

    Der letzte ändernde Zugriff täte es auch. Wird so etwas bei der Tabelle gespeichert? Wenn ja, wie überträgt man es auf die KOPIE?

    ORIGINAL in Dresden: MySQL Version 3.23.58
    KOPIE    in Berlin:  MySQL Version 4.1.9-log

    Kalle

    1. Hallo

      Der letzte ändernde Zugriff täte es auch. Wird so etwas bei der Tabelle gespeichert?

      kann sein.

      Wenn ja, wie überträgt man es auf die KOPIE?

      Sorge selbst dafür, indem Du jeder Tabelle eine Spalte mit dem Zeitpunkt der letzten Änderung eines Datensatzes hinzufügst.

      Freundliche Grüße

      Vinzenz

      1. yo,

        Wenn ja, wie überträgt man es auf die KOPIE?

        Sorge selbst dafür, indem Du jeder Tabelle eine Spalte mit dem Zeitpunkt der letzten Änderung eines Datensatzes hinzufügst.

        eine fürchterliche falle, da der zeitpunkt zwar beim einfügen oder ändern eines neues datensatzes gespeichert wird, aber wird der datensatz gelöscht, kann kein rückschluss mehr auf den zeitpunkt gezogen werden. und was ist, wenn zwei zeitpunkte gleich sind, zum beispiel bei einem update befehl ?

        je nachdem, wie stark das system ausgelastet ist, würde ich das über einen FULL OUTER JOIN der beiden Tabellen machen und nach NULL abfragen oder aber nach dem MINUS operator, falls mysql das kann.

        Ilja

        1. eine fürchterliche falle, da der zeitpunkt zwar beim einfügen oder ändern eines neues datensatzes gespeichert wird, aber wird der datensatz gelöscht, kann kein rückschluss mehr auf den zeitpunkt gezogen werden.

          Ja, stimmt, also fällt die Spalte zeit_aen = time() (in einigen Tabellen vorhanden und gepflegt AUSSER bei Direkteingriffen mit phpmyadmin) für meine Zwecke aus.

          und was ist, wenn zwei zeitpunkte gleich sind, zum beispiel bei einem update befehl ?

          Ist unkritisch, max(zeit_aen) könnte ich ja immer noch abfragen.

          je nachdem, wie stark das system ausgelastet ist, würde ich das über einen FULL OUTER JOIN der beiden Tabellen machen und nach NULL abfragen oder aber nach dem MINUS operator, falls mysql das kann.

          Hmm, muss ich mich einlesen. NULL Ahnung.

          Danke für deine Hinweise.

          Kalle

          1. je nachdem, wie stark das system ausgelastet ist, würde ich das über einen FULL OUTER JOIN der beiden Tabellen machen und nach NULL abfragen oder aber nach dem MINUS operator, falls mysql das kann.

            Kann MySQL überhaupt zwei Tabellen auf verschiedenen Servern in EINER Abfrage bedienen? Da zweifel ich doch mal sicherheitshalber.

            Kalle

          2. yo,

            Ist unkritisch, max(zeit_aen) könnte ich ja immer noch abfragen.

            ganz und gar nicht, am besten nicht mehr über max(zeit) nachdenken. das kann nur schief gehen. stelll dir vor, die ein tabelle hat zwei datensätze mit der max(zeit und die ander nur eine. damit sind die tabellen unterschiedlich und die max(zeiten) gleich. besser ist wirklich eine 100% lösung und sich nicht auf wahrscheinlickeiten verlassen.

            im allgemeinen bieten heutige dbms schon funktionen, mit den man daten aus verschiedenen datenbanken und server abgleichen kann, bzw. gehen sogar expliziet auf ausfallsicherheit ein. das beste ist, du schmökerst mal ein wenig im mysl handbuch dies bezüglich, ich selbst liege des öfteren gerade bei mysql daneben.

            Ilja

            1. Ist unkritisch, max(zeit_aen) könnte ich ja immer noch abfragen.

              ganz und gar nicht, am besten nicht mehr über max(zeit) nachdenken. das kann nur schief gehen. stelll dir vor, die ein tabelle hat zwei datensätze mit der max(zeit und die ander nur eine. damit sind die tabellen unterschiedlich und die max(zeiten) gleich.

              In meinem Falle (eigentlich) nicht. Die ORIGINAL-Tabelle kann entweder neuer sein als die KOPIE (wenn geändert) oder gleich (wenn seit dem letzten Kopiervorgang kein änderndern Zugriff im ORIGINAL war).
              Dein Spezialfall bezieht sich auf zwei Datenbanken, die zeitgleich von verschiedenen Benutzern verändert werden?

              im allgemeinen bieten heutige dbms schon funktionen, mit den man daten aus verschiedenen datenbanken und server abgleichen kann, bzw. gehen sogar expliziet auf ausfallsicherheit ein. das beste ist, du schmökerst mal ein wenig im mysl handbuch dies bezüglich, ich selbst liege des öfteren gerade bei mysql daneben.

              Ich hatte vor 6 Jahren auch mit ORACLE zu tun. Das ist eine andere, professionelle Welt. Hier bei MySQL muss ich mich mit alten Versionen rumschlagen, die wesentliche Funktionen nicht beherrschen. Oder kannst du das Löschen einer Person sperren, wenn noch Beziehungen vorhanden sind? Okay, Stored Procedures soll es inzwischen geben, aber nicht bei meinem Provider.

              Ich komme mir vor wie in Indien: MySQL ist meine fußgetriebene Rikscha, mit der ich Transporte eines 12-Tonners lösen muss.

              Da muss man halt die Fracht in kleine Teile zerlegen und mehrmals fahren. Ein Spielzeug eben. Aber charmant für NULL- Kosten.

              Kalle

              1. yo,

                Dein Spezialfall bezieht sich auf zwei Datenbanken, die zeitgleich von verschiedenen Benutzern verändert werden?

                nein, stell dir mal vor, zwei datensätze werden durch einen update befehl verändert und haben den gleichen zeitwert. danach erfolgt eine sicherung des orginals, so weit so gut. nun löscht du einen der beiden datensätze in der orginal-datenbank. somit unterscheiden sich kopie und orginal, aber dein max(zeit) wird das nicht mehr ermitteln. sicherlich konstruiert, aber es geht ja darum, es wasserdicht zu machen.

                Ich hatte vor 6 Jahren auch mit ORACLE zu tun. Das ist eine andere, professionelle Welt.

                naja, also ich finde mysql eigentlich gar nicht schlecht, schnell installiert und einsatzbereit. und da gibt es auch so einige funktionen, da sollte sich Oracle mal eine scheibe abschneiden. LIMIT wäre so ein beispiel, wirklich sehr nützlich. und professionell würde ich eine person bezeichnen, die mit den vorhandenen mitteln, die probleme so gut es geht löst.

                Hier bei MySQL muss ich mich mit alten Versionen rumschlagen, die wesentliche Funktionen nicht beherrschen.

                das ist natürlich ärgerlich, zumal mysql in den heutigen versionen doch mehr kann.

                Oder kannst du das Löschen einer Person sperren, wenn noch Beziehungen vorhanden sind? Okay, Stored Procedures soll es inzwischen geben, aber nicht bei meinem Provider.

                das geht in den bereich fremdschlüssel und in den neuen versionen beherscht das mysql meiner meinung nach auch.

                kopf hoch, das wird schon. bei den größeren problemen lernt man auch immer mehr und wenn es den klappt, steigert es das selbstbewußtsein ungemein.

                Ilja

              2. echo $begrüßung;

                [...] kannst du das Löschen einer Person sperren, wenn noch Beziehungen vorhanden sind?

                MySQL hat nicht nur eine Storage-Engine. Die meist verwendete dürfte MyISAM sein und ist für Wald- und Wiesen-Anwendungen gedacht. In ihr sind Features wie Transactions und Foreign Key Constraints nicht enthalten, dafür ist sie aber ziemlich schnell. Braucht man diese Dinge sollte man sich die InnoDB-Storage-Engine ansehen. Foreign Keys beispielsweise gibt es bereits seit Version 3.23.
                Es lassen sich innerhalb einer Datenbank auch Tabellen mit unterschiedlichen Storage-Engines anlegen und Abfragen übergreifend ausführen.

                echo "$verabschiedung $name";

        2. Hallo Ilja,

          je nachdem, wie stark das system ausgelastet ist, würde ich das über einen FULL OUTER JOIN der beiden Tabellen machen und nach NULL abfragen oder aber nach dem MINUS operator, falls mysql das kann.

          MySQL kann derzeit noch _keinen_ FULL OUTER JOIN :-(
          Siehe Einführung Joins.

          Freundliche Grüße

          Vinzenz

          1. yo,

            MySQL kann derzeit noch _keinen_ FULL OUTER JOIN :-(

            da lobe ich mir doch immer ein dbms wie oracle, obwohl ich mysql wegen der einfachheit sehr schätze. aber manchmal vermisst man doch etwas.

            wie auch immer, falls mysql den MINUS operator kennt, der löst es doch sehr elegant oder aber man macht eben zwei OUTER JOINS, das sollte dann wirklich gehen, bzw man könnte einen OUTER JOIN machen und die anzahl der datensätze in einer unterabfrage noch abgleichen.

            Ilja

    2. hi,

      Der letzte ändernde Zugriff täte es auch.

      MAX(letzter Änderungszeitpunkt der einzelnen Datensätze) könnte es beispielsweise sein.

      Wird so etwas bei der Tabelle gespeichert?

      Nicht, dass ich wüsste.
      Aber es beim Ändern eines Datensatzes an diesem mit abzulegen, wäre ja kein allzu großes Problem.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. MySQL speichert seine Datenbanken (bzw. Tabellen) als Files im Verzeichnis 'data/_datenbankname_/_tabellenname_.MYD'.

    Mach doch nen CRC Check.. isser bei beiden gleich, hat sich nichts verändert..

    1. Mach doch nen CRC Check..

      Könnte schiefgehen wenn die Server die Daten anders in der Datei ablegen.. viel mir gerade noch ein..
      aber Dateigröße müsste funktionieren, wenn du vorher die Tabelle optimieren lässt..