Exportieren und importieren Sie alle MySQL-Datenbanken gleichzeitig


354

Ich möchte eine Sicherungskopie aller meiner MySQL-Datenbanken erstellen. Ich habe mehr als 100 MySQL-Datenbanken. Ich möchte alle gleichzeitig exportieren und alle gleichzeitig auf einmal in meinen MySQL-Server importieren. Wie kann ich das machen?

Antworten:


775

Export:

mysqldump -u root -p --all-databases > alldb.sql

Schlagen Sie die Dokumentation für mysqldump nach . Möglicherweise möchten Sie einige der in den Kommentaren genannten Optionen verwenden:

mysqldump -u root -p --opt --all-databases > alldb.sql
mysqldump -u root -p --all-databases --skip-lock-tables > alldb.sql

Importieren:

mysql -u root -p < alldb.sql

1
mysqldump -uroot -p --opt --all-database> alldb.sql
ein Codierer

7
mysqldump -uroot -p --all-database --skip-lock-tables> alldb.sql
Tempel

12
Fügen Sie die Optionen --verbose oder -v hinzu, um zu sehen, wie der Speicherauszug fortschreitet.
Bagonyi

4
@ HalilÖzgür von der Manpage mysqldump: "mysqldump gibt die Datenbank INFORMATION_SCHEMA oder performance_schema standardmäßig nicht aus. Um eine dieser Datenbanken zu sichern, benennen Sie sie explizit in der Befehlszeile und verwenden Sie auch die Option --skip-lock-tables."
Mmalone

2
WARNUNG : Beim Import werden alle vorhandenen MySQL-Benutzer überschrieben.
RousseauAlexandre

218

Andere Lösung:

Es sichert jede Datenbank in einer anderen Datei

#!/bin/bash

USER="zend"
PASSWORD=""
#OUTPUT="/Users/rabino/DBs"

#rm "$OUTPUTDIR/*gz" > /dev/null 2>&1

databases=`mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`

for db in $databases; do
    if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]] ; then
        echo "Dumping database: $db"
        mysqldump -u $USER -p$PASSWORD --databases $db > `date +%Y%m%d`.$db.sql
       # gzip $OUTPUT/`date +%Y%m%d`.$db.sql
    fi
done

3
Ich würde diesen Ansatz bevorzugen, da dadurch der Speicherauszug aller Datenbanken als unterschiedliche Datei erstellt wird.
Arda

10
Sie können das Skript ein wenig vereinfachen / verbessern: Ersetzen Sie die 9. Zeile [database = ...] durch diese beiden Zeilen: ExcludeDatabases="Database|information_schema|performance_schema|mysql"[nächste Zeile] databases=`-u $USER -p$PASWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`und entfernen Sie die Zeilen ifund fivollständig. In der Variablen ExcludeDatabasesspeichern Sie die Namen von Datenbanken, die nicht gesichert werden sollen [normalerweise Systemdatenbanken].
Peter VARGA

