Categoría: Bases de datos

  • 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).

  • Historial de ejecuciones de jobs SSIS en SQL Server Agent

    SQL Server Agent guarda el historial completo de ejecuciones de todos sus jobs en la base de datos del sistema msdb, pero la información viene en un formato poco amigable — fechas y horas como enteros separados, duraciones codificadas como HHMMSS sin separadores, y estados representados por números. Esta consulta traduce todo eso a algo legible, enfocado específicamente en pasos de tipo SSIS.

    Tablas utilizadas

    TablaDescripción
    msdb.dbo.sysjobsDefinición de los jobs del Agente
    msdb.dbo.sysjobstepsPasos de cada job (tipo, comando, etc.)
    msdb.dbo.sysjobhistoryHistorial de ejecuciones (fecha, duración, estado)

    Las tres se relacionan por job_id (y step_id entre pasos e historial), ya que un job puede tener varios pasos, y cada paso acumula múltiples ejecuciones a lo largo del tiempo.

    La query

    USE msdb;
    GO
    
    SELECT
        j.name                                              AS JobName,
        js.step_id                                          AS StepNo,
        js.step_name                                        AS StepName,
        js.subsystem                                        AS StepType,       -- 'SSIS' para paquetes SSIS
        js.command                                          AS SSISCommand,     -- ruta del paquete o comando
    
        -- Fecha y hora de inicio legibles
        msdb.dbo.agent_datetime(h.run_date, h.run_time)     AS RunStart,
    
        -- Duración formateada HH:MM:SS
        STUFF(STUFF(
            RIGHT(REPLICATE('0', 6) + CAST(h.run_duration AS VARCHAR(6)), 6),
        3, 0, ':'), 6, 0, ':')                              AS Duration_HHMMSS,
    
        -- Duración en segundos (para cálculos / ORDER BY)
        (h.run_duration / 10000 * 3600)
        + ((h.run_duration / 100) % 100 * 60)
        + (h.run_duration % 100)                            AS Duration_Seconds,
    
        -- Fecha fin estimada
        DATEADD(
            SECOND,
            (h.run_duration / 10000 * 3600)
            + ((h.run_duration / 100) % 100 * 60)
            + (h.run_duration % 100),
            msdb.dbo.agent_datetime(h.run_date, h.run_time)
        )                                                   AS RunEnd,
    
        CASE h.run_status
            WHEN 0 THEN 'Failed'
            WHEN 1 THEN 'Succeeded'
            WHEN 2 THEN 'Retry'
            WHEN 3 THEN 'Cancelled'
            WHEN 4 THEN 'In Progress'
        END                                                 AS RunStatus,
    
        h.message                                           AS ResultMessage,
        j.enabled                                           AS JobEnabled
    
    FROM msdb.dbo.sysjobs        j
    JOIN msdb.dbo.sysjobsteps    js ON js.job_id = j.job_id
    JOIN msdb.dbo.sysjobhistory  h  ON h.job_id  = j.job_id
                                    AND h.step_id = js.step_id
    
    WHERE js.subsystem = 'SSIS'
      -- AND j.enabled  = 1          -- descomentar: solo jobs activos
      -- AND h.run_date >= 20250101  -- descomentar: filtrar por fecha (YYYYMMDD)
    
    ORDER BY
        j.name,
        msdb.dbo.agent_datetime(h.run_date, h.run_time) DESC;

    Cómo funciona cada parte

    Fecha y hora legibles

    SQL Server Agent guarda run_date y run_time como dos enteros separados (por ejemplo 20260622 y 143000). La función del sistema msdb.dbo.agent_datetime() los combina y convierte a un DATETIME normal, evitando tener que parsear los enteros a mano.

    Duración: de entero codificado a HH:MM:SS

    run_duration también viene como entero, pero en formato HHMMSS concatenado (por ejemplo, 13045 significa 1 hora, 30 minutos, 45 segundos). El doble STUFF() rellena con ceros a la izquierda hasta 6 dígitos y luego inserta los dos puntos en las posiciones correctas, para que se lea como una duración real.

    Duración en segundos

    Para poder ordenar o hacer cálculos con la duración (algo que el formato HH:MM:SS como texto no permite bien), la query descompone el mismo entero run_duration en horas, minutos y segundos por separado usando división entera y módulo, y los suma todos convertidos a segundos.

    Fecha de fin estimada

    Como sysjobhistory solo guarda la hora de inicio y la duración (no la hora de fin), RunEnd se calcula sumando la duración en segundos (ya calculada arriba) a la fecha de inicio con DATEADD.

    Estado de la ejecución

    El campo run_status es un entero sin significado evidente por sí solo. El CASE lo traduce a los cinco estados posibles que maneja SQL Server Agent: Failed, Succeeded, Retry, Cancelled e In Progress.

    Filtros opcionales

    La query trae dos filtros comentados, útiles según el caso:

    • AND j.enabled = 1 — descomentar para ver únicamente jobs que están activos actualmente (excluye jobs deshabilitados que quedaron en el historial).
    • AND h.run_date >= 20250101 — descomentar para acotar el historial a partir de una fecha específica, en formato YYYYMMDD. Útil en instancias con mucho tiempo de historial acumulado, donde la consulta completa puede ser lenta.

    Variante: solo las ejecuciones fallidas

    Para monitoreo o alertas, suele ser más útil filtrar directamente por las ejecuciones que fallaron, en vez de traer todo el historial:

    -- Agregar a la cláusula WHERE de la query original:
    AND h.run_status = 0  -- solo ejecuciones fallidas

    Notas

    • run_duration está en formato HHMMSS como entero — requiere conversión manual, no es un tipo de dato de duración nativo.
    • agent_datetime(run_date, run_time) convierte los campos enteros a DATETIME legible.
    • Los filtros opcionales comentados permiten activar jobs y/o rango de fechas según la necesidad puntual de cada consulta.