Tener un dump de las bases de datos es una buena practica, pero asumamos que de las dos formas, de guardar tus bases, elegiste la mas radical.
Introducción
Un respaldo regular te permite deshacer cambios en caso de que estés trasteando en tus sitios web, con lo que puedes ir probando loo que cause algún problema. Respaldos históricos de mas largo plazo también ayudan en caso de que no sepas cuando ha ocurrido algún cambio perjudicial en tu sitio, pero por el momento, yo ya te sugerí un sistema rápido para hacer respaldos de 7 dias. En ese articulo explicaba que se podía automatizar y toda la cosa, pero el resultado era un enorme archivo de dump, conteniendo todas las bases de datos que hayan en tu servidor en un solo enorme archivo.
El problema
Si bien un archivo único permite tener un punto de restauración general para todas tus web, también significa que es un bulto inmenso que no vas a poder controlar fácilmente. Mis sitios non son muy voluminosos, así que a lo mucho el dump completo solo alcanza los 270MB. No es algo complicado de almacenar ni distribuir, pero si que es una pesadilla para los editores de texto.
Al restaurar un volcado de base de datos, el interprete recorre todo el archivo indiscriminadamente, ejecutando todo lo registrado alli. Pero si solo quieres restaurar un solo archivo, probablemente esto sea «gastar pólvora en gallinazos» porque solo quieres restaurar una base de datos. Probablemente la mas pequeña incluso.
No intentes abrirlo desde la consola con un editor de texto. Se colgará tu equipo. Tampoco con un editor visual. Puedes arriesgarte con un editor SQL y tendrías mas suerte, pero es muy probable que se ponga lento y sea pesado de trabajar con el. Estarás sufriendo todo el rato e incluso los cambios mas ligeros pueden ser un tormento. Y lo peor es que modificar un dump de SQL puede provocar errores bien raros que te ahorrarías solo restaurando el volcado original. Lo que necesitas es una forma de recuperar solo la base de datos especifica que quieres restaurar.
La solución
Si eres tan noob como yo y llevaste al colapso tu computador intentando infructuosamente editar un mega archivo de texto, te recomiendo en cambio, la magia del AWK.
AWK es un lenguaje de programación y una herramienta de línea de comandos utilizada para procesar archivos de texto. Permite analizar y manipular datos basándose en patrones, procesando los archivos línea por línea y dividiéndolos en campos (columnas). Es muy útil para filtrar, transformar y generar informes a partir de datos estructurados. El nombre proviene de las iniciales de sus creadores: Alfred Aho, Peter Weinberger y Brian Kernighan.
Puedes usar AWK directo desde la consola, pero es mejor que guardes un script que tenga una logica que buscas de forma congruente. Te sugiero para eso, este script que mediante AWK separa un Dump total en diferentes archivos sql de cada una de las bases contenidas, asumiendo como separador «– Current Database».
Cuando encuentra una de estas líneas, extrae el nombre de la base de datos (dbname). Abre un nuevo archivo llamado nombre_de_la_bd.sql en el directorio especificado. Todas las líneas siguientes se escriben en ese nuevo archivo hasta que se encuentra la línea de cabecera de la próxima base de datos. Finalmente, tendrás un archivo SQL para cada base de datos en tu directorio de salida.
Para ejecutar este código, debes invocarlo de la siguiente manera:
./split_mysqldump.sh archivo_dump_maestro.sql directorio_salida
🖕Recuerda que el nombre del archivo queda a tu criterio. En mi caso le puse split_mysqldump para sonar genial XD
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #!/bin/bash # Script revisado para dividir un dump de multiples bases de datos en archivos individuales. # Uso: ./split_mysqldump_v2.sh <archivo_dump_maestro.sql> <directorio_salida> DUMP_FILE=$1 OUTPUT_DIR=$2 if [ -z "$DUMP_FILE" ] || [ -z "$OUTPUT_DIR" ]; then echo "Uso: $0 <archivo_dump_maestro.sql> <directorio_salida>" exit 1 fi # Crear el directorio de salida si no existe mkdir -p "$OUTPUT_DIR" echo "Directorio de salida: $OUTPUT_DIR" # Usar awk para procesar el archivo y redirigir a archivos individuales awk -v out_dir="$OUTPUT_DIR" ' /^-- Current Database: `[^`]+`/ { # Extraer el nombre de la base de datos match($0, /`[^`]+`/); dbname = substr($0, RSTART+1, RLENGTH-2); # Construir el nombre del archivo de salida output_file = out_dir "/" dbname ".sql"; # Imprimir mensaje de depuración en stderr (consola) print "-> Iniciando volcado para BD: " dbname " en " output_file > "/dev/stderr"; # Cerrar el archivo anterior si existe (para evitar problemas) if (current_file && current_file != output_file) { close(current_file); } current_file = output_file; } { # Escribir la línea actual en el archivo de la BD actual if (current_file) { print $0 >> current_file; } } ' "$DUMP_FILE" echo "Proceso completado. Archivos individuales creados en: $OUTPUT_DIR" |
Una vez que hayas conseguido tus archivos, usa tu comando para poder restaurar la base de datos que necesitas.
mysql -u [usuario] -p < nombre_de_tu_bd.sql
🖕Usa mariadb en lugar de mysql si así tienes instalado.
Explicación
No te recomiendo agarrar y ejecutar códigos encontrados por internet. tampoco el mio, pero te ayudare a entender lo que estas ejecutando al menos, asi, puedes intentar construir uno propio. Pero al menos por experiencia propia, este código me funcionó a mi XD
awk -v out_dir=OUTPUT_DIR ... | 1. Inicialización y Variables de Entrada: El comando se ejecuta con awk. La opción -v out_dir=OUTPUT_DIR pasa una variable externa llamada OUTPUT_DIR (que debe ser reemplazada por la ruta real del directorio de salida al ejecutar el comando) a la variable interna de awk out_dir. |
Current Database | 2. Patrón de Búsqueda: awk procesa el archivo de entrada línea por línea. Este fragmento de texto (Current Database) actúa como un patrón. Cuando una línea del archivo de entrada coincide con este patrón (es decir, la línea contiene "Current Database"), se ejecutan las acciones dentro del bloque. |
match($0, /dbname/) | 3. Extracción del Nombre de la BD: Dentro del bloque de acción, match($0, /dbname/) busca la palabra «dbname» en la línea actual ($0). Esta función es parte del código de ejemplo que describes, aunque la lógica completa para extraer el nombre real de la BD de la línea suele ser más compleja (ej. usando expresiones regulares). Asumiendo que la línea contiene el nombre de la BD, la siguiente parte se encarga de aislarlo. |
dbname = substr($0, RSTART, RLENGTH) | 4. Almacenamiento del Nombre: Utiliza la función substr para extraer el nombre real de la base de datos de la línea actual. RSTART y RLENGTH son variables especiales de awk que se establecen automáticamente por la función match y marcan el inicio y la longitud de la coincidencia encontrada. |
output_file = out_dir "/" dbname ".sql" | 5. Construcción del Nombre del Archivo: Se construye la ruta completa del archivo de salida combinando el directorio de salida (out_dir), el nombre de la base de datos (dbname) y la extensión .sql. |
print "Iniciando volcado para BD: " dbname " en " output_file > "/dev/stderr"; | 6. Salida por pantalla: Muestra el resultado del script en la consola mediante el /dev/stderr |
if (current_file && current_file != output_file) close(current_file) | 7. Cierre del Archivo Anterior: Si ya se estaba escribiendo en un archivo anterior (current_file existe) y este es diferente al nuevo output_file, se cierra el archivo anterior para evitar problemas de escritura simultánea o corrupción de datos. |
current_file = output_file | 8. Actualización del Archivo Actual: La variable current_file se actualiza para apuntar al nuevo archivo de salida que se acaba de determinar. |
if (current_file) print $0 >> current_file | 9. Escritura de la Línea: Finalmente, si existe un archivo actual definido, la línea completa que se está procesando ($0) se escribe (con >>, que significa añadir al final o crear si no existe) en el current_file. |
Conclusión
Si usas Windows e intentas modificar el archivo dump sin cuidado, te encontraras con errores molestos de caracteres. esto es porque tienes que controlar la codificación de caracteres original y en windows se suele cambiar a la codificación que se usa alli. Puedes utilizar Notepad++ pues te dice la codificación y permite cambiar entre ellas, pero de todas formas puedes desbordar la memoria con un archivo de mas de 10mb, así que lo mejor es utilizar un script que separe las bases de datos o directamente exportar en bases individuales.


