Exportar e importar todas las bases de datos MySQL a la vez

354

Quiero mantener una copia de seguridad de todas mis bases de datos MySQL. Tengo más de 100 bases de datos MySQL. Quiero exportarlos todos al mismo tiempo y nuevamente importarlos a mi servidor MySQL al mismo tiempo. ¿Cómo puedo hacer eso?

Nuevo Usuario
fuente

Respuestas:

777

Exportar:

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

Busque la documentación de mysqldump . Es posible que desee utilizar algunas de las opciones mencionadas en los comentarios:

mysqldump -u root -p --opt --all-databases > alldb.sql
mysqldump -u root -p --all-databases --skip-lock-tables > alldb.sql

Importar:

mysql -u root -p < alldb.sql
Shakti Singh
fuente
1
mysqldump -uroot -p --opt --todas las bases de datos> alldb.sql
un codificador el
77
mysqldump -uroot -p --todas-bases de datos --skip-lock-tables> alldb.sql
templo
12
Agregue las opciones --verbose o -v para ver cómo progresa el volcado.
bagonyi
44
@ HalilÖzgür de la página de manual de mysqldump: "mysqldump no volca la base de datos INFORMATION_SCHEMA o performance_schema de forma predeterminada. Para volcar cualquiera de estos, asígnele un nombre explícito en la línea de comando y también use la opción --skip-lock-tables".
mmalone
2
ADVERTENCIA , la importación anulará todos los usuarios de MySQL existentes.
RousseauAlexandre
219

Otra solución:

Realiza una copia de seguridad de cada base de datos en un archivo diferente

#!/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
jruzafa
fuente
3
Prefiero este enfoque, ya que esto hace que el volcado de todas las bases de datos sea un archivo diferente.
Arda
10
Puede simplificar / mejorar un poco el script: reemplace la línea 9 [bases de datos = ...] con estas dos líneas: ExcludeDatabases="Database|information_schema|performance_schema|mysql"[línea siguiente] databases=`-u $USER -p$PASWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`y elimine las líneas ify ficompletamente. En la variable ExcludeDatabasesse almacenan los nombres de las bases de datos que no se deben volcar [normalmente las bases de datos del sistema].
Peter VARGA
2
@jruzafa Puede utilizar -Bse "show databases"para evitar la salida de formato adicional y, por lo tanto, puede eliminar | tr -d "| " | grep -v Database. En mi script de exportación, esta línea esdatabases=`mysql -u $USER -p$PASSWORD -Bse "SHOW DATABASES;"
miquel
66
Hizo un script inverso (importación): gist.github.com/tenold/aa5e107d93c0f54436cb
Corey
1
ADVERTENCIA: El comentario muy útil de @AlBundy anterior contiene una secuencia de caracteres unicode U+200C U+200Bentre la "c" y la "h" de la palabra "esquema" . Esto rompe la copia y pegando ese bit. Más discusión sobre este tema aquí: meta.stackexchange.com/questions/170970/…
billynoah
29

Todas las respuestas que veo en esta pregunta pueden tener problemas con los juegos de caracteres en algunas bases de datos debido al problema de redirigir la salida mysqldumpa un archivo dentro del operador de shell >.

Para resolver este problema, debe hacer la copia de seguridad con un comando como este

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

Para hacer una buena restauración de BD sin ningún problema con los juegos de caracteres. Obviamente, puede cambiar el conjunto de caracteres predeterminado según lo necesite.

mysql -uroot -p --default-character-set=utf8
mysql> SET names 'utf8';
mysql> SOURCE backup.sql;
NetVicious
fuente
¿Qué hace -r?
Luca Reghellin
3
-r establece el nombre del archivo de destino donde se escribirá la salida.
NetVicious
¿Sería mejor usar utf8mb4 en lugar de utf8 para el conjunto de caracteres?
kojow7
1
Depende de lo que esté almacenando en sus tablas. El juego de caracteres utf8 tiene un máximo de 3 bytes para cada carácter. utf8mb4 tiene un máximo de 4 bytes para cada carácter. Obviamente, si su base de datos está en utf8mb4, debe usar ese juego de caracteres para restaurarla.
NetVicious
9

En base a estas respuestas, hice un script que respalda todas las bases de datos en archivos separados, pero luego los comprime en un archivo con la fecha como nombre.

Esto no pedirá contraseña, se puede usar en cron. Para almacenar la contraseña, .my.cnfverifique esta respuesta https://serverfault.com/a/143587/62749

Hecho también con comentarios para aquellos que no están muy familiarizados con los scripts de 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"
PeterM
fuente
1
Es bueno que hayas regresado para contribuir con tus adiciones. un voto de mí
Fr0zenFyr
7

¿Por qué analizar la salida formateada mientras el comando mysql puede hacer directamente lo que quieres?

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

Enumera los nombres de las bases de datos y solo esto.

msn
fuente
3

Tenga cuidado al exportar e importar a diferentes versiones de MySQL, ya que las tablas mysql pueden tener diferentes columnas. Los privilegios de concesión pueden no funcionar si no tiene suerte. Creé este script (mysql_export_grants.sql) para volcar las concesiones para importar a la nueva base de datos, por si acaso:

#!/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'
error de servidor interno
fuente
3

Cuando está volcando toda la base de datos. Obviamente está teniendo grandes datos. Entonces puede preferir a continuación para mejorar:

Crear copia de seguridad:

mysqldump -u [user] -p[password]--single-transaction --quick --all-databases | gzip > alldb.sql.gz

Si error

- Advertencia: omitiendo los datos de la tabla mysql.event. Especifique la opción --events explícitamente.

Utilizar:

mysqldump -u [user] -p --events --single-transaction --quick --all-databases | gzip > alldb.sql.gz

Restaurar copia de seguridad:

gunzip < alldb.sql.gz | mysql -u [user] -p[password]

Espero que ayude :)

ashikpatel
fuente
3

Escribí este comentario hace más de 4 años y decidí responderlo.

El script de jruzafa se puede simplificar un poco:

#!/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. Las bases de datos excluidas, predominantemente las tablas del sistema, se proporcionan en la variable ExcludeDatabases
  2. Tenga en cuenta que la contraseña se proporciona en la línea de comando. Esto se considera inseguro. Estudia esta pregunta .
Peter VARGA
fuente
0

mysqldump -uroot -proot --todas las bases de datos> allDB.sql

nota: -u "tu nombre de usuario" -p "tu contraseña"

Majutharan Majutharan
fuente
Su respuesta realmente no resuelve el problema, porque está pidiendo exportar todas las bases de datos a la vez. Tal vez pueda mejorar un poco: mysqldump -uroot -proot --all-bases de datos> allDB.sql nota: -u "su nombre de usuario" -p "su contraseña"
Marwan Salim
0

Exportar todas las bases de datos en 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

ingrese la descripción de la imagen aquí

Indal Raj
fuente