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?
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:
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
mysql -u root -p < alldb.sql
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
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 if
und fi
vollständig. In der Variablen ExcludeDatabases
speichern Sie die Namen von Datenbanken, die nicht gesichert werden sollen [normalerweise Systemdatenbanken].
-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;"
U+200C U+200B
zwischen "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/…
Alle Antworten, die ich auf diese Frage sehe, können Probleme mit den Zeichensätzen in einigen Datenbanken haben, da das Beenden des Exits mysqldump
in 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;
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"
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.
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'
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 :)
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:
ExcludeDatabases
mysqldump -uroot -proot --all-database> allDB.sql
Hinweis: -u "Ihr Benutzername" -p "Ihr Passwort"