ih hab letzte Woche ein SQL Backup einer Datenbank mittels dbForge erstellt und wollte es nun auf einem neuen System wieder einspielen.
dbForge schließt den Vorgang nach einigen Minuten fehlerfrei ab und ich kann die DB sehen mit 2 Mio. Einträgen. Wenn ich sie öffne scheint aber kein einziger Eintrag auf.
Im Hintergrund scheint MariaDB die Datenbank zu löschen. Jedesmal wenn ich den Aktualisiert Button klicke, verringern sich die angeblichen Einträge bis schlussendlich 0 dort steht.
Ich hab zwar keine Ahnung von MariaDB, aber ich frage mich wieso man die Datenbankdatei nicht einfach normal kopiert als Backup.
Weil bisher mache ich das mit JEDER Datenbank der letzten 35 Jahre so. Inkl. SQL und hatte noch nie Problem die wieder ans laufen zu bringen.
@TO
Vielleicht hast du die "alte" Datei ja noch in einen andere Backup. Ich würde sie da raus holen und einfach gegen den Mist da ersetzen.
Und schau dir die Datei mal HEX an. Vielleicht erkennst du da ne Logik.
Klingen tut deine Beschreibung so, als wenn das System eine Reorganisation durchführt und dabei alles was es als Schrott sieht löscht. Dazu reicht schon ein falsches Lösch-Bit/Bytes im Datensatz.
ih hab letzte Woche ein SQL Backup einer Datenbank mittels dbForge
erstellt und wollte es nun auf einem neuen System wieder einspielen.
Was für eine Art von Datei erstellt denn dieses Wunderding?
dbForge schließt den Vorgang nach einigen Minuten fehlerfrei ab und ich
kann die DB sehen mit 2 Mio. Einträgen. Wenn ich sie öffne scheint aber
kein einziger Eintrag auf.
Im Hintergrund scheint MariaDB die Datenbank zu löschen. Jedesmal wenn
ich den Aktualisiert Button klicke, verringern sich die angeblichen
Einträge bis schlussendlich 0 dort steht.
Weiß jemand was hier passiert?
Anscheinend etwas sehr, sehr Merkwürdiges.
Wenn Du noch auf die alte Datenbank zugreifen kannst, würde ich Dir zunächst empfehlen, ein Backup mit einem der Programme mysqldump oder mysqlpump zu erzeugen. Beide Programme gehören meines Wissens zu dem Lieferumfang von MySQL, ebenso wie das Programm mysqlimport, mit dem Du Deine Datenbank wiederherstellen kannst. Die Dokumentation zu diesen Programmen findest Du unten verlinkt.
Ansonsten möchte ich Dir freundlich empfehlen, von Ratschlägen unseres Mitforisten "Schlaumaier" Abstand zu halten. Dieser Herr ist leider dafür bekannt, das sein Mitteilungsbedürfnis seine Kenntnisse übersteigt.
Ich hab zwar keine Ahnung von MariaDB, aber ich frage mich wieso man die
Datenbankdatei nicht einfach normal kopiert als Backup.
Weil das Dateiformat häufig geändert wird, so dass die Dateien zu einer anderen Programmversion inkompatibel sind. Auch ein Wechsel des Betriebssystems (Linux/Windows) macht die Datenbank Dateien häufig (nicht immer) unlesbar.
Datenbanken sichert man normalerweise in einem von Menschen und Maschinen lesbarem Textformat. Bei MariaDB sind das SQL Scripte mit CREATE und INSERT Kommandos.
Kann es sein, dass da autocommit aus ist, und am ende des Backup Script kein COMMIT steht?
Oder gibt es eventuell irgend welche foreign keys, die Kaskadierend die zeug löschen, und alle Eintröge hängen mit solchen zusammen, und einer wird gelöscht?
Oder ist vielleicht die SD Karte oder worauf auch immer es gespeichert ist kaputt, und schreibt die Änderungen nicht mehr, sagt es dem OS aber nicht?
Vermutlich gibt es noch mehr mögliche Ursachen.
Datenbanken sichert man normalerweise in einem von Menschen und
Maschinen lesbarem Textformat. Bei MariaDB sind das SQL Scripte mit
CREATE und INSERT Kommandos.
Besser noch: bei MariaDB ist ein Tool namens „mysqldump” dabei, mit dem man seine Datenbanken so sichern kann, dass diese Scripte rausfallen, die man anschließend direkt mittels „mysql“ wieder einlesen kann.
ih hab letzte Woche ein SQL Backup einer Datenbank mittels dbForge
erstellt und wollte es nun auf einem neuen System wieder einspielen.
dbForge? Dieses GUI-Spielzeug? Warum nimmst du nicht mysqldump (bzw. mariadb-dump, wenn du schon auf MariaDB bist)?
dbForge schließt den Vorgang nach einigen Minuten fehlerfrei ab und ich
kann die DB sehen mit 2 Mio. Einträgen. Wenn ich sie öffne scheint aber
kein einziger Eintrag auf.
Bahnhof.
Im Hintergrund scheint MariaDB die Datenbank zu löschen.
Sicher nicht.
Weiß jemand was hier passiert?
Ich weiß ja noch nicht mal, was du gemacht hast. Und erwartest, was passieren soll.
Das ist alles was man für Backup/Restore wissen muß. Zumindest wenn es so eine Winz-DB mit gerade mal 2 mio Rows ist. Das geht auch über das Netz (dann ersparst du dir, das Dumpfile von A nach B zu kopieren).
Ich hab zwar keine Ahnung von MariaDB, aber ich frage mich wieso man die
Datenbankdatei nicht einfach normal kopiert als Backup.
Weil das bei einem laufenden Server nicht geht. Wenn man den Server herunter gefahren hat, dann geht auch das. Allerdings nur mit der gleichen Konfiguration (my.cnf). Und der Zielserver muß die gleiche oder eine neuere Version haben als der Quellserver. Und natürlich für das Einspielen des Backups auch herunter gefahren sein.
Ich hab zwar keine Ahnung von MariaDB, aber ich frage mich wieso man die
Datenbankdatei nicht einfach normal kopiert als Backup.
Weil das Dateiformat häufig geändert wird, so dass die Dateien zu einer
anderen Programmversion inkompatibel sind. Auch ein Wechsel des
Betriebssystems (Linux/Windows) macht die Datenbank Dateien häufig
(nicht immer) unlesbar.
Quatsch mit Soße. Das Datenformat ist betriebssystemunabhängig (auch architekturunabhängig). Und spezifisch bei MariaDB kann ein neuerer Server immer auch die Daten einen älteren Servers lesen. MySQL garantiert das nur für das nächste Major-Release.
Kann es sein, dass da autocommit aus ist, und am ende des Backup Script
kein COMMIT steht?
Auch albern. Wenn das Backup-Programm Transaktionen ins Backupfile schreibt, dann ist es auch dafür verantwortlich, die mit COMMIT abzuschließen. Aber standardmäßig werden multi-row INSERT Statements ins Backupfile geschrieben. Zumindest von mysqldump. Die sind auf allen Storage-Engines schnell (auch InnoDB mit Auto-Commit).
Im Hintergrund scheint MariaDB die Datenbank zu löschen.
Wohl kaum, jedenfalls nicht ohne die Anweisung bekommen zu haben dies zu tun.
Läuft ein Prozess im Hintergrund, macht das dbForge Unsinn.
Die DB macht das wohl kaum von selbst.
Kann es sein, dass da autocommit aus ist, und am ende des Backup Script
kein COMMIT steht?
Auch albern. Wenn das Backup-Programm Transaktionen ins Backupfile
schreibt, dann ist es auch dafür verantwortlich, die mit COMMIT
abzuschließen.
Wenn in der DB Autocommit ausgeschaltet ist, muss man am Ende ein Commit absetzen, auch wenn man nicht explizit eine Transaktion gestartet hat. Ja, das kann man global in der DB Config so einstellen. Und wenn man das gemacht hat, und am ende kein COMMIT macht, dann gibts einen rollback, auch wenn man vorher keine Transaktion explizit gestartet hat. Und das würde natürlich genau dann passieren, wenn im backup file keine Transaktionen sind.
Kann es sein, dass da autocommit aus ist, und am ende des Backup Script
kein COMMIT steht?
Auch albern. Wenn das Backup-Programm Transaktionen ins Backupfile
schreibt, dann ist es auch dafür verantwortlich, die mit COMMIT
abzuschließen.
Wenn in der DB Autocommit ausgeschaltet ist, muss man am Ende ein Commit
absetzen, auch wenn man nicht explizit eine Transaktion gestartet hat.
Wie gesagt, wenn das Backup-Programm nicht gerade von einem absoluten Neuling verbrochen wurde (was ich mir angesichts des sonstigen Aufwands für dbForge nicht vorstellen kann) dann überschreibt es als eine der ersten Aktionen im Backupskript (sofern es ein solches überhaupt erzeugt) die /AUTOCOMMIT/ Server-Variable.
mariadb-dump (und mysqldump) streuen überdies noch SQL-Statements ein, die ein implizites COMMIT erzwingen. Z.B. ALTER TABLE.
Und - als wäre das nicht genug - kann man die restored-ten Rows von einer anderen Session ohnehin nur sehen, wenn /TRANSACTION_ISOLATION/ auf /READ-UNCOMMITTED/ gesetzt ist. Auch nicht Standard.
Aber das sind alles nur Spekulationen. Ich weiß nicht, was dbForge bei einem Backup überhaupt macht. Wie schon gesagt: wenn der TO unbedingt dbForge verwenden will, dann sollte er da nachfragen. Vielleicht ist es ja tatsächlich ein Bug.
1-- phpMyAdmin SQL Dump
2-- version 4.9.7
3-- https://www.phpmyadmin.net/
4--
5-- Host: localhost
6-- Generation Time: Nov 19, 2022 at 07:26 PM
7-- Server version: 10.3.32-MariaDB
8-- PHP Version: 7.4.30
9
10 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
11 SET AUTOCOMMIT = 0;
12 START TRANSACTION;
Hier wird eine Transaktion gestartet. Und vorher AUTO-COMMIT explizit abgeschaltet.
13 SET time_zone = "+00:00";
14
15
16/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT /;
17/!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS /;
18/!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION /;
19/!40101 SET NAMES utf8mb4 */;
20
21--
22-- Database: MyData_db
23--
...
Jetzt wäre interessant, ob da am Ende noch eine Zeile mit COMMIT kommt. Also eigentlich eher nach den Daten für eine Tabelle. Und auch sonst spätestens alle 1000 Rows (ca.)
Aber nachdem das ein phpMyAdmin Dump ist, habe ich keine Zweifel, daß die das richtig hinbekommen.
Jetzt wäre interessant, ob da am Ende noch eine Zeile mit COMMIT kommt.
Also eigentlich eher nach den Daten für eine Tabelle. Und auch sonst
spätestens alle 1000 Rows (ca.)
nein, nach dem letzten Eintrag kommt nix weiteres.
10 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
11 SET AUTOCOMMIT = 0;
12 START TRANSACTION;
Hier wird eine Transaktion gestartet. Und vorher AUTO-COMMIT explizit
abgeschaltet.
könnte ich das autom commit nicht einfach auf 1 setzen?
hi
sorry, war für ein paar Tage außer Gefecht
das SQL sieht folgendermaßen aus
-- phpMyAdmin SQL Dump
Wie, jetzt ein phpMyAdmin Dump?
Ich dachte es geht um dbForge?
Wenn der Restore über PHP läuft können die Server Einstellungen, z.Bsp. max_execution_time das Problem verursachen.
Das Script bricht wegen Überschreitung der Zeit ab und somit der abschließende Commit nicht ausgeführt.
Nicht alle Fehler werden von der Anwendung abgefangen und angezeigt.
Kleiner Tipp: utf8 unterstützt nur einen kleinen Teil des Zeichensatzes. Für Leute aus dem Balkan reicht es schon nicht. utf8mb4 tut hingegen das, was man so allgemein erwartet (alle Zeichen unterstützen).
Kleiner Tipp: utf8 unterstützt nur einen kleinen Teil des Zeichensatzes.
Das hab ich schon immer bescheuert gefunden, was mysql da macht. Entweder eine Anwendung macht UTF-8, oder es macht sonst was (UCS-2, UTF-16, UTF-32, etc.). Sowas wie 2 byte per Zeichen UTF-8 oder 4 byte per Zeichen UTF-8 gibt es nicht, das ist einfach kein UTF-8 mehr. Und einen Grund, solchen scheiss zu machen gibt es auch nicht. Nicht-lokalisierte Sortierung usw. ist da bei UTF-8, UTF-16be, etc. genau gleich. Und auch sonst kann man UTF-8 eigentlich immer wie eine erweiterte ASCII Codiereung behandeln...
Jetzt wäre interessant, ob da am Ende noch eine Zeile mit COMMIT kommt.
Also eigentlich eher nach den Daten für eine Tabelle. Und auch sonst
spätestens alle 1000 Rows (ca.)
nein, nach dem letzten Eintrag kommt nix weiteres.
Wenn da nirgends "COMMIT;" drinn steht, hoffentlich ist der Dump dann überhaupt vollständig... Naja, versuch mal gaanz am Ende, eine Zeile mit dem Inhalt
Kleiner Tipp: utf8 unterstützt nur einen kleinen Teil des
Zeichensatzes.
Für Leute aus dem Balkan reicht es schon nicht. utf8mb4 tut hingegen
das, was man so allgemein erwartet (alle Zeichen unterstützen).
Das hab ich schon immer bescheuert gefunden, was mysql da macht.
Seit MySQL 8.0.x (bin zu faul, x nachzuschlagen) ist "utf8" ein Synonym für "utf8mb4". Das alte Verhalten (nur Zeichen aus der BMP, aka mit dem Codeverrat U+0001 bis U+FFFF) erreicht man mit "utf8mb3".
MySQLs Beschränkung von UTF8 auf die BMP (/basic multilingual plane/ aka Unicode < 2.0) sollte für alle europäischen Sprachen ausreichen. OK, Klingonisch ist nicht dabei. Der häufigste genannte Grund warum man Unicode abseits der BMP brauchen sollte sind nativ codierte (also nicht als ASCII-Art dargestellte) Emojis. Mir kommen gleich die Tränen ;-)
"From MariaDB 10.6.1, the main name of the previous 3 byte utf character set has been changed to utf8mb3. If (old mode is) set, the default, utf8 is an alias for utf8mb3. If not set, utf8 would be an alias for utf8mb4."
Nichts, habe ich auch nicht behauptet. Es war nur ein Verbesserungsvorschlag ("Kleiner Tipp"). Eine große Sache wurde darauf, weil andere dem falsch widersprochen haben.