Kalle_B: Meine Backup-Lösung ist falsch

Hallöle,

für ein Programmsystem mit 73 Programmen und 11 Tabellen ist eine Entscheidung zu treffen, wie die Datensicherung zu erfolgen hat. Das wiederum kann erhebliche Programmierarbeit nach sich ziehen.

Systembeschreibung

Es gibt einen Stammserver im Web, auf den ich Dateien (Programme, Grafiken usw.) per FTP lade und auf dem der Kunde arbeitet. Das heißt, hier liegt auch die aktuelle Datenbank.

Dann gibt es drei Backup-Server. Einer im Web, auf dem bei Ausfall des Stammservers weitergearbeitet werden kann. Ein USB-Stick mit XAMPP bei mir und einer beim Kunden, sodass sogar bei Ausfall der Internet- Verbindung ein Notbetrieb erfolgen kann.

Jetzige Backup-Lösung

Vor Kurzem habe ich ein automatisches Update programmiert. Das heißt, ein Webserver holt sich neue und veränderte Dateien (Programme, Grafiken usw.) sowie neue und veränderte Datensätze vom Stammserver. Der anfragende Server holt sich zunächst eine Liste mit Dateinamen und deren Datum sowie Tabellennamen und deren höchsten last_modified. Dann vergleicht er mit seinem eigenen Bestand und fordert an, was er braucht. Im Fall der Tabellen solche Sätze, die seit seinem eigenen last_modified verändert oder dazugekommen sind.

Dieses Prozedere wird ausgelöst durch den ersten Benutzer am Tag, der sich auf einem Backup-Server anmeldet. Die nächste Anmeldung könnte auch nach einigen Wochen erfolgen, Änderungen sind also "ewig" aufzubewahren.

Problematik: Dateien und Datensätze, die auf dem Stammserver gelöscht werden, bleiben auf den Backup- Servern bestehen. Das ist nicht nur überflüssig, sondern falsch. Gelöschte Daten dürfen natürlich nicht wieder "aufleben".

Fragestellung

Nun ist also die Frage, ob ein Backup jedesmal sämtliche Daten holt, also auch unveränderte bei jedem Backup wieder. Das wäre vom Programmieraufwand wünschenswert, das Ergebnis sehr elegant, weil ohne "Dateileichen". Allerdings vom Datenfluss aufwändig und damit zeitraubend.

Oder gelöschte Datensätze bleiben in der Datenbank und bekommen eine Löschkennung. Dann sind sie einmalig beim Backup dabei und ersetzen ihren "aktiven" Zwilling auf den Backup- Servern. Nicht elegant, denn so ein System wird immer dicker, es läßt sich nicht "verschlanken". Aber die Datenübertragung pro Backup ist deutlich kleiner.

Bei 73 Programmen müsste jede Abfrage um das Feld Löschkennung erweitert werden ***schauder***, es sind sehr komplizierte SQLs dabei. Das wird mit Sicherheit Fehler geben. Und das im Echtbetrieb.

Und alle INSERTS müssten die Möglichkeit bieten, einen "toten" Datensatz wiederzubeleben, denn UNIQUE KEYS würden sonst Datensätze abweisen. Also vor jedem INSERT prüfen, ob der Satz vielleicht doch schon da ist ***schauder-schauder***

Tja, jetzt die Frage: Gibt es einen dritten Weg, an den ich nicht gedacht habe?

