Autor: Francisco

  • Recuperar datos de un backup .vma dividido en partes (Proxmox 8/9)

    Se tiene un respaldo de una máquina virtual de Proxmox dividido en 14 partes de exactamente 20 GB cada una (a excepción de la última, que pesa poco más de 11 GB). El peso total combinado es de aproximadamente 291.8 GB.

    Limitaciones identificadas

    • No se puede montar como un ISO: los respaldos de Proxmox usan un formato empaquetado propietario llamado .vma que Linux no entiende nativamente con el comando mount. Además, la imagen contiene una tabla de particiones interna completa, no un sistema de archivos plano.
    • Espacio en disco: para procesarlo de forma manual en una PC externa, se requiere al menos el doble de espacio (~292 GB extra para la unión, y otros ~292 GB si se extrae el disco virtual completo).

    ¿Qué es realmente un archivo .vma?

    .vma (Virtual Machine Archive) es el formato de contenedor que usa vzdump, la herramienta de respaldo nativa de Proxmox, para empaquetar en un solo archivo: la configuración de la VM (qemu-server.conf), y el contenido crudo de cada disco virtual asociado. No es un sistema de archivos por sí mismo — es un contenedor que hay que extraer primero con la herramienta vma para llegar al disco virtual real (típicamente un .raw), que ya sí contiene una tabla de particiones montable.

    Paso 1: unir las partes secuenciales

    Como los archivos terminan en sufijos alfabéticos ordenados (.part-aa hasta .part-an), se utiliza el comodín de Bash para unirlos en el orden correcto dentro de un solo contenedor comprimido:

    cat vzdump109.part-* > vzdump109.vma.zst

    Paso 2: extraer y montar el contenido

    Escenario A — Si estás en un Linux externo (sin Proxmox)

    Para este método necesitas instalar herramientas de descompresión y utilidades para interactuar con sistemas de archivos virtuales (guestfs-tools):

    # 1. Descomprimir el contenedor VMA de Proxmox
    unzstd vzdump109.vma.zst
    
    # 2. Extraer el disco virtual interno a una carpeta de destino
    vma extract vzdump109.vma ./carpeta_destino
    
    # 3. Montar de forma segura (solo lectura) la partición interna del disco virtual
    mkdir /mnt/disco_vm
    guestmount -a ./carpeta_destino/disk-drive-scsi0.raw -m /dev/sda1 --ro /mnt/disco_vm

    Una vez hecho esto, los archivos de la VM quedan accesibles directamente en la ruta /mnt/disco_vm.

    Escenario B — Si tienes acceso a un servidor Proxmox funcional (método rápido)

    Si dispones de un nodo Proxmox funcional, la vía óptima evita el duplicado de almacenamiento en comandos manuales:

    1. Mueve el archivo final vzdump109.vma.zst al directorio de dumps del servidor (usualmente /var/lib/vz/dump/).
    2. Desde la interfaz web de Proxmox, restaura la VM asignándole un ID genérico que no esté en uso (ej. 999). No enciendas la máquina virtual.
    3. Accede por la terminal SSH de Proxmox y monta directamente el volumen lógico o archivo de disco asignado a esa VM para extraer la información de manera local, sin necesidad de ocupar espacio extra extrayendo archivos .raw.

    También se puede hacer el mismo proceso por línea de comandos, sin pasar por la interfaz web, usando qmrestore directamente:

    qmrestore /var/lib/vz/dump/vzdump109.vma.zst 999

    ¿Esto aplica igual en Proxmox 9?

    Sí — Proxmox VE 9 mantiene el mismo formato .vma y las mismas herramientas (vma, qmrestore, guestmount) sin cambios en el procedimiento descrito arriba. La documentación oficial de vzdump y qmrestore para la versión actual sigue usando exactamente esta sintaxis.

    Hay un caso puntual a tener en cuenta si el respaldo fue creado en un host Proxmox 8.x y se intenta restaurar directamente en un host 9.x: hay reportes en el foro oficial de un error wrong vma extent header checksum durante la restauración cruzada entre versiones. El workaround confirmado es hacer el proceso en dos etapas:

    1. Descomprimir el archivo .vma.gz o .vma.zst a un .vma plano en el host 8.x (donde la restauración funciona sin problema):
    gunzip -c /path/to/backup/vzdump-qemu-VMID-DATE.vma.gz > /mnt/pve/NFS/temp_restore/vzdump-qemu-VMID-DATE.vma
    1. Mover ese .vma ya descomprimido al host 9.x y restaurarlo desde ahí con qmrestore, evitando que el 9.x tenga que descomprimir el archivo original.

    Si el respaldo y la restauración se hacen ambos dentro de la misma versión (8.x con 8.x, o 9.x con 9.x), no hay ningún problema de compatibilidad — el procedimiento de este artículo aplica sin modificaciones.

    Notas finales

    • El Escenario B (con un Proxmox funcional disponible) siempre es preferible: evita duplicar 292+ GB de espacio en disco de forma innecesaria.
    • Nunca enciendas la VM restaurada con un ID temporal si el único objetivo es extraer archivos — así evitas conflictos de red (IP/MAC duplicada) con la VM original si esta sigue existiendo en otro lugar.
    • guestmount siempre debe usarse con --ro (solo lectura) al inspeccionar un disco extraído manualmente, para no arriesgar corromper el sistema de archivos interno por error.
  • MySQL portable en Windows: instalación y conexión con DBeaver

    Versión probada: MySQL 8.0.46 · DBeaver Community — requisito: no se necesitan permisos de administrador.

    Esta guía cubre una instalación completamente portable de MySQL 8 en Windows, útil en equipos corporativos donde no hay acceso de administrador, o simplemente para tener una instancia aislada de pruebas sin tocar el sistema y sin molestar a los departamentos de soporte o a infraestructura.

    1. Descargar MySQL 8

    1. Ir a dev.mysql.com/downloads/mysql
    2. Seleccionar Windows (x86, 64-bit), ZIP Archive
    3. Descargar y descomprimir en una carpeta de tu usuario, por ejemplo:
    C:\Users\TU_USUARIO\Downloads\mysql-8.0.46-winx64\

    2. Crear el archivo de configuración my.ini

    Crear el archivo my.ini en la raíz de la carpeta descomprimida (un nivel arriba de bin\):

    C:\Users\TU_USUARIO\Downloads\mysql-8.0.46-winx64\mysql-8.0.46-winx64\my.ini

    Contenido del archivo (ajustar las rutas a tu usuario):

    [mysqld]
    basedir=C:/Users/TU_USUARIO/Downloads/mysql-8.0.46-winx64/mysql-8.0.46-winx64
    datadir=C:/Users/TU_USUARIO/Downloads/mysql-8.0.46-winx64/mysql-8.0.46-winx64/data
    port=3306

    [client]

    port=3306

    Importante: usar siempre / (forward slash) en las rutas, aunque sea Windows.

    3. Inicializar la base de datos

    Abrir PowerShell (no se requiere administrador) y navegar a la carpeta raíz:

    cd C:\Users\TU_USUARIO\Downloads\mysql-8.0.46-winx64\mysql-8.0.46-winx64

    Ejecutar la inicialización:

    .\bin\mysqld.exe --initialize --console

    Buscar en la salida la línea con la contraseña temporal y copiarla:

    [Note] ... A temporary password is generated for root@localhost: XXXXXXXX

    Si aparece el error data directory has files in it, limpiar primero la carpeta data:

    Remove-Item -Recurse -Force .\data\*

    Luego repetir el comando de inicialización.

    4. Arrancar el servidor

    Desde la misma ventana PowerShell:

    .\bin\mysqld.exe --defaults-file="C:\Users\TU_USUARIO\Downloads\mysql-8.0.46-winx64\mysql-8.0.46-winx64\my.ini" --console

    Dejar esta ventana abierta. Es el proceso del servidor MySQL. Para detenerlo usar Ctrl+C o el comando de apagado del paso siguiente.

    5. Conectar y cambiar la contraseña

    Abrir otra ventana de PowerShell y ejecutar:

    cd C:\Users\TU_USUARIO\Downloads\mysql-8.0.46-winx64\mysql-8.0.46-winx64\bin
    .\mysql.exe -u root -p

    Pegar la contraseña temporal cuando la solicite. Luego cambiarla obligatoriamente:

    ALTER USER 'root'@'localhost' IDENTIFIED BY 'TuNuevaPassword123!';

    6. Apagar el servidor limpiamente

    Cuando necesites detener MySQL, desde PowerShell:

    .\mysqladmin.exe -u root -p shutdown

    7. Script de arranque (opcional)

    Crear un archivo start_mysql.bat en la carpeta raíz para arrancar fácilmente:

    @echo off
    cd /d C:\Users\TU_USUARIO\Downloads\mysql-8.0.46-winx64\mysql-8.0.46-winx64
    .\bin\mysqld.exe --defaults-file="C:\Users\TU_USUARIO\Downloads\mysql-8.0.46-winx64\mysql-8.0.46-winx64\my.ini" --console

    Doble clic en el .bat para arrancar el servidor.

    8. Instalar DBeaver Community

    1. Descargar desde dbeaver.io/download la versión Windows installer
    2. Instalar normalmente (no requiere permisos de administrador si se instala en la carpeta de perfil del usuario)

    9. Conectar DBeaver a MySQL

    1. Abrir DBeaver
    2. Database → New Database Connection → MySQL
    3. Completar los datos:
    CampoValor
    Server Hostlocalhost
    Port3306
    Usernameroot
    PasswordLa que configuraste en el paso 5

    En la primera conexión, DBeaver pedirá descargar el driver de MySQL — clic en Download.

    10. Solucionar error: Public Key Retrieval is not allowed

    Este error es común con MySQL 8. Solucionarlo en la pestaña Driver Properties de la conexión:

    PropertyValue
    allowPublicKeyRetrievaltrue
    useSSLfalse

    Alternativamente, modificar el JDBC URL directamente:

    jdbc:mysql://localhost:3306/?allowPublicKeyRetrieval=true&useSSL=false

    Luego hacer clic en Test Connection para verificar.

    11. Restaurar un dump .sql

    Opción A — Desde CMD (recomendado para archivos grandes)

    Abrir cmd.exe (no PowerShell, ya que PowerShell no soporta redirección con <):

    cd C:\Users\TU_USUARIO\Downloads\mysql-8.0.46-winx64\mysql-8.0.46-winx64\bin
    mysql.exe -u root -p < "C:\ruta\completa\tu_dump.sql"

    Opción B — Desde PowerShell

    Get-Content "C:\ruta\completa\tu_dump.sql" | .\mysql.exe -u root -p

    Opción C — Desde DBeaver

    1. Clic derecho sobre la base de datos → Tools → Execute Script
    2. Seleccionar el archivo .sql
    3. Ejecutar

    Si el dump no incluye CREATE DATABASE, crear la base de datos primero:

    CREATE DATABASE nombre_db;

    Notas adicionales

    • El servidor no se inicia automáticamente al encender el equipo (sin permisos de admin no se puede registrar como servicio de Windows). Hay que arrancarlo manualmente con el .bat del paso 7.
    • Para verificar que el servidor está corriendo antes de conectar, ejecutar desde PowerShell:
    .\bin\mysqladmin.exe -u root -p status
    • IMPORTANTE: En PowerShell, todos los ejecutables deben ir precedidos de .\ (ej. .\mysql.exe, .\mysqld.exe).