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?
Antworten
Zu viele Anzeigen?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
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
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;
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:
- Die ausgeschlossenen Datenbanken - in erster Linie die Systemtabellen - werden in der Variablen
ExcludeDatabases
- Bitte beachten Sie, dass das Passwort in der Befehlszeile angegeben wird. Dies wird als unsicher angesehen. Studieren Sie dies Frage .
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"
- See previous answers
- Weitere Antworten anzeigen