Lieben Gruß, Kalle

  1. mir kommt da gerade die Idee, sämtliche IDs der vorhandenen, gültigen Datensätze (PRIMARY KEY) sortiert mitzuschicken. Der Backup- Server könnte vergleichen und solche Sätze löschen, zu denen keine ID geschickt wurde.

    ID  Feld1  Feld2  ...
    --  -----  -----  -----
    01  Feld1  Feld2  ...
    03
    04  Feld1  Feld2  ...

    Sagt dem Backup-Server: ID 02 gibt's nicht mehr und ID 03 hat sich nicht verändert.

    Kalle

    1. mir kommt da gerade die Idee, sämtliche IDs der vorhandenen, gültigen Datensätze (PRIMARY KEY) sortiert mitzuschicken. Der Backup- Server könnte vergleichen und solche Sätze löschen, zu denen keine ID geschickt wurde.

      ID  Feld1  Feld2  ...
      --  -----  -----  -----
      01  Feld1  Feld2  ...
      03
      04  Feld1  Feld2  ...

      Sagt dem Backup-Server: ID 02 gibt's nicht mehr und ID 03 hat sich nicht verändert.

      Kalle

  2. Hallo

    Tja, jetzt die Frage: Gibt es einen dritten Weg, an den ich nicht gedacht habe?

    Replikation für das DBMS, rsync für die Dateien.

    Freundliche Grüße

    Vinzenz

    1. Hello,

      Tja, jetzt die Frage: Gibt es einen dritten Weg, an den ich nicht gedacht habe?

      Replikation für das DBMS, rsync für die Dateien.

      Dieser Weg ist auf einem real existenten Host bei einem "normalen" Anwender nicht praktikabel.
      Es dauert viel zu lange.

      Da auch zwischen den Files und der DB Beziehungen bestehen, muss der gesamte Block während der Sicherung gegen Veränderung geschützt werden.

      Das wäre auch ein Grund, Bilder und Dokumente _in_ der Datenbank zu speichern.

      Praktikabel für kleinen Geldbeutel ist mMn daher nur:

      System während der Schwachlastzeit gegen Login sichern.
      Server herunterfahren (Buffer flushen nicht vergessen, sollte es einer nicht automatisch können)
      gesamten zu sichernden Datenbestand in eine andere Partition kopieren.
      Server wieder hochfahren
      Login enable.

      Dann kann in Ruhe die Kopie eingepackt werden z.B. mit tar.gz und zum Download oder sonstiger Verschickung bereitgehalten werden.

      Die Offtime kann man so am besten reduzieren (bei meinen Systemen sind es meistens nur 3 Minuten)

      Professionellere Alternativen kosten hingegen ein "Schweinegeld"

      Ein harzliches Glückauf

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hello,

        Tja, jetzt die Frage: Gibt es einen dritten Weg, an den ich nicht gedacht habe?

        Replikation für das DBMS, rsync für die Dateien.

        Dieser Weg ist auf einem real existenten Host bei einem "normalen" Anwender nicht praktikabel.
        Es dauert viel zu lange.

        Replikation und rsync hätte ich auch vorgschlagen, die "Programmierung"§ hätte sich auf das erstellen der entsprechenden Jobs bezogen. Wenn man einen zu jedem Zeitpunk "gleichen" Stand einer primären und einer Backup DB haben will kommt man um eine Replikationsmöglichkeit die das DBMS mitbringen sollte nicht herum.
        Rsync dauert beim einlesen recht lange, das stimmt, ich muss mir aber keinen Kopf wegen einem script zerbrechen das so praktisch schon erfunden wurde...
        eine andere möglichkeit für die dateien wäre folgende: leider fehlt mir aktuell der fachbegriff, es gibt aber dienste die das filesystem überwachen können und bei bedarf einen abgleich per script/ftp etc. auslösen können, also auf Ereignisse im Dateisystem reagieren. Damit wäre das Filesystem auch replikationsartig auf einem ziemlich identischem ;) stand
        solche lösungen gibt es für hausgemachtes loadbalancing, der user lädt per ftp auf den server und im hintergrund findet der abgleich zum notfallserver statt...

        Odium

        1. Hello, Odium,

          ... und im hintergrund findet der abgleich zum notfallserver statt...

          Im Falle der USB- Sticks ist "der" (einer?) Notfallserver nicht am Netz.

          Kalle

  3. Hi,

    Tja, jetzt die Frage: Gibt es einen dritten Weg, an den ich nicht gedacht habe?

    das Löschen in einer eigenen Tabelle eintragen - ID und Datum sollten reichen für die Backup-Abfrage.

    Oder eine generell andere Lösung - ebenfalls mit einer eigenen Tabelle: hier alle Änderungen komplett eintragen. Beim Backup braucht dann nur noch diese Tabelle ausgelesen werden.

    Die Zugriffe und erfolgreichen Backups sollten protokolliert und die nicht mehr benötigten Tabelleneinträge gelöscht werden.

    freundliche Grüße
    Ingo

    1. Hi,

      bei einem Server handhabe ich das so:
      Nachts (darf kein Zugriff auf Mysql erfolgen) erzeugt ein Cronjob eine MysqlTabellen-Kopie(also MYD MYI frm opt usw...) und wandelt sie in eine zip.Datei um. Ab und zu(könnte man natürlich auch automatisieren) lade ich die dann runter und speise(einfach ins Verzeichnis Data vom MYSQL) sie im lokalen Xampp ein, fertig.

      Hans

      1. Hi, Hans,

        ... und speise(einfach ins Verzeichnis Data vom MYSQL) sie im lokalen Xampp ein, fertig.

        Daran habe ich einen kurzen Moment auch gedacht. Aber kann ich sicher sein, dass das Verzeichnis Data vom MYSQL identisch ist ...

        Stammserver:
        -- phpMyAdmin SQL Dump
        -- version 2.9.1.1-Debian-3
        -- http://www.phpmyadmin.net

        --
        -- Host: localhost
        -- Erstellungszeit: 22. Mai 2008 um 13:41
        -- Server Version: 5.0.32
        -- PHP-Version: 5.2.0-8+etch3
        --
        -- Datenbank: tm3
        --
        Backup-Server im Web:
        -- phpMyAdmin SQL Dump
        -- version
        -- http://www.phpmyadmin.net
        --
        -- Host: xx.xxx.xx.xx
        -- Erstellungszeit: 22. Mai 2008 um 13:42
        -- Server Version: 5.0.27
        -- PHP-Version: 5.2.4
        --
        -- Datenbank: usrdb\_osmer\_de\_2
        --
        und Windows?
        Wäre zu schön, um wahr zu sein.
        Kalle
        1. ... und speise(einfach ins Verzeichnis Data vom MYSQL) sie im lokalen Xampp ein, fertig.

          Daran habe ich einen kurzen Moment auch gedacht. Aber kann ich sicher sein, dass das Verzeichnis Data vom MYSQL identisch ist ...

          Ob DATA identisch ist? Was meinst du damit? Es geht hauptsächlich um die Tabellen-Dateien. Probiere es einfach mal aus, eine schnellere und angenehmere Möglichkeit kann es nicht geben. Es existiert nur ein winzig kleiner Haken, es sollte in dem Moment kein Mysql-Zugriff erfolgen, thoretisch könnte das der DB schaden. Daher am besten kurz die Seite offline setzen.

          Hans