425 Stimmen

Export und Import aller MySQL-Datenbanken auf einmal

Ich möchte ein Backup aller meiner MySQL-Datenbanken erstellen. Ich habe mehr als 100 MySQL-Datenbanken. Ich möchte sie alle gleichzeitig exportieren und alle gleichzeitig wieder in meinen MySQL-Server importieren. Wie kann ich das tun?

927voto

Shakti Singh Punkte 81441

Ausfuhr:

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

Schauen Sie sich die Dokumentation für mysqldump . 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

249voto

jruzafa Punkte 4036

Andere Lösung:

Jede Datenbank wird in einer anderen Datei gesichert

#!/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

41voto

NetVicious Punkte 3521

Alle Antworten, die ich auf diese Frage sehe, können Probleme mit den Zeichensätzen in einigen Datenbanken wegen des Problems der Umleitung des Ausgangs von mysqldump in eine Datei innerhalb des Shell-Operators > .

Um dieses Problem zu lösen, sollten Sie Folgendes tun Backup mit einem Befehl wie diesem

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

Um eine gute BD zu machen wiederherstellen ohne Probleme mit Zeichensätzen. Natürlich können Sie den Standard-Zeichensatz nach Bedarf ändern.

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

13voto

Peter VARGA Punkte 5207

Ich schrieb dieser Kommentar bereits vor mehr als 4 Jahren und beschloss nun, es zu einer Antwort zu machen.

En Skript de jruzafa kann ein wenig vereinfacht werden:

#!/bin/bash

USER="zend"
PASSWORD=""
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
done

Anmerkung:

  1. Die ausgeschlossenen Datenbanken - in erster Linie die Systemtabellen - werden in der Variablen ExcludeDatabases
  2. Bitte beachten Sie, dass das Passwort in der Befehlszeile angegeben wird. Dies wird als unsicher angesehen. Studieren Sie dies Frage .

12voto

PeterM Punkte 1315

Auf der Grundlage dieser Antworten habe ich ein Skript erstellt, das alle Datenbanken in separaten Dateien sichert, diese dann aber in einem Archiv mit dem Datum als Namen komprimiert.

Diese Funktion fragt nicht nach dem Passwort und kann in Cron verwendet werden. Um das Passwort in .my.cnf Prüfen Sie diese Antwort https://serverfault.com/a/143587/62749

Auch mit Kommentaren für diejenigen, die nicht sehr vertraut mit Bash-Skripten 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"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X