Alguma opção para o mysqldump ignorar bancos de dados para backup?


23

Temos 40 bancos de dados em nosso servidor.

Queremos fazer backup de 36 bancos de dados usando o mysqldump. Como posso ignorar os 4 bancos de dados restantes no comando mysqldump? Existe alguma opção para o mysqldump ignorar bancos de dados para backup no MySQL?

Eu conheço o comando geral do mysqldump, mas é muito demorado. Quero ignorar apenas 4 bancos de dados e preciso fazer o backup dbs restante.

Respostas:


16

Em 16 de dezembro de 2011, respondi à pergunta Como você mysqldump tabelas específicas?

Coletei todas as tabelas sem incluir um determinado conjunto de nomes de tabelas.

Usando os mesmos princípios, você pode coletar todos os nomes de banco de dados da tabela de metadados information_schema.schemataque deseja que o mysqldump'd, criar uma consulta para retornar essa lista e, em seguida, usar essa lista de bancos de dados para formular o 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

Tudo o que você precisa fazer é colocar os bancos de dados nos quais você não deseja que o mysqldump'd DATABASES_TO_EXCLUDE

De uma chance !!!


Não há necessidade de excluir information_schemaque não está sendo descartado. 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 bancos de dados que você não deseja:

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

Olhando /programming/19354870/bash-command-line-and-input-limit , parece que você será capaz de lidar com longas filas. Caso contrário, você sempre pode

candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
for candidate in $candidates[*]; do
    mysqldump $candidate 
done

Deve-se adicionar `| cole -sd "" -` após o grepfim de passar da saída multilinha para uma única linha com cada nome de banco de dados separado por um espaço, exigido por mysqldump. Portanto, o comando serácandidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$" | paste -sd " " -)
Anthony O.

8

Eu não acho que é possível, mas você pode tentar estas soluções, que serão necessárias para digitar os nomes de todos os bancos de dados que você deseja despejar.

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

Deixe-me saber se a solução ajuda.


1
Eu conheço esse comando .mas é muito demorado. Quero ignorar 4 bancos de dados e preciso fazer o backup dbs restante.
ashuthosh

3

Mesmo com tantas respostas excelentes, este post é apenas para adicionar mais uma opção. Abaixo de 2 linhas no script, você pode executar todos os backups do servidor em todos os bancos de dados ignorando alguns.

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

1
Obrigado por incluir, sysuma vez que isso faz parte do MySQL 5.7.
RolandoMySQLDBA

graças @RolandoMySQLDBA, eu sempre recebe ajuda de seus excelentes posts / blogs ... obrigado novamente por seu elogio ...
Zafar Malik


1

Muitos sempre quiseram que o mysqldump ignorasse os bancos de dados.

Você acreditaria que essa opção existe agora ??? Não, não no mysqldump.

O Oracle (Yuck, ainda não saiu da língua) possui o DataPump (expdb impdp) para despejar os bancos de dados Oracle. Desde o MySQL 5.7 na família Oracle (ainda sofrendo), o novo programa utilitário de backup chama-se mysqlpump , que vem com --exclude-database e outras opções interessantes. Como seu datapump mais antigo , o mysqlpump também possui paralelismo para ajudar a acelerar despejos e dividir o trabalho . No momento, não me inscrevi no trabalho, mas parece muito promissor. Quando eu mergulho fundo no mysqlpump, posso achar que ele traz a mesma aparência do datapump da Oracle .

Se houver alguém no Universo Paralelo do MySQL com histórias sobre isso, por favor poste aqui.


0

A resposta de Rolando é ótima, mas eu queria um script que pudesse ser reutilizado nos projetos. Então, peguei o script dele e o modifiquei para que você possa fazer coisas como:

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

Aqui está o 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}

(Eu ainda espero que uma --ignore-databaseopção seja adicionada a uma versão futura do mysqldump)


0

Desde o MySQL 5.7.8, você pode usar mysqlpump(que NÃO é o mesmo mysqldump) da seguinte maneira:

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

Apenas substitua db1,db2,db3,db4pelos quatro bancos de dados que você deseja excluir.

Fonte: Blog do Servidor MySQL

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.