Linuchs: Update Tabellenstruktur

Hallo,

kann man bei mysql die Tabellenstruktur ohne Datenverlust automatisch updaten?

Auf dem Haupt-Server habe ich Tabellenfelder eingefügt. Wenn ich nun die neuen Programme, die diese Felder ansprechen, auf dem Ersatz-Server laufen lasse, sind diese Felder in der Datenbank des Ersatzservers unbekannt.

Muss ich die Felder von Hand hineeinfrickeln oder gibt's da was?

Gruß, Linuchs

  1. Tach!

    kann man bei mysql die Tabellenstruktur ohne Datenverlust automatisch updaten?

    Üblicherweise gibt es keien Datenverlust beim Hinzufügen von Feldern. Auch beim Ändern nicht, wenn die Daten zu den neuen Eigenschaften kompatibel sind. Was aber verstehst du unter "automatisch" konkret?

    Auf dem Haupt-Server habe ich Tabellenfelder eingefügt. Wenn ich nun die neuen Programme, die diese Felder ansprechen, auf dem Ersatz-Server laufen lasse, sind diese Felder in der Datenbank des Ersatzservers unbekannt. Muss ich die Felder von Hand hineeinfrickeln oder gibt's da was?

    Wenn du sie zu Fuß in den einen Server gebracht hast und dir dabei nicht die verwendeten Statements notiert hast, dann musst du das zu Fuß auch in anderen Servern nachziehen. Allenfalls gibt es noch irgendwelche Tools, die Differenzen aufspüren und Delta-Statements erzeugen - ist mir aber keins namentlich bekannt.

    dedlfix.

    1. Was aber verstehst du unter "automatisch" konkret?

      DB1.adressen:

      vorname varchar(25)
      nachname varchar (25)
      funktion varchar (25)
      tel varchar (25)
      mobil varchar (25)

      DB2.adressen:

      vorname varchar(25)
      nachname varchar (25)
      tel varchar (25)

      Irgendwas in phpmyadmin wie "add_unknown_fields( DB1.adressen, DB2.adressen )

      Linuchs

      1. Liebe Mitdenker,
        liebe Wissende,
        liebe Neugierige,

        ja!

        Was aber verstehst du unter "automatisch" konkret?

        Irgendwas in phpmyadmin wie "add_unknown_fields( DB1.adressen, DB2.adressen )

        Kann ich Dir morgen gerne ein kleines Tool in PHP basteln.
        Ist gleich mal eine praktische Anwendung für meine Funktion.

        Wieviele Tables sind denn betroffen?

        Im Prinzip ist es manuell auch schnell gemacht. Der create-code steht ja zur Verfügung und mit Heidi oder PMA auf beiden Datenbanken ist das ruck-zuck zusammenkopiert.

        Ich plädiere immer für neue Tabelle bauen, Daten per insert from select rüberschieben, sichtkontrolle, alte Tabelle umbenennen, neue umbenennen.

        Da darf dann auch mal "was schief gehen ;-)

        Spirituelle Grüße
        Euer Robert

        --
        Möge der Forumsgeist wiederbelebt werden!
  2. Hallo,

    kann man bei mysql die Tabellenstruktur ohne Datenverlust automatisch updaten?

    Auf dem Haupt-Server habe ich Tabellenfelder eingefügt. Wenn ich nun die neuen Programme, die diese Felder ansprechen, auf dem Ersatz-Server laufen lasse, sind diese Felder in der Datenbank des Ersatzservers unbekannt.

    Ganz wichtig ist es in solchen Fällen (hinzufügen von Feldern), dass ein Defaultwert gesetzt ist. Genau der greift nämlich immer dann, wenn der Legacy-Code die neuen Felder gar nicht kennt, insbesondere beim Insert.

    Also: alter table... Default nicht vergessen und danach den Code in aller Ruhe anpassen.

    Muss ich die Felder von Hand hineeinfrickeln oder gibt's da was?

    Handarbeit ;)

    Schöne Grüße.

  3. Liebe Mitdenker,
    liebe Wissende,
    liebe Neugierige,

    ja!

    kann man bei mysql die Tabellenstruktur ohne Datenverlust automatisch updaten?

    Auf dem Haupt-Server habe ich Tabellenfelder eingefügt. Wenn ich nun die neuen Programme, die diese Felder ansprechen, auf dem Ersatz-Server laufen lasse, sind diese Felder in der Datenbank des Ersatzservers unbekannt.

    Muss ich die Felder von Hand hineeinfrickeln oder gibt's da was?

    Ich vermute, dass Du Spalten meinst?
    Felder gibt es allerdings auch, als "Subtable" bei den Spaltentypen SET und ENUM.

    Dein Stichwort heißt vermutlich ALTER TABLE
    http://dev.mysql.com/doc/refman/5.5/en/alter-table.html

    Das Hinzufügen von Spalten ist unproblematisch, solange dadurch nicht die maximale Spaltenzahl oder Zeilenbreite (Satzgröße) oder sogar die maximale Größe der Tabelle überschritten wird.

    Die Änderung einer Spaltendefinition kann zu Problemen führen:

    • Spaltentyp: Umwandlung vom alten zum neuen Typ nicht immer möglich
                    Daten des alten Typs müssen in den neuen reinpassen
    • Index:      Breite beachten. Max. relevante Zeichenzahl 1000, kann
                    Bei breiten Spalten zur "Explosion" der Indextabelle
                    Führen
    • unique Idx: Bei doppelten -> Problem
    • autoincrement: Bei doppelten -> Problem

    usw.
    Man sollte immer vorher eine Kopie der Tabelle anlegen ;-)

    Die vorhandene Spaltendefinition kann man übrigens wunderbar aus dem Information_Schema abfragen. Habe ich mir gerade eine Funktion gebaut dafür.

    Mann kann evtl. mit einem Union Select daraus eine gemeinsame Tabellenstruktur erzeugen aus zwei vorhandenen. Zumindest kann man es über den Umweg der API (z.B. PHP)

    Spirituelle Grüße
    Euer Robert

    --
    Möge der Forumsgeist wiederbelebt werden!
    1. Hallo Robert,

      Ich vermute, dass Du Spalten meinst?

      Ja.

      Das Hinzufügen von Spalten ist unproblematisch, ...

      Naja, nicht so ganz. In meinem Fall habe ich zwei Domains example.com und beispiel.de bei zwei getrennten Providern, damit bei Ausfall des Einen mit dem Anderen weitergearbeitet werden kann.

      Auf example.com wird gearbeitet, beispiel.de ist der backup-Server, der sich - von Hand angestoßen - Dateien und neue Datenbank-Zeilen von example.com holt. Dazu wird per Browser auf beispiel.de ein PHP Programm gestartet. Es "unterhält" sich also mit seinem Partner-PHP-Programme auf beispiel.de, die beiden vergleichen Daten und example.com sendet Zeilen, die beispiel.de noch nicht hat (inkrementelle Sicherung (schnell)). Ausserdem wird bei beispiel.de auch gelöscht, was example.com nicht (mehr) hat.

      Nun müssen natürlich auch die bei example.com neu eingefügten Spalten bei beispiel.de "nachgepflegt" werden. Das ist meine Problematik. Bisher habe ich phpmyadmin bei beispiel.de aufgerufen und die Spalten von Hand eingefügt. Das kann aber der Kunde nicht, also versagt die Datensicherung, wenn nur eine neue Spalte dazugekommen ist.

      Die vorhandene Spaltendefinition kann man übrigens wunderbar aus dem Information_Schema abfragen. Habe ich mir gerade eine Funktion gebaut dafür.

      Gut, dann muss das PHP-Programm auf beispiel.de "seine" Spalten pro Tabelle ermitteln und sich vom PHP-Programm auf example.com deren Spalten geben lassen, vergleichen, und fehlende einfügen. Das Prinzip ist klar, ich hatte aber gehofft, auf eine bequemere Weise ans Ziel zu kommen, ohne tief in die Struktur der beiden DB eintauchen zu müssen. Auch die Reihenfolge der Spalten sollte identisch sein.

      Es gibt doch dieses wunderbare SQL-Kommando "update insert if not exist", das leider nur fehlende Zeilen, aber keine fehlenden Spalten einfügen kann. So ein Kommando wäre toll.

      Eine Alternative wäre vielleicht, bei Struktur-Unterschieden die betroffene Tabelle insgesamt neu aufzubauen. Bei kleinen Tabellen kein Problem, aber ... Hier mal die Übersicht der Datenbank:

      Datenbank

      Gruß Linuchs

      1. falsch:

        Dazu wird per Browser auf beispiel.de ein PHP Programm gestartet. Es "unterhält" sich also mit seinem Partner-PHP-Programme auf beispiel.de, ...

        richtig:

        Dazu wird per Browser auf beispiel.de ein PHP Programm gestartet. Es "unterhält" sich also mit seinem Partner-PHP-Programme auf example.com,

      2. Liebe Mitdenker,
        liebe Wissende,
        liebe Neugierige,

        ja!

        Es gibt doch dieses wunderbare SQL-Kommando "update insert if not exist", das leider nur fehlende Zeilen, aber keine fehlenden Spalten einfügen kann. So ein Kommando wäre toll.

        Ein Beispiel dazu hatte ich Dir aber verlinkt, wie ein "alter table from select" aufgebaut werden kann. Die benutzen dazu zwar noch eine separate Strukturtabelle, aber das geht inzwischen auch direkt mit dem information_schema.

        Guck Dir mal das Ergebnis von

        sql="
        select COLUMN\_NAME, COLUMN\_DEFAULT, IS\_NULLABLE,
        DATA\_TYPE, CHARACTER\_MAXIMUM\_LENGTH, COLUMN\_KEY,
        NUMERIC\_PRECISION, NUMERIC\_SCALE, CHARACTER\_SET\_NAME,
        COLLATION\_NAME, COLUMN\_TYPE, COLUMN\_COMMENT,
        EXTRA, PRIVILEGES
        from information\_schema.columns where table\_name = '" .
        mysqli_real_escape_string($con, $table) . "'";

        an. Kannst ja auch erstmal ein paar Spalten weglassen zum Üben :-)

        Und dann hatten wir die letzten Tage hier einen Thread mit Subselects. Der passt auch zum Thema.
        https://forum.selfhtml.org/?t=219129&m=1512030

        Spirituelle Grüße
        Euer Robert

        --
        Möge der Forumsgeist wiederbelebt werden!
      3. Hakuna matata!

        Auf example.com wird gearbeitet, beispiel.de ist der backup-Server, der sich - von Hand angestoßen - Dateien und neue Datenbank-Zeilen von example.com holt. Dazu wird per Browser auf beispiel.de ein PHP Programm gestartet. Es "unterhält" sich also mit seinem Partner-PHP-Programme auf beispiel.de, die beiden vergleichen Daten und example.com sendet Zeilen, die beispiel.de noch nicht hat (inkrementelle Sicherung (schnell)). Ausserdem wird bei beispiel.de auch gelöscht, was example.com nicht (mehr) hat.

        Hast du dir dabei auch Gedanken über die Integrität der Daten gemacht? Werden zum Beispiel auch die aktuellen Zählstände von Autoincrement-Schlüsseln synchronisert? Sind die einzelnen Insert- und Delete-Operationen überhaupt atomar?

        Hast du mal in Erwägung gezogen, die Synchronisierung von MySQL selbst machen zu lassen, statt über einen PHP-Mittelsmann? Stichwort Replikation.

        --
        “All right, then, I'll go to hell.” – Huck Finn
        1. Hallo

          Hast du mal in Erwägung gezogen, die Synchronisierung von MySQL selbst machen zu lassen, statt über einen PHP-Mittelsmann? Stichwort Replikation.

          Das ist grundsätzlich der richtige Weg. Es ist jedoch, zumindest bei Shared Hosting, fraglich, ob das über Servergrenzen hinweg funktioniert. Zumal, wenn die Server auch noch bei verschiedenen Anbietern betrieben werden. Bei den meisten hostern wird ja eine Verbindung zum SQL-Server nur von „localhost“ akzeptiert.

          Tschö, Auge

          --
          Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
          Terry Pratchett, "Wachen! Wachen!"
          ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
          Veranstaltungsdatenbank Vdb 0.3
          1. Liebe Mitdenker,
            liebe Wissende,
            liebe Neugierige,

            ja!

            Hallo

            Hast du mal in Erwägung gezogen, die Synchronisierung von MySQL selbst machen zu lassen, statt über einen PHP-Mittelsmann? Stichwort Replikation.

            Das ist grundsätzlich der richtige Weg. Es ist jedoch, zumindest bei Shared Hosting, fraglich, ob das über Servergrenzen hinweg funktioniert. Zumal, wenn die Server auch noch bei verschiedenen Anbietern betrieben werden. Bei den meisten hostern wird ja eine Verbindung zum SQL-Server nur von „localhost“ akzeptiert.

            Bei Strato z.B.. Da sagt einem zumindest niemand, wie man es in dieser dämlichen Plesk-Oberfläche hinbekommen könnte. Ich habe es auch noch nicht herausgefunden.

            Bei 1&1 haben wir es für dieverse Kunden eingerichtet - in beiden Richtungen. Etliche haben ihre Datenschätze im eigenen Haus auf einem SQL-Server und beim Hoster nur einen Auszug in der DB, der ohnehin ständig public ist...

            Ich habe bei meinem Hoster das Loch gerade geöffnet, aber die Nutzerrechte des "Port-3306-Users" extrem eingeschränkt. Der darf nur an zwei Datenbanken ran und da auch nur ein paar Grundfunktionen benutzen.

            Ich suche noch nach einer SSH-Lösung für MySQL (oder ähnlich), hatte aber bisher keine Zeit, mich wirklich darum zu kümmern. Die letzten drei Tage habe ich erstmal den Mailserver für unsere wichtigtsen Domains wieder zum Laufen gebracht, bzw. bin noch dabei. Das von Debian (Wheezy) angebotene postfixadmin ist ganz nett, passt aber nicht automatisch zu Dovecot. Jedenfalls wird da auch eine MySQL-Datenbank benutzt und auf die will ich dann später direkt zugreifen können, um Usern der Plattformen auch Mailkonten einrichten zu können.

            Spirituelle Grüße
            Euer Robert

            --
            Möge der Forumsgeist wiederbelebt werden!
  4. Liebe Mitdenker,
    liebe Wissende,
    liebe Neugierige,

    ja!

    kann man bei mysql die Tabellenstruktur ohne Datenverlust automatisch updaten?

    Siehe auch http://stackoverflow.com/questions/14805179/alter-table-using-sub-select

    Spirituelle Grüße
    Euer Robert

    --
    Möge der Forumsgeist wiederbelebt werden!