Esporta e importa tutti i database MySQL contemporaneamente


354

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:


776

Esportare:

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

Importare:

mysql -u root -p < alldb.sql

1
mysqldump -uroot -p --opt --all-database> alldb.sql
un programmatore

7
mysqldump -uroot -p --all-databases --skip-lock-tables> alldb.sql
temple

12
Aggiungi le opzioni --verbose o -v per vedere come procede il dump.
Bagonyi,

4
@ HalilÖzgür dalla pagina man mysqldump: "mysqldump non scarica il database INFORMATION_SCHEMA o performance_schema per impostazione predefinita. Per eseguire il dump di uno di questi, nominarlo esplicitamente sulla riga di comando e utilizzare anche l'opzione --skip-lock-tables."
mmalone,

2
ATTENZIONE , l'importazione sovrascriverà tutti i tuoi utenti MySQL esistenti.
Rousseau

218

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

3
Preferirei questo approccio, poiché questo rende il dump di tutti i database come file diverso.
Arda,

10
È possibile semplificare / migliorare un po 'lo script: sostituire la nona riga [database = ...] con queste due righe: 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 ife fi. Nella variabile ExcludeDatabasessi memorizzano i nomi dei database che non devono essere scaricati [normalmente database di sistema].
Peter VARGA,

2
@jruzafa È possibile utilizzare -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;"
miquel

6
Realizzato uno script inverso (import): gist.github.com/tenold/aa5e107d93c0f54436cb
Corey,

1
ATTENZIONE: il commento molto utile di @AlBundy sopra contiene una sequenza di caratteri unicode U+200C U+200Btra 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/…
billynoah,

29

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 mysqldumpun 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;

Cosa fa -r?
Luca Reghellin,

3
-r imposta il nome del file di destinazione su cui verrà scritto l'output.
NetVicious,

Sarebbe meglio usare utf8mb4 invece di utf8 per il set di caratteri?
kojow7,

1
Dipende da cosa stai memorizzando nelle tue tabelle. Il set di caratteri utf8 ha un massimo di 3 byte per ogni carattere. utf8mb4 ha un massimo di 4 byte per ogni carattere. Ovviamente se il tuo database è su utf8mb4 dovresti usare quel set di caratteri per ripristinarlo.
NetVicious,

9

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.cnfcontrolla 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"

1
Bene che sei tornato per contribuire con le tue aggiunte. un voto da parte mia
Fr0zenFir

7

Perché analizzare l'output formattato mentre il comando mysql può fare direttamente quello che vuoi?

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

Elenca i nomi dei database e solo questo.


3

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'

3

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 :)


3

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:

  1. I database esclusi - principalmente le tabelle di sistema - sono forniti nella variabile ExcludeDatabases
  2. Si noti che la password è fornita nella riga di comando. Questo è considerato insicuro. Studia questa domanda .

0

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

nota: -u "il tuo nome utente" -p "la tua password"


La tua risposta non risolve davvero il problema, perché sta chiedendo di esportare tutti i database contemporaneamente. Forse puoi migliorare un po ': mysqldump -uroot -proot --all-database> allDB.sql nota: -u "il tuo nome utente" -p "la tua password"
Marwan Salim

0

Esporta tutti i database in Ubuntu

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

O

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

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.