Ankündigung

Einklappen
Keine Ankündigung bisher.

Falsche Codierung beim Datenbank-Backup mit varbinary Typen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Falsche Codierung beim Datenbank-Backup mit varbinary Typen

    Hallo,
    ich mache meine Backups mit der aktualisierten Form (ereg -> preg_replace) von diesem Script: https://davidwalsh.name/backup-mysql-database-php.
    Das klappte lange sehr gut.
    Es gibt nun aber neue Tabellen, mit AES_ENCRYPT vom Typ varbinary. Diese werden in der Backup-Datei zerstört, es landen dort u-a. das berühmte Fragezeichen in der Raute.

    Ein Backup mit phpMyAdmin klappt, aber mein eigenes eben nicht.

    Vielen Dank für jede Hilfe,
    Uli


  • #2
    Das Script läuft noch auf der mysql_* Erweiterung, das solltest Du gegen MySQLi oder PDO (meine pers. Empfehlung) ändern.
    Dein Problem resultiert aus dem Charset Encoding, das in dem Script offensichtlich nicht berücksichtigt wird.
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Facepalm. Ein so erstelltes Backup wird inkonsistent sein, da in keiner Weise parallel laufende Transationen beachtet werden. Aber hey, MySQL, ...
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        Zitat von Arne Drews Beitrag anzeigen
        Das Script läuft noch auf der mysql_* Erweiterung, das solltest Du gegen MySQLi oder PDO (meine pers. Empfehlung) ändern.
        Dein Problem resultiert aus dem Charset Encoding, das in dem Script offensichtlich nicht berücksichtigt wird.
        Klar, 2008 gab es das alles ja auch noch nicht ...
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Zitat von Arne Drews Beitrag anzeigen
          Das Script läuft noch auf der mysql_* Erweiterung, das solltest Du gegen MySQLi oder PDO (meine pers. Empfehlung) ändern.
          Oh, sorry, das habe ich vergessen zu erwähnen, dass das bei mir auch aktualisiert wurde.

          Zitat von Arne Drews Beitrag anzeigen
          Dein Problem resultiert aus dem Charset Encoding, das in dem Script offensichtlich nicht berücksichtigt wird.
          Richtig, aber genau da weiß ich nicht, wo ich das Encoding einfüge.

          Kommentar


          • #6
            Wenn Du sagst, Du hast mysql_ ebenfalls aktualisiert, solltest Du doch wissen, mit was. Dann stehts in der Doku dazu.
            Competence-Center -> Enjoy the Informatrix
            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

            Kommentar


            • #7
              PDO: https://php-de.github.io/jumpto/pdo/
              Mysqli: https://www.php.net/manual/en/mysqli.set-charset.php

              Kommentar


              • #8
                Ich weiß nicht was Ihr meint. Die Datenbank ist mit utf8mb4_general_ci codiert. Aber da ist ja alles, inklusive phpMyAdmin-Backup alles in ordnung. Es geht um das eigene Backup-Script und meine Frage, wo ich die Codierung einfüge.
                Die relevanten Zeilen sind bei mir:
                Code:
                for($i = 0; $i < $numColumns; $i++){
                    while($row = sql_fetch_row($result,$dbi)){
                        $bufile .= "INSERT INTO $table VALUES(";
                        for($j=0; $j < $numColumns; $j++){
                            $row[$j] = addslashes($row[$j]);
                            $row[$j] = preg_replace("/\n/","\\n",$row[$j]);
                            if (isset($row[$j])) { $bufile .= '"'.$row[$j].'"' ; } else { $bufile .= '""'; }
                            if ($j < ($numColumns-1)) { $bufile.= ','; }
                        }
                        $bufile .= ");\n";
                    }
                }
                $bufile .= "\n\n\n";
                Hier es findet keine Codierung oder "Umwandlung" statt.

                Kommentar


                • #9
                  Zitat von uli123 Beitrag anzeigen
                  Ich weiß nicht was Ihr meint. Die Datenbank ist mit utf8mb4_general_ci codiert.
                  utf8mb4_general_ci ist keine Kodierung, sondern eine Kollation. Das ist was ganz anderes.

                  Zitat von uli123 Beitrag anzeigen
                  Aber da ist ja alles, inklusive phpMyAdmin-Backup alles in ordnung. Es geht um das eigene Backup-Script und meine Frage, wo ich die Codierung einfüge.
                  Die relevanten Zeilen sind bei mir:
                  Code:
                  for($i = 0; $i < $numColumns; $i++){
                  while($row = sql_fetch_row($result,$dbi)){
                  $bufile .= "INSERT INTO $table VALUES(";
                  for($j=0; $j < $numColumns; $j++){
                  $row[$j] = addslashes($row[$j]);
                  $row[$j] = preg_replace("/\n/","\\n",$row[$j]);
                  if (isset($row[$j])) { $bufile .= '"'.$row[$j].'"' ; } else { $bufile .= '""'; }
                  if ($j < ($numColumns-1)) { $bufile.= ','; }
                  }
                  $bufile .= ");\n";
                  }
                  }
                  $bufile .= "\n\n\n";
                  Hier es findet keine Codierung oder "Umwandlung" statt.
                  addslashes() zerstört die übrigens die Daten. Warum verwendest du diese Funktion?

                  Kommentar


                  • #10
                    Tja, weil sie in dem original Code auf https://davidwalsh.name/backup-mysql-database-php verwendt wurde und es funktioniert hat. Ein deaktivieren hat aber auch keine Veränderung gebracht.

                    Kommentar


                    • #11
                      ich wiederhole mich ja ungerne, aber das Script da ist konzeptionell schon für die Tonne. Aber mir auch egal, not my department.
                      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                      Kommentar


                      • #12
                        Zitat von uli123 Beitrag anzeigen
                        Tja, weil sie in dem original Code auf https://davidwalsh.name/backup-mysql-database-php verwendt wurde und es funktioniert hat.
                        Naja, kopier halt keinen Müllcode von irgendwelchen Webseiten. Am besten du entsorgst ihn gleich.

                        Und das "es hat ja funktionert" Argument ist etwa vergleichbar mit "ich bin bis jetzt ohne Sicherheitsgurt gefahren und es ist nix passiert". Du hattest bis jetzt einfach Glück, dass der Müllcode bei dir keine (sichtbaren) Fehler produziert hat. Aber du solltest ihn trotzdem nicht mehr verwenden.

                        Kommentar


                        • #13
                          Ok, danke. Könnt Ihr eine Seite empfehlen, die ein besseres Backup-Script vorstellt?

                          Kommentar


                          • #14
                            Wozu ein Script? Es gibt mysqldump.

                            Kommentar


                            • #15
                              Weil ich optional einige Tabellen überspringen möchte, wenn z.B. bestimmte Detail-Statistiken nicht im Backup benötigt werden.

                              Kommentar

                              Lädt...
                              X