¿Alguna opción para mysqldump para ignorar las bases de datos para la copia de seguridad?

23

Tenemos 40 bases de datos en nuestro servidor.

Queremos hacer 36 copias de seguridad de bases de datos usando mysqldump. ¿Cómo puedo ignorar las 4 bases de datos restantes en el comando mysqldump? ¿Hay alguna opción para mysqldump para ignorar las bases de datos para la copia de seguridad en MySQL?

Conozco el comando general mysqldump pero es muy largo. Quiero ignorar solo 4 bases de datos y necesito tomar la copia de seguridad dbs restante.

ashuthosh
fuente

Respuestas:

16

El 16 de diciembre de 2011, respondí a la pregunta ¿Cómo mysqldump tablas específicas?

Recopilé todas las tablas sin incluir un cierto conjunto de nombres de tablas.

Utilizando los mismos principios, podría haber recopilado todos los nombres de bases de datos de la tabla de metadatos information_schema.schemataque desea mysqldump'd, crear una consulta para devolver esa lista, luego usar esa lista de bases de datos para formular el comando mysqldump.

DATABASES_TO_EXCLUDE="db1 db2 db3"
EXCLUSION_LIST="'information_schema','mysql'"
for DB in `echo "${DATABASES_TO_EXCLUDE}"`
do
    EXCLUSION_LIST="${EXCLUSION_LIST},'${DB}'"
done
SQLSTMT="SELECT schema_name FROM information_schema.schemata"
SQLSTMT="${SQLSTMT} WHERE schema_name NOT IN (${EXCLUSION_LIST})"
MYSQLDUMP_DATABASES="--databases"
for DB in `mysql -ANe"${SQLSTMT}"`
do
    MYSQLDUMP_DATABASES="${MYSQLDUMP_DATABASES} ${DB}"
done
MYSQLDUMP_OPTIONS="--routines --triggers"
mysqldump ${MYSQLDUMP_OPTIONS} ${MYSQLDUMP_DATABASES} > MySQLDatabases.sql

Todo lo que necesita hacer es poner las bases de datos en las que no desea mysqldump'd DATABASES_TO_EXCLUDE

Darle una oportunidad !!!

RolandoMySQLDBA
fuente
No hay necesidad de excluir information_schemaque de todos modos no se está volcando. mysqldump does not dump the INFORMATION_SCHEMA or performance_schema database by default. To dump either of these, name it explicitly on the command line and also use the --skip-lock-tables option. You can also name them with the --databases option. Before MySQL 5.5 mysqldump silently ignores INFORMATION_SCHEMA even if you name it explicitly on the command line. dev.mysql.com/doc/refman/5.5/en/mysqldump.html
Luka
15

Use grep para excluir las bases de datos que no desea:

candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
mysqldump --databases $candidates 

Al mirar /programming/19354870/bash-command-line-and-input-limit parece que podrá manejar largas líneas. De lo contrario siempre puedes

candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
for candidate in $candidates[*]; do
    mysqldump $candidate 
done
crítico
fuente
Uno debe agregar `| pegue -sd "" -` después grepde para pasar de la salida de varias líneas a una sola línea con cada nombre de base de datos separado por un espacio, que es requerido por mysqldump. Entonces el comando serácandidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$" | paste -sd " " -)
Anthony O.
8

No creo que sea posible, pero puede probar esta solución que tendrá que escribir los nombres de todas las bases de datos que desea volcar.

mysqldump -u root -password --databases db1 db2 db3 ... db36 > mydb_dump.sql

Avíseme si la solución ayuda.

Cybermatatu
fuente
1
Conozco este comando. pero es muy largo. Quiero ignorar 4 bases de datos y necesito tomar la copia de seguridad dbs restante.
ashuthosh
3

Incluso aquí hay muchas respuestas excelentes, por lo que esta publicación es solo para agregar una opción más. Por debajo de 2 líneas en la secuencia de comandos, puede llevar a sus servidores todas las copias de seguridad de la base de datos ignorando alguna base de datos.

DB_LIST=`mysql -Nse "SELECT GROUP_CONCAT(SCHEMA_NAME SEPARATOR ' ') FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mysql','information_schema','performance_schema','sys');"`

