tablas - Exportar e importar todas las bases de datos MySQL a la vez
importar base de datos mysql workbench (8)
Exportar:
mysqldump -u root -p --all-databases > alldb.sql
Busque la documentación de mysqldump . Es posible que desee utilizar algunas de las opciones mencionadas en los comentarios:
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
Quiero mantener una copia de seguridad de todas mis bases de datos MySQL. Tengo más de 100 bases de datos MySQL. Quiero exportarlos todos al mismo tiempo y, de nuevo, importarlos a mi servidor MySQL al mismo tiempo. ¿Cómo puedo hacer eso?
¿Por qué analizar la salida formateada mientras el comando mysql puede hacer directamente lo que quieres?
databases=`mysql -u $USER -p$PASSWORD --batch --skip-column-names -e "SHOW DATABASES;" | grep -E -v "(information|performance)_schema"`
Lista los nombres de la base de datos y solo esto.
Basándome en estas respuestas, he creado un script que hace copias de seguridad de todas las bases de datos en archivos separados, pero luego las comprimí en un archivo con la fecha como nombre.
Esto no pedirá contraseña, puede ser usado en cron. Para almacenar la contraseña en .my.cnf
verifique esta respuesta https://serverfault.com/a/143587/62749
Hecho también con comentarios para aquellos que no están muy familiarizados con los scripts de 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"
Cuando estás volcando toda la base de datos. Obviamente está teniendo grandes datos. Así que puedes preferir a continuación para mejor:
Creación de copia de seguridad:
mysqldump -u [user] -p[password]--single-transaction --quick --all-databases | gzip > alldb.sql.gz
Si error
- Advertencia: omitiendo los datos de la tabla mysql.event. Especifique la opción --events explícitamente.
Utilizar:
mysqldump -u [user] -p --events --single-transaction --quick --all-databases | gzip > alldb.sql.gz
Restaurando copia de seguridad:
gunzip < alldb.sql.gz | mysql -u [user] -p[password]
Espero que te ayude :)
Otra solución:
Realiza una copia de seguridad de cada base de datos en un archivo 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
Tenga cuidado al exportar e importar a diferentes versiones de MySQL, ya que las tablas mysql pueden tener diferentes columnas. Los privilegios de subvención pueden dejar de funcionar si no tienes suerte. Creé este script (mysql_export_grants.sql) para volcar las concesiones para importar en la nueva base de datos, por si acaso:
#!/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''
Todas las respuestas que veo en esta pregunta pueden tener problemas con los juegos de caracteres en algunas bases de datos debido al problema de redireccionar la salida de mysqldump
a un archivo dentro del operador de shell >
.
Para resolver este problema, debe hacer la copia de seguridad con un comando como este
mysqldump -u root -p --opt --all-databases -r backup.sql
Para hacer una buena restauración de BD sin ningún problema con los juegos de caracteres
mysql -uroot -p --default-character-set=utf8 database
mysql> SET names ''utf8''
mysql> SOURCE backup.sql
mysqldump -uroot -proot databasename> databasename.sql
nota: -u "tu nombre de usuario" -p "tu contraseña"