Exportar e importar todas as bases de dados MySQL de uma só vez
8 answers
Exportação:
mysqldump -u root -p --all-databases > alldb.sql
Procura a documentaçãopara o mysqldump . Você pode querer 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
Importação:
mysql -u root -p < alldb.sql
Outra solução:
Ele faz 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
Todas as respostas que vejo nesta pergunta podem ter problemas com os conjuntos de caracteres em algumas bases de dados devido ao problema de redireccionar a saída de mysqldump
para um ficheiro dentro do operador da shell >
.
Para resolver este problema, deve fazer a cópia de segurança com um comando como este
mysqldump -u root -p --opt --all-databases -r backup.sql
Para fazer um bom BD restaurar sem qualquer problema com conjuntos de caracteres
mysql -uroot -p --default-character-set=utf8 database
mysql> SET names 'utf8'
mysql> SOURCE backup.sql
Porquê analisar o resultado formatado enquanto o comando mysql pode fazer directamente o que deseja?
databases=`mysql -u $USER -p$PASSWORD --batch --skip-column-names -e "SHOW DATABASES;" | grep -E -v "(information|performance)_schema"`
Lista os nomes das bases de dados e só isto.
Com base nestas respostas fiz um script que faz backup de todas as bases de dados em ficheiros separados, mas depois comprimi-los num arquivo com a data como nome.
Isto não vai pedir a senha, pode ser usado no cron. Para guardar a senha em .my.cnf
assinale esta resposta https://serverfault.com/a/143587/62749
Feito também com comentários para aqueles que não estão muito familiarizados com scripts 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 MySQL porque as tabelas mysql podem ter colunas diferentes. Conceder privilégios pode falhar se estiver sem sorte. Criei este programa (mysql_ export_ grants.SQL ) para transferir as subvenções para importação para a nova base de dados, 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'
A Criar A Cópia De Segurança:
mysqldump -u [user] -p[password]--single-transaction --quick --all-databases | gzip > alldb.sql.gz
Em caso de erro
[[4]]-- Warning: Skipping the data of table mysql.evento. Indique explicitamente a opção --events.Utilizar:
mysqldump -u [user] -p --events --single-transaction --quick --all-databases | gzip > alldb.sql.gz
A Repor A Cópia De Segurança:
gunzip < alldb.sql.gz | mysql -u [user] -p[password]
Espero que ajude.
Mysqldump-uroot-proot databasename > databasename.SQL
Nota: - u "o teu nome de utilizador" - P "sua senha"