Mysqldump einspielen

@Stephan_Grass schrieb:

Ich habe einen Dump einer frischen Installation unter MariaDB gemacht und die abweichenden CREATE Befehle in meinen MySQL-Dump kopiert.
Bei mir gab es einige Abweichungen im Create-Befehl der Tabellen product_keyword_dictionary und order.

Danach hat es mit dem Import geklappt …

Vielen Dank, so hat’s bei mir auch funktioniert. 

@Plotec schrieb:

Mir geht es um ein automatisches Backup per Cronjob. Das geht meines Wissens nur mit mysqldump, deswegen ja auch dieser Thread. Manuell mit phpmyadmin - ob geeignet oder nicht - funktioniert es ja. Gleichzeitig wird ein Dateibackup erstellt. Ich möchte ein zeitlich syncrones Backup von DB und Dateien

Hast du es lösen können? Wie sieht deine Lösung aus? 

Gar nicht. Ich mache im Moment täglich ein manuelles Backup mit Adminer. Damit funktioniert dann auch eine Restore (auch wieder mit Adminer).

Plotec, welche Versionen verwendest du von mysqldump und mysql? Das Problem bei dir scheint ja mit den virtuellen Spalten zusammen zu hängen - dort gab es mal einen Bug, wie auch kommand oben schreibt, der aber zwischenzeitlich behoben wurde. Vielleicht ist das die Ursache?

mysqldump  Ver 10.16 Distrib 10.1.45-MariaDB, for debian-linux-gnu (x86_64)

Datenbank ist Mysql 8.0.21

 

Wir haben das Problem wieder

Dump von:
Version MySQL: 5.5.5-10.3.24-MariaDB-1:10.3.24+maria~stretch mit PHP-Erweiterung MySQLi
nach 
Version MySQL: 5.7.27-30 mit PHP-Erweiterung MySQLi
einspielen

geht nicht - was kann man machen?

 „The value specified for generated column ‚order_date‘ in table ‚order‘ is not allowed“

Das Problem ist mysqldump aus MariaDB distribution. Besser versucht irgendwie, den Dump mit MySQL zu machen. Z.B. von der Ziel-Maschine aus einen SSH-Tunnel zur Quell-Maschine, und dann mysqldump auf der Zielmaschine ausführen.

Good luck :slight_smile:
Geert

Hallo,

na ja nicht ganz wie weiter oben besteht das Problem ja auch wenn man nur mysql nimmt.

Wir haben auch versucht den Dump mit folgenden optionen zu erstellen. Leider ohne erfolg.

mysqldump --hex-blob xxx -hxxx -u xxx -p’xxx’ > xxx.sql

mysqldump --force --single-transaction --compact xxx -hlocalhost -u xxx -p’xxx’ > xxx.sql

mysql -u’xx’ -p’xx’ -h’xx.mydbserver.com’ usr_p570335_2

 

Heidi SQL ist leider keine Option, gibt es da eine Mac Alternative?

 „The value specified for generated column’order_date’ in table ‚order‘ is not allowed“

Wenn ich das richtig sehe hat das order_date eine Stored  Generated Column was ein feature erst ab  MySQL 5.7 released ist.

Vll hilft die Info weiter. @kommad‍

@kommad schrieb:

Heidi SQL ist leider keine Option, gibt es da eine Mac Alternative?

https://www.sequelpro.com/ 
Thumb-Up 

Die Syntax im Export von Mysql wird in MariaDB nicht unterstützt. Es hilft die entsprechenden 2 Zeilen im Dump anzupassen:

Original (Mysql 5.7+):
tax_status varchar(255) COLLATE utf8mb4_unicode_ci GENERATED ALWAYS AS (json_unquote(json_extract(price,’$.taxStatus’))) VIRTUAL,

Update (MariaDB 10.2.22+):
tax_status varchar(255) GENERATED ALWAYS AS (json_unquote(json_extract(price,’$.taxStatus’))) VIRTUAL,

Wer das nicht will, der muss den Dump mit dem mysqldump Programm aus einer MySQL 5.7.9 (oder neuer) erstellen. Um sicherzugehen, einmal die Version prüfen:

> mysqldump --version
da sollte so etwas in der Art stehen:
< mysqldump  Ver 10.13 Distrib 5.7.33, for Linux (x86_64)

Habe das gerade selbst gemacht und den Dump anschließend in MySQL 5.7.33 ohne den o.s. Fehler importiert.

Hey zusammen, gibt es hierzu mittlerweile eine Lösung?

Habe gerade einen ähnlichen Fall, probiert wurde bisher folgendes:

