Exporte e importe todos os bancos de dados MySQL de uma só vez

354

Eu quero manter um backup de todos os meus bancos de dados MySQL. Eu tenho mais de 100 bancos de dados MySQL. Eu quero exportar todos eles ao mesmo tempo e importá-los novamente para o meu servidor MySQL ao mesmo tempo. Como eu posso fazer isso?

Novo usuário
fonte

Respostas:

775

Exportação:

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

Consulte a documentação do mysqldump . Você pode usar algumas das opções mencionadas nos comentários:

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
fonte
11
mysqldump -uroot -p --opt --all-database> alldb.sql
um codificador
7
mysqldump -uroot -p --all-database --skip-lock-tables> alldb.sql
temple
12
Adicione as opções --verbose ou -v para ver como o dump está progredindo.
bagonyi
4
@ HalilÖzgür na página de manual do mysqldump: "o mysqldump não despeja o banco de dados INFORMATION_SCHEMA ou performance_schema por padrão. Para despejar qualquer um deles, nomeie-o explicitamente na linha de comando e também use a opção --skip-lock-tables."
Mmalone 23/09/2015
2
AVISO , a importação substituirá todos os seus usuários MySQL existentes.
RousseauAlexandre
218

Outra solução:

Faz o backup de cada banco de dados em um arquivo 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
fonte
3
Eu preferiria essa abordagem, pois isso torna o despejo de todos os bancos de dados como um arquivo diferente.
Arda #
10
Você pode simplificar / melhorar um pouco o script: Substitua a 9ª linha [database = ...] por estas duas linhas: ExcludeDatabases="Database|information_schema|performance_schema|mysql"[next line] databases=`-u $USER -p$PASWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`e remova as linhas ife ficompletamente. Na variável, ExcludeDatabasesvocê armazena os nomes dos bancos de dados que não devem ser despejados [normalmente bancos de dados do sistema].
precisa saber é o seguinte
2
@jruzafa Você pode usar -Bse "show databases"para evitar saída de formatação extra e, assim, remover | tr -d "| " | grep -v Database. No meu script de exportação desta linha édatabases=`mysql -u $USER -p$PASSWORD -Bse "SHOW DATABASES;"
miquel
6
Criou um script reverso (importação): gist.github.com/tenold/aa5e107d93c0f54436cb
Corey
11
AVISO: O comentário muito útil de @AlBundy acima contém sequência de caracteres unicode U+200C U+200Bentre o "c" e o "h" da palavra "esquema" . Isso quebra copiar e colar esse bit. Mais discussões sobre esse assunto aqui: meta.stackexchange.com/questions/170970/…
billynoah
29

Todas as respostas que vejo nesta pergunta podem ter problemas com os conjuntos de caracteres em alguns bancos de dados devido ao problema de redirecionar a saída de mysqldumpum arquivo dentro do operador shell >.

Para resolver esse problema, você deve fazer o backup com um comando como este

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

Para fazer uma boa restauração do BD sem nenhum problema com os conjuntos de caracteres. Obviamente, você pode alterar o conjunto de caracteres padrão conforme necessário.

mysql -uroot -p --default-character-set=utf8
mysql> SET names 'utf8';
mysql> SOURCE backup.sql;
NetVicious
fonte
O que -r faz?
Luca Reghellin
3
-r define o nome do arquivo de destino no qual a saída será gravada.
NetVicious 20/08/19
Seria melhor usar utf8mb4 em vez de utf8 para o conjunto de caracteres?
kojow7
11
Depende do que você está armazenando nas suas tabelas. O conjunto de caracteres utf8 possui no máximo 3 bytes para cada caractere. utf8mb4 tem um máximo de 4 bytes para cada caractere. Obviamente, se seu banco de dados estiver em utf8mb4, você deverá usar esse conjunto de caracteres para restaurá-lo.
NetVicious 17/10/19
9

Com base nessas respostas, criei um script que faz backup de todos os bancos de dados em arquivos separados, mas depois os comprime em um único arquivo com data como nome.

Isso não pedirá senha, pode ser usado no cron. Para armazenar a senha, .my.cnfverifique esta resposta https://serverfault.com/a/143587/62749

Feito também com comentários para aqueles que não estão muito familiarizados com os scripts do 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
fonte
11
Que bom que você voltou para contribuir com suas adições. um voto meu
Fr0zenFyr
7

Por que analisar a saída formatada enquanto o comando mysql pode fazer diretamente o que você deseja?

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

Lista os nomes do banco de dados e somente isso.

msn
fonte
3

Tenha cuidado ao exportar e importar para diferentes versões do MySQL, pois as tabelas mysql podem ter colunas diferentes. Conceder privilégios pode falhar se você não tiver sorte. Eu criei este script (mysql_export_grants.sql) para despejar as concessões para importar para o novo banco de dados, apenas no caso de:

#!/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'
Erro do Servidor Interno
fonte
3

Quando você está descartando todo o banco de dados. Obviamente, está tendo grandes dados. Então você pode preferir abaixo para melhor:

Criando backup:

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

Se erro

- Aviso: Ignorando os dados da tabela mysql.event. Especifique a opção --events explicitamente.

Usar:

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

Restaurando o backup:

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

Espero que ajude :)

ashikpatel
fonte
3

Escrevi esse comentário há mais de 4 anos e decidi agora fazer uma resposta.

O script de jruzafa pode ser um pouco simplificado:

#!/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. Os bancos de dados excluídos - predominantemente as tabelas do sistema - são fornecidos na variável ExcludeDatabases
  2. Esteja ciente de que a senha é fornecida na linha de comando. Isso é considerado inseguro. Estude esta pergunta .
Peter VARGA
fonte
0

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

nota: -u "seu nome de usuário" -p "sua senha"

Majutharan Majutharan
fonte
Sua resposta realmente não resolve o problema, porque ele está pedindo para exportar todos os bancos de dados de uma só vez. Talvez você possa melhorar um pouco: mysqldump -uroot -proot --all-databases> allDB.sql nota: -u "seu nome de usuário" -p "password"
Marwan Salim
0

Exportar todos os bancos de dados no Ubuntu

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

OU

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

insira a descrição da imagem aqui

Indal Raj
fonte