mysql-dump
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| mysql-dump [2018-03-19 11:19:30] – [MySQL-Dump] manfred | mysql-dump [2024-06-26 16:45:59] (aktuell) – [Fehler] manfred | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== MySQL-Dump ====== | ||
| + | |||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | MyISAM-Dump ziehen, um in eine INNODB wieder einzuspielen: | ||
| + | # mysqldump --order-by-primary -Ac > all_databases.sql | ||
| + | |||
| + | INNODB-Dump mit " | ||
| + | Es dürfen diese Aufrufe während der Dump geschrieben wird, | ||
| + | nicht ausgeführt werden: | ||
| + | '' | ||
| + | # mysqldump --opt --single-transaction -Ac > all_databases.sql | ||
| + | |||
| + | Müssen die Aufrufe '' | ||
| + | nutzbar sein, dann muss man [[Percona xtrabackup]] einsetzen. | ||
| + | |||
| + | Will man nur die Daten dumpen, ohne die Datenbanken und Tabellen vorher neu anzulegen, dann geht es so: | ||
| + | # mysqldump --skip-add-drop-table -Ktnc | ||
| + | |||
| + | komplette Optionen, **ohne** Tabelle löschen: | ||
| + | # mysqldump --set-gtid-purged=OFF --opt --triggers --routines --skip-add-drop-table --order-by-primary --single-transaction --skip-extended-insert -QEc [Datenbankname] [Tabellenname] | gzip -1 > Datenbankname_Tabellenname.sql.gz | ||
| + | |||
| + | komplette Optionen, **mit** Tabelle löschen: | ||
| + | # mysqldump --set-gtid-purged=OFF --opt --triggers --routines --add-drop-table --order-by-primary --single-transaction --skip-extended-insert -QEc [Datenbankname] [Tabellenname] | gzip -1 > Datenbankname_Tabellenname.sql.gz | ||
| + | |||
| + | |||
| + | ==== MySQLDump ==== | ||
| + | |||
| + | |||
| + | === Fehler === | ||
| + | |||
| + | wenn dieser Fehler auftritt: | ||
| + | > mysqldump: Got error: 1105: Percona-XtraDB-Cluster prohibits use of LOCK TABLE/FLUSH TABLE < | ||
| + | |||
| + | dann liegt das daran: | ||
| + | > echo "SHOW VARIABLES WHERE Variable_name LIKE (' | ||
| + | +-----------------+-----------+ | ||
| + | | Variable_name | ||
| + | +-----------------+-----------+ | ||
| + | | pxc_strict_mode | ENFORCING | | ||
| + | +-----------------+-----------+ | ||
| + | |||
| + | das ist die falsche vorgehensweise: | ||
| + | > echo "SET GLOBAL pxc_strict_mode=' | ||
| + | |||
| + | das wäre dann zu tun (eine dieser beiden zusätzlichen Optionen verwenden): | ||
| + | # mysqldump ... --single-transaction | ||
| + | # mysqldump ... --no-lock-tables | ||
| + | |||
| + | mal ausprobieren: | ||
| + | SET unique_checks=0; | ||
| + | SET foreign_key_checks = 0; | ||
| + | |||
| + | |||
| + | ===== MySQL-DB kopieren ===== | ||
| + | |||
| + | Das kopieren über den MySQL-Proxy funktioniert nicht,\\ | ||
| + | hier werden die CREATE TABLES - Anweisungen nicht mitgedumpt. | ||
| + | |||
| + | In diesem Beispiel soll eine Datenbank " | ||
| + | die die gleiche Tabellenstruktur wie die " | ||
| + | |||
| + | <file bash / | ||
| + | #!/bin/sh | ||
| + | |||
| + | VERSION=" | ||
| + | |||
| + | # / | ||
| + | # / | ||
| + | # / | ||
| + | # / | ||
| + | # / | ||
| + | |||
| + | while [ " | ||
| + | case " | ||
| + | -h) | ||
| + | HOST=${2} | ||
| + | shift | ||
| + | ;; | ||
| + | -p) | ||
| + | PORT=${2} | ||
| + | shift | ||
| + | ;; | ||
| + | -t) | ||
| + | TABELLEN=${2} | ||
| + | shift | ||
| + | ;; | ||
| + | -d) | ||
| + | DATENBANKEN=${2} | ||
| + | shift | ||
| + | ;; | ||
| + | -l) | ||
| + | LEER=${2} | ||
| + | shift | ||
| + | ;; | ||
| + | -h) | ||
| + | echo " | ||
| + | HILFE: | ||
| + | ${0} [Option] | ||
| + | DB-Host: -h [Hostname] | ||
| + | DB-Port: -p [Port] | ||
| + | Tabellen vorher löschen: -t löschen | ||
| + | Datenbanken: | ||
| + | ohne Daten: -l | ||
| + | |||
| + | ${0} -p 3306 -d \" | ||
| + | ${0} -p 3306 -t löschen -d \" | ||
| + | ${0} -p 3306 -l -d \" | ||
| + | ${0} -h 192.168.1.100 -p 3306 -d \" | ||
| + | " | ||
| + | exit 1 | ||
| + | ;; | ||
| + | *) | ||
| + | if [ " | ||
| + | echo "Der Parameter ' | ||
| + | fi | ||
| + | shift | ||
| + | ;; | ||
| + | esac | ||
| + | done | ||
| + | |||
| + | if [ " | ||
| + | # | ||
| + | HOST=" | ||
| + | fi | ||
| + | |||
| + | if [ " | ||
| + | echo "${0} -h" | ||
| + | echo "${0} -p 3306 ..." | ||
| + | exit 11 | ||
| + | fi | ||
| + | |||
| + | if [ " | ||
| + | LEER=" | ||
| + | fi | ||
| + | |||
| + | if [ " | ||
| + | DROP_TABLE=" | ||
| + | else | ||
| + | DROP_TABLE=" | ||
| + | fi | ||
| + | |||
| + | DBS=" | ||
| + | do | ||
| + | echo -n "-B ${D_B} " | ||
| + | done)" | ||
| + | |||
| + | mysqldump -h ${HOST} -P ${PORT} --set-gtid-purged=OFF --opt --triggers --routines ${DROP_TABLE} --order-by-primary --single-transaction --skip-extended-insert -QEc ${LEER} ${DBS} | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Tabellenstruktur einer Datenbank kopieren ==== | ||
| + | |||
| + | > mysqldump -d -Y altedb > / | ||
| + | > echo ' | ||
| + | > cat / | ||
| + | |||
| + | |||
| + | ==== komplette Datenbank kopieren ==== | ||
| + | |||
| + | > mysqldump -c -Y altedb > / | ||
| + | > echo ' | ||
| + | > cat / | ||
| + | |||
| + | |||
| + | ===== Backup ===== | ||
| + | |||
| + | ==== mysqldump ==== | ||
| + | |||
| + | Mit mysqldump kann man die kompatibelste Form von einem Backup erstellen. | ||
| + | Allerdings trifft das nur dann zu, wenn jede DB einzeln gesichert wird, denn mit der Option "'' | ||
| + | |||
| + | //Weiterhin ist anzumerken, dass das sichern mit '' | ||
| + | |||
| + | alle Datenbanken zusammen auf einmal in eine einzige Datei sichern: | ||
| + | > mysqldump --opt --triggers --routines --set-gtid-purged=ON -QEcA | gzip -1 > mysqldump_alle_Datenbanken.sql.gz | ||
| + | > mysqldump --opt --triggers --routines --single-transaction --set-gtid-purged=ON -QEcA | gzip -1 > mysqldump_alle_Datenbanken.sql.gz | ||
| + | |||
| + | nur eine einzige Datenbank ('' | ||
| + | > mysqldump -B Datenbankname --opt --triggers --routines --set-gtid-purged=OFF -QEc | gzip -1 > mysqldump_Datenbankname.sql.gz | ||
| + | > mysqldump --opt --triggers --routines --set-gtid-purged=OFF -QEc Datenbankname | gzip -1 > mysqldump_Datenbankname.sql.gz | ||
| + | |||
| + | nur eine Tabelle ('' | ||
| + | > mysqldump --opt --triggers --routines --set-gtid-purged=OFF -QEc Datenbankname Tabellenname | gzip -1 > mysqldump_Datenbankname_Tabellenname.sql.gz | ||
| + | |||
| + | Hierbei ist auch die Reihenfolge der übergebenen Parameter zu beachten! | ||
| + | Zum Beispiel muss "'' | ||
| + | Der Parameter "'' | ||
| + | |||
| + | |||
| + | ==== Sicherung ([database].sql) erstellen ==== | ||
| + | |||
| + | nur die DB-Struktur sichern: | ||
| + | # mysqldump -d -cA > mysqldb-struktur.sql | ||
| + | |||
| + | Dump von allen Datenbanken erstellen: | ||
| + | # mysqldump -uroot -pgeheim -cA > [database].sql | ||
| + | |||
| + | Dump von einer bestimmten Datenbank erstellen: | ||
| + | # mysqldump -uroot -pgeheim -cB [database] > [database].sql | ||
| + | # mysqldump -uroot -pgeheim -c [database] > [database].sql | ||
| + | |||
| + | Dump von einer bestimmten Tabelle erstellen: | ||
| + | # mysqldump -uroot -pgeheim -c [Datenbank] [Tabelle] > [Datenbank]_[Tabelle].sql | ||
| + | |||
| + | Datenbank löschen: | ||
| + | # mysqladmin DROP [database] | ||
| + | |||
| + | |||
| + | ==== Sicherung ([database].sql) einlesen ==== | ||
| + | |||
| + | User anlegen, Datenbank anlegen + dump einlesen: | ||
| + | # mysql -u[user] -p[passwort] -e " | ||
| + | # mysql -u[user] -p[passwort] -e " | ||
| + | # mysql -u[user] -p[passwort] reload | ||
| + | # mysql -u[user] -p[passwort] -e " | ||
| + | # cat [database].sql | mysql -u[user] -p[passwort] [database] | ||
| + | |||
| + | ODER | ||
| + | # mysql -u[user] -p[passwort] -e " | ||
| + | # mysql -u[user] -p[passwort] [database] < [database].sql | ||
| + | |||
| + | |||
| + | ==== Backup auf Basis von LVM Snapshots ==== | ||
| + | |||
| + | Möglicherweise wird die Implementierung eines mysql Backup auf Basis von LVM Snapshots, doch nicht allzu schwer. | ||
| + | |||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||
| + | Allerdings wurde das ganze hier auf einem Single System umgesetzt und nicht auf einem Master Slave System. Man müsste das ganze dann noch um das Stoppen des Sync vom Master erweitern. Im zweiten Link hat jemand das ganze über ein kleines PHP Script realisiert, angeblich ebenfalls auf einem Singlesystem ohne merkbare Aussetzer. | ||
| + | |||
| + | Und hier ein Link zu einer Master Slave Konstellation: | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | Das Script sieht ebenfalls recht überschaubar aus und sollte mit relativ wenig Aufwand an unsere Umgebung anpassbar sein. | ||
| + | |||
| + | |||
| + | |||
| + | ===== Daten direkt zwischen Datenbanken kopieren ===== | ||
| + | |||
| + | |||
| + | ==== DB-Layout sichern ==== | ||
| + | |||
| + | Layout der Tabelle " | ||
| + | # mysqldump -d Syslog SystemEvents > leere_tabelle.sql | ||
| + | |||
| + | Tabellenname ändern | ||
| + | # sed -i ' | ||
| + | |||
| + | leere temp-Tabelle anlegen | ||
| + | # cat leere_tabelle.sql | mysql -t Syslog | ||
| + | |||
| + | alles aus " | ||
| + | echo " | ||
| + | INSERT INTO | ||
| + | SystemEvents | ||
| + | SELECT | ||
| + | * | ||
| + | FROM | ||
| + | temp | ||
| + | ORDER BY ReceivedAt | ||
| + | " | mysql -t Syslog | ||
| + | |||
| + | oder nur bestimmte Spalten aus " | ||
| + | echo " | ||
| + | INSERT INTO | ||
| + | SystemEvents | ||
| + | (ReceivedAt, | ||
| + | SELECT | ||
| + | ReceivedAt, | ||
| + | FROM | ||
| + | temp | ||
| + | ORDER BY ReceivedAt | ||
| + | " | mysql -t Syslog | ||
| + | |||
| + | Jetzt kann man " | ||
| + | |||
| + | |||
| + | ===== INNODB-Backup ===== | ||
| + | |||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||
| + | |||
| + | ==== InnoDB Hot Backup ==== | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | InnoDB Hot Backup ist ein Online-Backup-Tool mit dem Sie eine InnoDB-Datenbank bei laufendem Betrieb sichern können. InnoDB Hot Backup verlangt nicht, dass Sie die Datenbank herunterfahren, | ||
| + | |||
| + | |||
| + | ==== Binär-Backup ==== | ||
| + | |||
| + | Wenn Sie in der Lage sind, Ihren MySQL-Server herunterzufahren, | ||
| + | - Fahren Sie den MySQL-Server herunter und achten Sie darauf, dass dabei keine Fehler auftreten. | ||
| + | - Kopieren Sie alle Datendateien (ibdata-Dateien und '' | ||
| + | - Kopieren Sie alle '' | ||
| + | - Kopieren Sie Ihre '' | ||
| + | - Kopieren Sie alle '' | ||
| + | |||
| + | |||
| + | ==== SQL-Backup ==== | ||
| + | |||
| + | |||
| + | === mysqldump: Restore von InnoDB Tabellen === | ||
| + | |||
| + | Der Restore von InnoDB-Tabellen ist ein wenig komplizierter, | ||
| + | |||
| + | Es gibt zwei Möglichkeiten: | ||
| + | |||
| + | |||
| + | == Editieren des mysqldump Backup-File == | ||
| + | |||
| + | Am Anfang des SQL-Skripts folgende Zeilen einfügen: | ||
| + | SET FOREIGN_KEY_CHECKS=0; | ||
| + | |||
| + | und am Ende des SQL-Skripts folgendes: | ||
| + | SET FOREIGN_KEY_CHECKS = 1; | ||
| + | COMMIT; | ||
| + | |||
| + | Dann lässt sich diese Datei wie ein MyISAM Backup zurückschreiben. | ||
| + | |||
| + | Um die ganze Sache zu beschleunigen, | ||
| + | oder man __schreibt den Dump__ mit der Option __'' | ||
| + | |||
| + | |||
| + | == Restore über die Kommandozeile == | ||
| + | |||
| + | # mysql -u$USER -p | ||
| + | use $DATENBANKNAME; | ||
| + | SET FOREIGN_KEY_CHECKS = 0; | ||
| + | source $MYSQLDUMP_FILE_Name; | ||
| + | SET FOREIGN_KEY_CHECKS = 1; | ||
| + | COMMIT; | ||
| + | |||
| + | |||
| + | ==== DB-Schäden ==== | ||
| + | |||
| + | In manchen Fällen, in denen Daten beschädigt wurden, reicht es aus, die beschädigten Tabellen zu dumpen, zu löschen und neu zu erzeugen. Mit der SQL-Anweisung '' | ||
| + | |||
| + | ---- | ||
| + | * [[http:// | ||
| + | |||
| + | Wenn Schäden an Datenbankseiten vorhanden sind, sollten Sie Ihre Tabellen mit '' | ||
| + | [mysqld] | ||
| + | innodb_force_recovery = 4 | ||
| + | |||
| + | Die Datenbank darf auf keine andere Weise mit einem von '' | ||
| + | |||
| + | |||
| + | ===== MysqlPump ===== | ||
| + | |||
| + | MysqlPump ist eine Alternative zu MysqlDump. | ||
| + | MysqlPump ermöglich das sichern der User in logisch definierter Form (mit '' | ||
| + | |||
| + | Datenbanken/ | ||
| + | > mysqlpump -A | ||
| + | > mysqlpump -B db_name | ||
| + | > mysqlpump db_name tabname | ||
| + | |||
| + | User sichern: | ||
| + | > mysqlpump --exclude-databases=% --users | ||
| + | |||
