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 nuevamente importarlos a mi servidor MySQL al mismo tiempo. ¿Cómo puedo hacer eso?
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 nuevamente importarlos a mi servidor MySQL al mismo tiempo. ¿Cómo puedo hacer eso?
Respuestas:
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
mysql -u root -p < alldb.sql
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
ExcludeDatabases="Database|information_schema|performance_schema|mysql"
[línea siguiente] databases=`-u $USER -p$PASWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`
y elimine las líneas if
y fi
completamente. En la variable ExcludeDatabases
se almacenan los nombres de las bases de datos que no se deben volcar [normalmente las bases de datos del sistema].
-Bse "show databases"
para evitar la salida de formato adicional y, por lo tanto, puede eliminar | tr -d "| " | grep -v Database
. En mi script de exportación, esta línea esdatabases=`mysql -u $USER -p$PASSWORD -Bse "SHOW DATABASES;"
U+200C U+200B
entre la "c" y la "h" de la palabra "esquema" . Esto rompe la copia y pegando ese bit. Más discusión sobre este tema aquí: meta.stackexchange.com/questions/170970/…
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 redirigir la salida 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. Obviamente, puede cambiar el conjunto de caracteres predeterminado según lo necesite.
mysql -uroot -p --default-character-set=utf8
mysql> SET names 'utf8';
mysql> SOURCE backup.sql;
En base a estas respuestas, hice un script que respalda todas las bases de datos en archivos separados, pero luego los comprime en un archivo con la fecha como nombre.
Esto no pedirá contraseña, se puede usar en cron. Para almacenar la contraseña, .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"
¿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"`
Enumera los nombres de las bases de datos y solo esto.
Tenga cuidado al exportar e importar a diferentes versiones de MySQL, ya que las tablas mysql pueden tener diferentes columnas. Los privilegios de concesión pueden no funcionar si no tiene suerte. Creé este script (mysql_export_grants.sql) para volcar las concesiones para importar a 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'
Cuando está volcando toda la base de datos. Obviamente está teniendo grandes datos. Entonces puede preferir a continuación para mejorar:
Crear 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
Restaurar copia de seguridad:
gunzip < alldb.sql.gz | mysql -u [user] -p[password]
Espero que ayude :)
Escribí este comentario hace más de 4 años y decidí responderlo.
El script de jruzafa se puede simplificar un poco:
#!/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 --todas las bases de datos> allDB.sql
nota: -u "tu nombre de usuario" -p "tu contraseña"