2
@jruzafa Sie können verwenden -Bse "show databases", um zusätzliche Formatierungsausgaben zu vermeiden und somit zu entfernen | tr -d "| " | grep -v Database. In meinem databases=`mysql -u $USER -p$PASSWORD -Bse "SHOW DATABASES;"
Exportskript

6
Ein umgekehrtes (Import-) Skript erstellt: gist.github.com/tenold/aa5e107d93c0f54436cb
Corey

1
WARNUNG: Der sehr nützliche Kommentar von @AlBundy oben enthält eine Unicode-Zeichenfolge U+200C U+200Bzwischen "c" und "h" des Wortes "Schema" . Dies unterbricht das Kopieren und Einfügen dieses Bits. Weitere Diskussion zu diesem Thema hier: meta.stackexchange.com/questions/170970/…
billynoah

29

Alle Antworten, die ich auf diese Frage sehe, können Probleme mit den Zeichensätzen in einigen Datenbanken haben, da das Beenden des Exits mysqldumpin eine Datei innerhalb des Shell-Operators umgeleitet wird >.

Um dieses Problem zu lösen, sollten Sie die Sicherung mit einem Befehl wie diesem durchführen

mysqldump -u root -p --opt --all-databases -r backup.sql

Um eine gute BD- Wiederherstellung ohne Probleme mit Zeichensätzen durchzuführen. Natürlich können Sie den Standardzeichensatz nach Bedarf ändern.

mysql -uroot -p --default-character-set=utf8
mysql> SET names 'utf8';
mysql> SOURCE backup.sql;

Was macht -r?
Luca Reghellin

3
-r legt den Namen der Zieldatei fest, in die die Ausgabe geschrieben wird.
NetVicious

Wäre es besser, utf8mb4 anstelle von utf8 für den Zeichensatz zu verwenden?
Kojow7

1
Es hängt davon ab, was Sie in Ihren Tabellen speichern. Der utf8-Zeichensatz hat maximal 3 Bytes für jedes Zeichen. utf8mb4 hat maximal 4 Bytes für jedes Zeichen. Wenn sich Ihre Datenbank auf utf8mb4 befindet, sollten Sie diesen Zeichensatz verwenden, um sie wiederherzustellen.
NetVicious

9

Basierend auf diesen Antworten habe ich ein Skript erstellt, das alle Datenbanken in separaten Dateien sichert, sie dann aber in einem Archiv mit dem Datum als Namen komprimiert.

Dies fragt nicht nach Passwort, kann in cron verwendet werden. Um das Passwort zu speichern, .my.cnfüberprüfen Sie diese Antwort unter https://serverfault.com/a/143587/62749

Gemacht auch mit Kommentaren für diejenigen, die mit Bash-Skripten nicht sehr vertraut sind.

#!/bin/bash

# This script will backup all mysql databases into 
# compressed file named after date, ie: /var/backup/mysql/2016-07-13.tar.bz2

# Setup variables used later

# Create date suffix with "F"ull date format
suffix=$(date +%F)
# Retrieve all database names except information schemas. Use sudo here to skip root password.
dbs=$(sudo mysql --defaults-extra-file=/root/.my.cnf --batch --skip-column-names -e "SHOW DATABASES;" | grep -E -v "(information|performance)_schema")
# Create temporary directory with "-d" option
tmp=$(mktemp -d)
# Set output dir here. /var/backups/ is used by system, 
# so intentionally used /var/backup/ for user backups.
outDir="/var/backup/mysql"
# Create output file name
out="$outDir/$suffix.tar.bz2"

# Actual script

# Check if output directory exists
if [ ! -d "$outDir" ];then
  # Create directory with parent ("-p" option) directories
  sudo mkdir -p "$outDir"
fi

# Loop through all databases
for db in $dbs; do
  # Dump database to temporary directory with file name same as database name + sql suffix
  sudo mysqldump --defaults-extra-file=/root/.my.cnf --databases "$db" > "$tmp/$db.sql"
done

# Go to tmp dir
cd $tmp

# Compress all dumps with bz2, discard any output to /dev/null
sudo tar -jcf "$out" * > "/dev/null"

# Cleanup
cd "/tmp/"
sudo rm -rf "$tmp"

1
Gut, dass Sie zurückgekommen sind, um Ihre Ergänzungen beizutragen. eine Abstimmung von mir
Fr0zenFyr

7

Warum sollten Sie formatierte Ausgaben analysieren, während der Befehl mysql direkt das tun kann, was Sie wollen?

databases=`mysql -u $USER -p$PASSWORD --batch --skip-column-names -e "SHOW DATABASES;" | grep -E -v "(information|performance)_schema"`

Listet die Datenbanknamen und nur diese auf.


3

Seien Sie vorsichtig beim Exportieren und Importieren in verschiedene MySQL-Versionen, da die MySQL-Tabellen möglicherweise unterschiedliche Spalten haben. Wenn Sie kein Glück haben, funktionieren die Berechtigungen möglicherweise nicht. Ich habe dieses Skript (mysql_export_grants.sql) erstellt, um die Zuschüsse für den Import in die neue Datenbank zu sichern, nur für den Fall:

#!/bin/sh
stty -echo
printf 'Password: ' >&2
read PASSWORD
stty echo
printf "\n"
if [ -z "$PASSWORD" ]; then
        echo 'No password given!'
        exit 1
fi
MYSQL_CONN="-uroot -p$PASSWORD"
mysql ${MYSQL_CONN} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g'

3

Wenn Sie die gesamte Datenbank sichern. Offensichtlich hat es große Datenmengen. So können Sie unten zum Besseren bevorzugen:

Backup erstellen:

mysqldump -u [user] -p[password]--single-transaction --quick --all-databases | gzip > alldb.sql.gz

Wenn Fehler

- Warnung: Überspringen der Daten der Tabelle mysql.event. Geben Sie die Option --events explizit an.

Verwenden:

mysqldump -u [user] -p --events --single-transaction --quick --all-databases | gzip > alldb.sql.gz

Backup wiederherstellen:

gunzip < alldb.sql.gz | mysql -u [user] -p[password]

Hoffe es wird helfen :)


3

Ich habe diesen Kommentar bereits vor mehr als 4 Jahren geschrieben und mich jetzt entschlossen, eine Antwort darauf zu geben.

Das Skript von jruzafa kann etwas vereinfacht werden:

#!/bin/bash

USER="zend"
PASSWORD=""
#OUTPUT="/Users/rabino/DBs"

#rm "$OUTPUTDIR/*gz" > /dev/null 2>&1

ExcludeDatabases="Database|information_schema|performance_schema|mysql"
databases=`mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`

for db in $databases; do
    echo "Dumping database: $db"
    mysqldump -u $USER -p$PASSWORD --databases $db > `date +%Y%m%d`.$db.sql
    # gzip $OUTPUT/`date +%Y%m%d`.$db.sql
done

Hinweis:

  1. Die ausgeschlossenen Datenbanken - überwiegend die Systemtabellen - werden in der Variablen bereitgestellt ExcludeDatabases
  2. Bitte beachten Sie, dass das Passwort in der Kommandozeile angegeben wird. Dies wird als unsicher angesehen. Studiere diese Frage .

0

mysqldump -uroot -proot --all-database> allDB.sql

Hinweis: -u "Ihr Benutzername" -p "Ihr Passwort"


Ihre Antwort löst das Problem nicht wirklich, da er darum bittet, alle Datenbanken gleichzeitig zu exportieren. Vielleicht können Sie ein wenig verbessern: mysqldump -uroot -proot --all-database> allDB.sql Hinweis: -u "Ihr Benutzername" -p "Ihr Passwort"
Marwan Salim

0

Exportieren Sie alle Datenbanken in Ubuntu

1 - mysqldump -u root -p --databases database1 database2 > ~/Desktop/databases_1_2.sql

ODER

2 - mysqldump -u root -p --all_databases > ~/Desktop/all_databases.sql

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.