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?
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?
Respostas:
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
mysql -u root -p < alldb.sql
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
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 if
e fi
completamente. Na variável, ExcludeDatabases
você armazena os nomes dos bancos de dados que não devem ser despejados [normalmente bancos de dados do sistema].
-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;"
U+200C U+200B
entre 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/…
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 mysqldump
um 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;
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.cnf
verifique 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"
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'
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 :)
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:
ExcludeDatabases
mysqldump -uroot -proot --all-database> allDB.sql
nota: -u "seu nome de usuário" -p "sua senha"