mysqldump -R -B $DB_LIST > BACKUPNAME.sql
Zafar Malik
fuente
1
Gracias por incluir, sysya que es parte de MySQL 5.7
RolandoMySQLDBA
gracias @RolandoMySQLDBA, siempre recibo ayuda de tus excelentes publicaciones / blogs ... gracias de nuevo por tu cumplido ...
Zafar Malik
1

Muchos siempre han querido que mysqldump ignore las bases de datos.

¿Creería que esa opción existe ahora? No, no en mysqldump.

Oracle (Yuck, toowee, todavía no se sale de la lengua) tiene DataPump (expdb impdp) para volcar las bases de datos Oracle. Desde MySQL 5.7 en la familia de Oracle (todavía daña), el nuevo programa de utilidad de copia de seguridad se llama mysqlpump , que viene con --exclude-bases de datos y otras opciones interesantes . Al igual que su bomba de datos de hermanastros más antigua , mysqlpump también presenta paralelismo para ayudar a acelerar los volcados y dividir el trabajo . En este momento, no me he incorporado al trabajo, pero parece muy prometedor. Cuando me sumerjo profundamente en mysqlpump , podría encontrar que tiene la misma apariencia que la bomba de datos de Oracle .

Si hay alguien en el Universo paralelo de MySQL con historias al respecto, publíquelo aquí.

RolandoMySQLDBA
fuente
0

La respuesta de Rolando es bastante buena, pero quería un guión que se pueda reutilizar en todos los proyectos. Entonces, tomé su guión y lo modifiqué para que pueda hacer cosas como:

$ mysqldump-ignore-databases.sh 'myuser' 'mypwd' 'information_schema mysql performance_schema' '--skip-lock-tables' > mydbs.sql

Aquí está el script modificado:

#!/usr/bin/env bash

# This is an adapted version of Rolando's awesome script at
# /dba//a/35104/94046

# Usage: mysqldump-ignore-databases.sh username password dbs-to-exclude mysqldump-options
# e.g.
#   mysqldumpIgnoreDatabases.sh 'myuser' 'mypwd' 'information_schema mysql performance_schema'
#                               '--skip-lock-tables' > dbs.sql
#
#   mysqldumpIgnoreDatabases.sh 'myuser' 'mypwd' 'mysql' '-h example.com' '-h example.com' > dbs.sql

USERNAME=$1
PASSWORD=$2
DATABASES_TO_EXCLUDE=$3
MYSQLDUMP_OPTIONS=$4
MYSQL_OPTIONS=$5

EXCLUSION_LIST=""
for DB in `echo "${DATABASES_TO_EXCLUDE}"`
do
  if [ "${EXCLUSION_LIST}" != "" ]
  then
    EXCLUSION_LIST="${EXCLUSION_LIST},"
  fi
  EXCLUSION_LIST="${EXCLUSION_LIST}'${DB}'"
done

SQLSTMT="SELECT schema_name FROM information_schema.schemata"
SQLSTMT="${SQLSTMT} WHERE schema_name NOT IN (${EXCLUSION_LIST})"

MYSQLDUMP_DATABASES="--databases"
for DB in `mysql -u${USERNAME} -p${PASSWORD} ${MYSQL_OPTIONS} -ANe"${SQLSTMT}"`
do
  MYSQLDUMP_DATABASES="${MYSQLDUMP_DATABASES} ${DB}"
done

mysqldump -u${USERNAME} -p${PASSWORD} ${MYSQLDUMP_OPTIONS} ${MYSQLDUMP_DATABASES}

(Todavía espero que --ignore-databasese agregue una opción a una versión futura de mysqldump)

redgeoff
fuente
0

Desde MySQL 5.7.8, puede usar mysqlpump(que NO es lo mismo que mysqldump) de la siguiente manera:

mysqlpump --user=user --password --exclude-databases=db1,db2,db3,db4 --result-file=partial_backup.sql

Simplemente reemplace db1,db2,db3,db4con las cuatro bases de datos que desea excluir.

Fuente: Blog del servidor MySQL

Leo Galleguillos
fuente