1.) Dump per externe Maschine: Wir haben uns via SSH Tunnel auf dem System aufgeschaltet, den Dump gefahren und erhalten dennoch die Fehlermeldung von oben.
2.) Wir haben probiert das ganze per Adminer zu exportieren und wieder zu importieren, immer der selbe Effekt.
3.) Wir haben probiert per Sequelpro das ganze zu exportieren und auf dem neuen System zu importieren… selber Effekt.

Mir gehen langsam die Ideen aus… hat hier jemand eine Idee?

The value specified for generated column 'order_date' in table 'order' is not allowed.

@runde8 welche mysqldump Version hast du eingesetzt (mysqldump --version),
und auf welcher Serverversion importierst du den (SHOW VARIABLES LIKE 'version%')?

Hey Ansgar, das aktuelle Live-System hat folgende Infos:

mysqldump  Ver 10.18 Distrib 10.4.17-MariaDB, for debian-linux-gnu (x86_64)

Das neue System hat folgende Infos

mysqldump Ver 10.13 Distrib 5.7.33, for Linux (x86_64)

Also ähnlich wie das bei mir kürzlich war: MariaDB 10.3 => MySQL 5.7.33

Bei mir hat es geholfen die MariaDB-Daten mit dem mysqldump aus MySQL zu erstellen. Diesen Dump konnte ich dann in MySQL fehlerlos einspielen.

Wenn mysqldump/MySQL nicht auf die MariaDB zugreifen kann, könntest du vorher mit einer separaten Shell einen SSH Tunnel aufbauen:

ssh -L 3307:127.0.0.1:3306 -N -C benutzername@mariadb-hostname

seit SW 6.4 hab ich auch das problem und löse es wie folgt:

mysqldump wie immer erstellen

mysqldump -u$MYSQL_USR -p$MYSQL_PASS -h$MYSQL_HOST $MYSQL_DB > backup.sql

mit suchen&ersetzen die spalte verändern

sed -i 's/COLLATE utf8mb4_unicode_ci GENERATED ALWAYS AS/GENERATED ALWAYS AS/g' backup.sql

die spalte per ALTER TABLE hat das problem nicht behoben.
die einstellungen bleiben bestehen.

ALTER TABLE `order` CHANGE `tax_status` `tax_status` VARCHAR(255) GENERATED ALWAYS AS (json_unquote(json_extract(`price`,'$.taxStatus'))) VIRTUAL;
3 Likes

Habe auch das gleiche Problem
‚total_price‘ in table ‚order_delivery_position‘ is not allowed.

Für nen Automatischen Backup habe ich mir mal dieses Script gebaut… Dieses läuft auch auf einigen Demo Instanzen für unsere Shopware Plugins. Ich poste mal nur die entsprechenden Teile:

  1. Backup erstellen:
    public function execute(): void
    {
        if (!file_exists($this->backupDir)) {
            mkdir($this->backupDir, 0777, true);
        }

        $file = $this->backupDir . "backup.sql";

        $db = $this->getDb();

        $cmd = sprintf(
            "mysqldump -u %s -p'%s' --allow-keywords --add-drop-table --complete-insert --quote-names %s > %s",
            $db['user'],
            $db['pass'],
            $db['path'],
            $file
        );
        exec($cmd, $this->output);
    }

    private function getDb(): array
    {
        if (getenv('DATABASE_URL') && $db = parse_url(getenv('DATABASE_URL'))) {
            $db = array_map('rawurldecode', $db);
            $db['path'] = mb_substr($db['path'], 1);
            if (!isset($db['pass'])) {
                $db['pass'] = '';
            }
        } else {
            die('Critical environment variable \'DATABASE_URL\' missing!' . \PHP_EOL);
        }

        if (!isset($db['host'])) {
            $db['host'] = 'localhost';
        }

        return $db;
    }
  1. Backup einspielen / DB credentials aus der .env beziehen:
    public function execute(): void
    {
        $file = $this->backupDir . "backup.sql";

        if (!file_exists($file)) {
            return;
        }

        $db = $this->getDb();

        $cmd = sprintf(
            "mysql -u %s -p'%s' %s < %s",
            $db['user'],
            $db['pass'],
            $db['path'],
            $file
        );
        exec($cmd, $this->output);
    }

Obs nun überall klappt weiß ich nicht, aber vllt. hilfts ja weiter :wink:

1 Like

Danke, ich weiß mit soviel Code aber nichts anzufangen. Muss ich das in einer Datei speichern und extern aufrufen? Muss ich die Platzhalter (user, passs, path) mit den Zugangsdaten füllen? Sorry, kenne mich echt nicht aus.