Voglio mantenere un backup di tutti i miei database MySQL. Ho più di 100 database MySQL. Voglio esportarli tutti allo stesso tempo e importarli nuovamente nel mio server MySQL contemporaneamente. Come lo posso fare?
Voglio mantenere un backup di tutti i miei database MySQL. Ho più di 100 database MySQL. Voglio esportarli tutti allo stesso tempo e importarli nuovamente nel mio server MySQL contemporaneamente. Come lo posso fare?
Risposte:
mysqldump -u root -p --all-databases > alldb.sql
Cerca la documentazione per mysqldump . Potresti voler utilizzare alcune delle opzioni menzionate nei commenti:
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
Altra soluzione:
Esegue il backup di ogni database in un file diverso
#!/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"
[riga successiva] databases=`-u $USER -p$PASWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`
e rimuovere completamente le righe if
e fi
. Nella variabile ExcludeDatabases
si memorizzano i nomi dei database che non devono essere scaricati [normalmente database di sistema].
-Bse "show databases"
per evitare output di formattazione extra e quindi è possibile rimuovere | tr -d "| " | grep -v Database
. Nel mio script di esportazione questa riga èdatabases=`mysql -u $USER -p$PASSWORD -Bse "SHOW DATABASES;"
U+200C U+200B
tra la "c" e la "h" della parola "schema" . Questo interrompe la copia e incolla di quel bit. Altre discussioni su questo tema qui: meta.stackexchange.com/questions/170970/…
Tutte le risposte che vedo su questa domanda possono avere problemi con i set di caratteri in alcuni database a causa del problema di reindirizzare l'uscita di mysqldump
un file all'interno dell'operatore shell >
.
Per risolvere questo problema, è necessario eseguire il backup con un comando come questo
mysqldump -u root -p --opt --all-databases -r backup.sql
Per eseguire un buon ripristino BD senza alcun problema con i set di caratteri. Ovviamente puoi cambiare il set di caratteri predefinito di cui hai bisogno.
mysql -uroot -p --default-character-set=utf8
mysql> SET names 'utf8';
mysql> SOURCE backup.sql;
Sulla base di queste risposte ho creato uno script che esegue il backup di tutti i database in file separati, ma li comprime in un archivio con la data come nome.
Questo non richiederà la password, può essere utilizzato in cron. Per memorizzare la password, .my.cnf
controlla questa risposta https://serverfault.com/a/143587/62749
Creato anche con commenti per coloro che non hanno molta familiarità con gli script bash.
#!/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"
Prestare attenzione durante l'esportazione e l'importazione in diverse versioni di MySQL poiché le tabelle mysql possono avere colonne diverse. Se non sei fortunato, i privilegi di concessione potrebbero non funzionare. Ho creato questo script (mysql_export_grants.sql) per scaricare le sovvenzioni per l'importazione nel nuovo database, nel caso in cui:
#!/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'
Quando si esegue il dump di tutto il database. Ovviamente sta avendo grandi dati. Quindi puoi preferire di seguito in meglio:
Creazione di backup:
mysqldump -u [user] -p[password]--single-transaction --quick --all-databases | gzip > alldb.sql.gz
Se errore
- Avvertenza: saltare i dati della tabella mysql.event. Specificare esplicitamente l'opzione --events.
Uso:
mysqldump -u [user] -p --events --single-transaction --quick --all-databases | gzip > alldb.sql.gz
Ripristino del backup:
gunzip < alldb.sql.gz | mysql -u [user] -p[password]
Spero che possa aiutare :)
Ho scritto questo commento già più di 4 anni fa e ho deciso ora di farlo rispondere.
Lo script di jruzafa può essere un po 'semplificato:
#!/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
Nota:
ExcludeDatabases
mysqldump -uroot -proot --all-database> allDB.sql
nota: -u "il tuo nome utente" -p "la tua password"