jueves, 3 de julio de 2025

Análisis de MySQL: Con una Herramienta CLI Potenciada por IA

Análisis de MySQL: Con una Herramienta CLI Potenciada por IA

Como DBAs con MySQL, a menudo vivimos en una ventana de terminal de Linux. También disfrutamos de opciones gratuitas cuando están disponibles. Este post muestra un enfoque que nos permite permanecer en nuestra ventana de terminal y aún así usar una herramienta potenciada por IA. Puedes actualizarlo para usar otros proveedores directos de IA, pero configuré este ejemplo para usar aimlapi.com ya que trae múltiples modelos de IA a tu terminal de forma gratuita con uso limitado o costo muy bajo para más pruebas.

Nota: No soy un portavoz pagado de AIMLAPI ni nada por el estilo - esto es solo un ejemplo sencillo para destacar la idea.

El Problema

Estás viendo una base de datos heredada con cientos de tablas, cada una con relaciones complejas y decisiones de diseño cuestionables tomadas hace años. El proceso usual involucra:

  • Inspección manual del esquema
  • Referencias cruzadas de documentación (si existe)
  • Ejecutar múltiples consultas EXPLAIN
  • Consultar guías de mejores prácticas
  • Buscar segundas opiniones de colegas

Esto toma tiempo y a menudo se pasan cosas por alto.

Un Enfoque Basado en CLI

Podemos aprovechar la IA directamente desde nuestro CLI y hacer numerosas cosas. Ayudar con el análisis de MySQL es solo un ejemplo de cómo este enfoque puede funcionar con nuestras tareas diarias de base de datos. Al combinar las capacidades nativas de MySQL con modelos de IA, todo accesible a través de una interfaz de línea de comandos simple, podemos obtener insights sin salir de nuestro terminal. AIMLAPI proporciona acceso gratuito a más de 100 modelos de IA con uso limitado, haciendo este enfoque accesible. Para pruebas más intensivas, los costos siguen siendo muy razonables.

La Herramienta: AIMLAPI CLI

Así que aquí hay un script bash que proporciona acceso a más de 100 modelos de IA a través de una sola interfaz:

#!/bin/bash
# Herramienta CLI AIMLAPI con acceso a más de 100 modelos de IA
# Archivo: ~/.local/bin/aiml

# Configuración
DEFAULT_MODEL=${AIMLAPI_DEFAULT_MODEL:-"gpt-4o"}
MAX_TOKENS=${AIMLAPI_MAX_TOKENS:-2000}
TEMPERATURE=${AIMLAPI_TEMPERATURE:-0.7}
BASE_URL="https://api.aimlapi.com"
ENDPOINT="v1/chat/completions"

# Códigos de color para salida
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # Sin Color

# Función para imprimir salida coloreada
print_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
print_success() { echo -e "${GREEN}[ÉXITO]${NC} $1"; }
print_warning() { echo -e "${YELLOW}[ADVERTENCIA]${NC} $1"; }
print_error() { echo -e "${RED}[ERROR]${NC} $1"; }
print_model() { echo -e "${PURPLE}[MODELO]${NC} $1"; }

# Atajos de modelos populares
declare -A MODEL_SHORTCUTS=(
    # Modelos OpenAI
    ["gpt4"]="gpt-4o"
    ["gpt4o"]="gpt-4o"
    ["gpt4mini"]="gpt-4o-mini"
    ["o1"]="o1-preview"
    ["o3"]="openai/o3-2025-04-16"
    
    # Modelos Claude  
    ["claude"]="claude-3-5-sonnet-20241022"
    ["claude4"]="anthropic/claude-sonnet-4"
    ["opus"]="claude-3-opus-20240229"
    ["haiku"]="claude-3-5-haiku-20241022"
    ["sonnet"]="claude-3-5-sonnet-20241022"
    
    # Modelos DeepSeek
    ["deepseek"]="deepseek-chat"
    ["deepseek-r1"]="deepseek/deepseek-r1"
    ["reasoner"]="deepseek-reasoner"
    
    # Modelos Google
    ["gemini"]="gemini-2.0-flash"
    ["gemini2"]="gemini-2.0-flash"
    ["gemini15"]="gemini-1.5-pro"
    
    # Modelos Meta Llama
    ["llama"]="meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo"
    ["llama405b"]="meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo"
    
    # Modelos Qwen
    ["qwen"]="qwen-max"
    ["qwq"]="Qwen/QwQ-32B"
    
    # Modelos Grok
    ["grok"]="x-ai/grok-beta"
    ["grok3"]="x-ai/grok-3-beta"
    
    # Modelos Especializados
    ["coder"]="Qwen/Qwen2.5-Coder-32B-Instruct"
)

# Función para resolver atajos de modelos
resolve_model() {
    local model="$1"
    if [[ -n "${MODEL_SHORTCUTS[$model]}" ]]; then
        echo "${MODEL_SHORTCUTS[$model]}"
    else
        echo "$model"
    fi
}

# Función para crear payload JSON usando jq para escape adecuado
create_json_payload() {
    local model="$1"
    local prompt="$2"
    local system_prompt="$3"
    
    local temp_file=$(mktemp)
    echo "$prompt" > "$temp_file"
    
    if [ -n "$system_prompt" ]; then
        jq -n --arg model "$model" \
              --rawfile prompt "$temp_file" \
              --arg system "$system_prompt" \
              --argjson max_tokens "$MAX_TOKENS" \
              --argjson temperature "$TEMPERATURE" \
              '{
                model: $model,
                messages: [{role: "system", content: $system}, {role: "user", content: $prompt}],
                max_tokens: $max_tokens,
                temperature: $temperature
              }'
    else
        jq -n --arg model "$model" \
              --rawfile prompt "$temp_file" \
              --argjson max_tokens "$MAX_TOKENS" \
              --argjson temperature "$TEMPERATURE" \
              '{
                model: $model,
                messages: [{role: "user", content: $prompt}],
                max_tokens: $max_tokens,
                temperature: $temperature
              }'
    fi
    
    rm -f "$temp_file"
}

# Función para llamar a AIMLAPI
call_aimlapi() {
    local prompt="$1"
    local model="$2"
    local system_prompt="$3"
    
    if [ -z "$AIMLAPI_API_KEY" ]; then
        print_error "AIMLAPI_API_KEY no está configurada"
        return 1
    fi
    
    model=$(resolve_model "$model")
    
    local json_file=$(mktemp)
    create_json_payload "$model" "$prompt" "$system_prompt" > "$json_file"
    
    local response_file=$(mktemp)
    local http_code=$(curl -s -w "%{http_code}" -X POST "${BASE_URL}/${ENDPOINT}" \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer $AIMLAPI_API_KEY" \
        --data-binary @"$json_file" \
        -o "$response_file")
    
    if [ "$http_code" -ne 200 ] && [ "$http_code" -ne 201 ]; then
        print_error "Error HTTP $http_code"
        cat "$response_file" >&2
        rm -f "$json_file" "$response_file"
        return 1
    fi
    
    local content=$(jq -r '.choices[0].message.content // empty' "$response_file" 2>/dev/null)
    
    if [ -z "$content" ]; then
        content=$(jq -r '.choices[0].text // .message.content // .content // empty' "$response_file" 2>/dev/null)
    fi
    
    if [ -z "$content" ]; then
        local error_msg=$(jq -r '.error.message // .error // empty' "$response_file" 2>/dev/null)
        if [ -n "$error_msg" ]; then
            echo "Error de API: $error_msg"
        else
            echo "Error: No se puede analizar la respuesta de la API"
        fi
    else
        echo "$content"
    fi
    
    rm -f "$json_file" "$response_file"
}

# Función principal con análisis de argumentos
main() {
    local model="$DEFAULT_MODEL"
    local system_prompt=""
    local prompt=""
    local piped_input=""
    
    if [ -p /dev/stdin ]; then
        piped_input=$(cat)
    fi
    
    # Analizar argumentos
    while [[ $# -gt 0 ]]; do
        case $1 in
            -m|--model)
                model="$2"
                shift 2
                ;;
            -s|--system)
                system_prompt="$2"
                shift 2
                ;;
            *)
                prompt="$*"
                break
                ;;
        esac
    done
    
    # Manejar entrada
    if [ -n "$piped_input" ] && [ -n "$prompt" ]; then
        prompt="$prompt

Aquí están los datos para analizar:
$piped_input"
    elif [ -n "$piped_input" ]; then
        prompt="Por favor analiza estos datos:

$piped_input"
    elif [ -z "$prompt" ]; then
        echo "Uso: aiml [opciones] \"prompt\""
        echo "       comando | aiml [opciones]"
        exit 1
    fi
    
    local resolved_model=$(resolve_model "$model")
    print_info "Consultando $resolved_model..."
    
    local response=$(call_aimlapi "$prompt" "$model" "$system_prompt")
    
    echo ""
    print_model "Respuesta de $resolved_model:"
    echo "----------------------------------------"
    echo "$response" 
    echo "----------------------------------------"
}

# Verificar dependencias
check_dependencies() {
    command -v curl >/dev/null 2>&1 || { print_error "curl requerido pero no instalado."; exit 1; }
    command -v jq >/dev/null 2>&1 || { print_error "jq requerido pero no instalado."; exit 1; }
}

check_dependencies
main "$@"

Este script proporciona acceso a varios modelos de IA a través de atajos simples como claude4, gpt4, grok3, etc. AIMLAPI ofrece acceso gratuito con uso limitado a todos estos modelos, con costos razonables para pruebas adicionales. Bueno para DBAs que quieren experimentar sin romper el presupuesto.

Características del Script

El script incluye ayuda comprensiva. Aquí está lo que muestra aiml --help:

Herramienta CLI AIMLAPI - Acceso a más de 100 Modelos de IA
=============================================================
Uso: aiml [OPCIONES] "prompt"
     comando | aiml [OPCIONES]
Opciones Principales:
  -m, --model MODELO        Modelo a usar (predeterminado: gpt-4o)
  -t, --tokens NÚMERO       Tokens máximos (predeterminado: 2000)
  -T, --temperature FLOAT   Temperatura 0.0-2.0 (predeterminado: 0.7)
  -s, --system PROMPT       Prompt del sistema para comportamiento del modelo
Opciones de Entrada/Salida:
  -f, --file ARCHIVO        Leer prompt desde archivo
  -o, --output ARCHIVO      Guardar respuesta en archivo
  -r, --raw                 Salida cruda (sin formato/colores)
Opciones de Información:
  -l, --list               Listar atajos de modelos populares
  --get-models             Obtener todos los modelos disponibles de la API
  -c, --config             Mostrar configuración actual
  -v, --verbose            Habilitar salida detallada
  -d, --debug              Mostrar información de depuración
  -h, --help               Mostrar esta ayuda
Ejemplos Básicos:
  aiml "explica computación cuántica"
  aiml -m claude "revisa este código"
  aiml -m deepseek-r1 "resuelve este problema matemático paso a paso"
  aiml -m grok3 "¿cuáles son los últimos desarrollos en IA?"
  aiml -m coder "optimiza esta función de Python"
Ejemplos con Pipe:
  ps aux | aiml "analiza estos procesos"
  netstat -tuln | aiml "explica estas conexiones de red"
  cat error.log | aiml -m claude "diagnostica estos errores"
  git diff | aiml -m coder "revisa estos cambios de código"
  df -h | aiml "analiza el uso del disco y sugiere limpieza"
Operaciones con Archivos:
  aiml -f prompt.txt -o response.txt
  aiml -f large_dataset.csv -m llama405b "analiza estos datos"
  cat script.py | aiml -m coder -o review.md "revisión de código"
Categorías de Modelos y Atajos:
  OpenAI:     gpt4, gpt4mini, o1, o3
  Claude:     claude, opus, haiku, sonnet, claude4
  DeepSeek:   deepseek, deepseek-r1, reasoner
  Google:     gemini, gemini2, gemma
  Meta:       llama, llama3, llama4, llama405b
  Qwen:       qwen, qwen2, qwq
  Grok:       grok, grok3, grok3mini
  Codificación: coder, codestral
Uso Avanzado:
  aiml -m claude -s "Eres un experto en seguridad" "audita este código"
  aiml -m deepseek-r1 -t 3000 "tarea de razonamiento complejo"
  aiml -v -m grok3 "consulta detallada con logging detallado"
  aiml -d "modo de depuración para solucionar problemas de API"
Descubrimiento de Modelos:
  aiml -l                   # Mostrar atajos populares
  aiml --get-models         # Obtener todos los modelos disponibles de la API
  aiml --config             # Mostrar configuración actual
Variables de Entorno:
  AIMLAPI_API_KEY          - Tu clave AIMLAPI (requerida)
  AIMLAPI_DEFAULT_MODEL    - Modelo predeterminado (opcional)
  AIMLAPI_MAX_TOKENS       - Tokens máximos predeterminados (opcional)
  AIMLAPI_TEMPERATURE      - Temperatura predeterminada (opcional)
Consejos Profesionales:
  • Usa coder para tareas de programación y revisiones de código
  • Usa deepseek-r1 para razonamiento complejo y problemas matemáticos
  • Usa claude4 para análisis detallado y contenido de formato largo
  • Usa grok3 para eventos actuales e información en tiempo real
  • Usa gpt4mini para preguntas rápidas para ahorrar en costos de API
  • Envía salida de comandos directamente: comando | aiml "analiza esto"
  • Usa -v para salida detallada para ver qué modelo se está usando
  • Usa --get-models para ver todos los más de 100 modelos disponibles

¡Acceso a más de 100 modelos de IA a través de una interfaz simple!

Ejemplo: La Tabla City

Aquí está cómo esto funciona con un análisis real de tabla MySQL. Analizaré una tabla City de la clásica base de datos World (de https://dev.mysql.com/doc/index-other.html Bases de Datos de Ejemplo) usando tres modelos de IA diferentes.

El Comando

mysql --login-path=klarson world -e "show create table City\G" | \
aiml --model claude4 "Usando un punto de vista experto en MySQL analiza esta tabla"

Este comando:

  1. Extrae la estructura de la tabla desde MySQL
  2. La envía por pipe a nuestra herramienta de IA
  3. Obtiene análisis de Claude Sonnet 4

Resultados

Análisis de Claude Sonnet 4

Claude 4 proporcionó un análisis bien organizado:

Fortalezas:

  • Clave primaria AUTO_INCREMENT adecuada para eficiencia de InnoDB
  • Restricciones de clave foránea manteniendo integridad referencial
  • Estrategia de indexación apropiada para consultas comunes

Problemas Encontrados:

  • Ineficiencia de Almacenamiento: Usar CHAR(35) para nombres de ciudades de longitud variable desperdicia espacio
  • Limitación del Conjunto de Caracteres: charset latin1 inadecuado para nombres de ciudades internacionales
  • Indexación Subóptima: el índice name_key solo cubre los primeros 5 caracteres

Mejoras Sugeridas:

-- Estructura optimizada sugerida por Claude
CREATE TABLE `City` (
  `ID` int NOT NULL AUTO_INCREMENT,
  `Name` VARCHAR(35) NOT NULL,
  `CountryCode` CHAR(3) NOT NULL,
  `District` VARCHAR(20) NOT NULL,
  `Population` int UNSIGNED NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`),
  KEY `CountryCode` (`CountryCode`),
  KEY `name_idx` (`Name`),
  KEY `country_name_idx` (`CountryCode`, `Name`),
  KEY `population_idx` (`Population`),
  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) 
    REFERENCES `Country` (`Code`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4080 
  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Análisis de Grok 3 Beta

mysql --login-path=klarson world -e "show create table City\G" | \
aiml --model grok3 "Usando un punto de vista experto en MySQL analiza esta tabla"

Grok 3 proporcionó un análisis exhaustivo y detallado cubriendo:

Análisis Técnico Profundo:

  • Análisis de Impacto en Rendimiento: Evaluó la limitación del índice parcial en detalle
  • Beneficios del Motor de Almacenamiento: Confirmó la elección de InnoDB para integridad transaccional
  • Optimización de Tipos de Datos: Recomendaciones detalladas de ahorro de espacio con ejemplos

Consideraciones Avanzadas:

  • Recomendaciones de indexación de texto completo para búsquedas de nombres de ciudades
  • Procedimientos de migración de conjunto de caracteres con comandos específicos
  • Estrategias de particionado para conjuntos de datos grandes

Guías de Implementación:

-- Sugerencia de migración de conjunto de caracteres de Grok
ALTER TABLE City CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- Recomendación de índice de texto completo
ALTER TABLE City ADD FULLTEXT INDEX name_fulltext (Name);

Análisis de GPT-4o

mysql --login-path=klarson world -e "show create table City\G" | \
aiml --model gpt4 "Usando un punto de vista experto en MySQL analiza esta tabla"

GPT-4o se enfocó en mejoras prácticas y directamente accionables:

Evaluación Pragmática:

  • Validó el diseño de clave primaria AUTO_INCREMENT
  • Confirmó los beneficios de restricciones de clave foránea para integridad de datos
  • Identificó limitaciones del conjunto de caracteres para aplicaciones globales

Sugerencias Listas para Implementar:

  • Comandos ALTER TABLE específicos para optimización inmediata
  • Recomendaciones de análisis de patrones de consulta
  • Criterios de evaluación de efectividad de índices

El Poder del Análisis Multi-Modelo

Lo que hace valioso este enfoque es obtener tres perspectivas distintas:

  1. Claude 4: Proporciona análisis detallado y estructurado con soluciones de código concretas
  2. Grok 3: Ofrece cobertura comprensiva con estrategias de optimización avanzadas
  3. GPT-4o: Entrega recomendaciones prácticas y directamente accionables

Cada modelo aporta fortalezas únicas:

  • Diferentes puntos focales: Optimización de almacenamiento vs. rendimiento vs. mantenibilidad
  • Niveles de profundidad variables: Desde victorias rápidas hasta mejoras arquitectónicas
  • Estilos de análisis diversos: Estructurado vs. comprensivo vs. práctico

Más Allá de MySQL: Otros Ejemplos de CLI

Ya que podemos enviar por pipe cualquier salida de comando a la herramienta de IA, aquí hay algunos otros ejemplos útiles:

Administración del Sistema

# Analizar procesos del sistema
ps aux | aiml "¿qué procesos están usando más recursos?"

# Verificar uso de disco
df -h | aiml "analiza el uso del disco y sugiere limpieza"

# Conexiones de red
netstat -tuln | aiml "explica estas conexiones de red"

# Logs del sistema
tail -50 /var/log/syslog | aiml "¿hay errores preocupantes en estos logs?"

Análisis de Archivos y Directorios

# Archivos grandes
find /var -size +100M | aiml "organiza estos archivos grandes por tipo"

# Problemas de permisos
ls -la /etc/mysql/ | aiml "verifica estos permisos de archivo para seguridad"

# Revisión de configuración
cat /etc/mysql/my.cnf | aiml "revisa esta configuración de MySQL"

Análisis de Logs

# Logs de Apache
tail -100 /var/log/apache2/error.log | aiml "resume estos errores del servidor web"

# Logs de autenticación
grep "Failed password" /var/log/auth.log | aiml "analiza estos intentos de login fallidos"

El punto es que puedes enviar por pipe casi cualquier cosa para obtener análisis rápido sin salir de tu terminal.

Implementando el Flujo de Trabajo

Instrucciones de Configuración

1. Instalar Dependencias:

# Instalar herramientas requeridas
sudo apt install curl jq mysql-client

# Crear el directorio del script
mkdir -p ~/.local/bin

# Hacer el script ejecutable
chmod +x ~/.local/bin/aiml

2. Configurar Acceso a la API:

# Obtén tu clave gratuita de AIMLAPI de https://aimlapi.com (nivel gratuito con uso limitado)
export AIMLAPI_API_KEY="tu-clave-api-gratuita-aquí"
echo 'export AIMLAPI_API_KEY="tu-clave-api-gratuita-aquí"' >> ~/.bashrc

3. Probar la Configuración:

# Verificar configuración
aiml --config

# Probar funcionalidad básica
echo "SELECT VERSION();" | aiml "explica este SQL"

Patrones de Uso Práctico

Análisis Rápido de Tabla

# Analizar una tabla específica
mysql -e "SHOW CREATE TABLE usuarios\G" mibd | \
aiml -m claude4 "Analiza esta estructura de tabla MySQL"

Comparar Diferentes Perspectivas de Modelos

# Obtener múltiples puntos de vista sobre la misma tabla
TABLE_DDL=$(mysql -e "SHOW CREATE TABLE pedidos\G" ecommerce)

echo "$TABLE_DDL" | aiml -m claude4 "análisis de tabla MySQL"
echo "$TABLE_DDL" | aiml -m grok3 "revisión de optimización de rendimiento" 
echo "$TABLE_DDL" | aiml -m gpt4 "sugerencias de mejora práctica"

Analizar Múltiples Tablas

# Análisis rápido de todas las tablas en una base de datos
mysql -e "SHOW TABLES;" mibd | \
while read tabla; do
  echo "=== Analizando $tabla ==="
  mysql -e "SHOW CREATE TABLE $tabla\G" mibd | \
  aiml -m gpt4mini "evaluación rápida de esta tabla"
done

Análisis de Índices

# Revisar uso y optimización de índices
mysql -e "SHOW INDEX FROM nombretabla;" basededatos | \
aiml -m deepseek "sugiere optimizaciones de índices para esta tabla MySQL"

Análisis de Rendimiento de Consultas

# Analizar consultas lentas
mysql -e "SHOW PROCESSLIST;" | \
aiml -m grok3 "identifica problemas potenciales de rendimiento en estos procesos MySQL"

Por Qué AIMLAPI Hace Esto Posible para DBAs

Acceso Gratuito con Costos Razonables: AIMLAPI proporciona acceso gratuito con uso limitado a más de 100 modelos de IA, con precios muy razonables para pruebas adicionales. Esto lo hace perfecto para DBAs que quieren experimentar sin comprometerse a suscripciones costosas.

Diversidad de Modelos: Acceso a modelos de diferentes proveedores (OpenAI, Anthropic, Google, Meta, etc.) significa que obtienes perspectivas variadas y áreas de expertise.

Sin Atadura a Proveedores: Puedes experimentar con diferentes modelos para encontrar lo que funciona mejor para tus necesidades específicas sin compromisos a largo plazo.

Nativo del Terminal: Se mantiene en tu ambiente cómodo de Linux donde ya estás haciendo tu trabajo de MySQL.

Guía de Selección de Modelos

Diferentes modelos sobresalen en diferentes aspectos del análisis de MySQL:

# Para análisis estructural detallado
aiml -m claude4 "revisión comprensiva de estructura de tabla"

# Para análisis enfocado en rendimiento  
aiml -m grok3 "recomendaciones de optimización de rendimiento"

# Para sugerencias rápidas y prácticas
aiml -m gpt4 "mejoras inmediatas y accionables"

# Para razonamiento complejo sobre compromisos
aiml -m deepseek-r1 "análisis de compromisos de optimización compleja"

# Para verificaciones rápidas y económicas
aiml -m gpt4mini "evaluación breve de tabla"

miércoles, 16 de abril de 2025

Laboratorio doméstico

https://anothermysqldba.blogspot.com/2025/04/homelab.html 

Sólo para travesura...

Existen numerosas opciones para probar MySQL y instancias de bases de datos generales.

Este es solo un ejemplo de cómo puede usar  Proxmox  para tener una configuración simple y rápida para pruebas y acceso repetibles.

Este ejemplo es una opción agradable y económica para tener un laboratorio en casa para MySQL y cualquier otra cosa que desees.

La virtualización de laboratorio en casa que elegí fue  Proxmox  y  Openmediavaul  para almacenamiento NFS extendido (no estoy 100% convencido de  Openmediavault , Debian solo podría hacerlo)

Hardware Elegí una configuración simple y compacta:

Esta virtualización también le permite tener un entorno que puede ejecutarse según sea necesario, apagarse o incluso alejarse y regresar cuando lo desee. 

También le permite clonar cada instancia para instancias adicionales y realizar pruebas si lo desea una vez configurado. 

Esta será una configuración directa muy simple en todos estos.

También puede crear dispositivos de bloque para cada directorio de datos o NFS si lo prefiere, pero todas estas serán instalaciones directas locales para demostración.

Objetivo de prueba y demostración:

  • Instalar
  • Escucha
  • Rotación de contraseñas de la bóveda

Base de Debian 

Configuré una instancia de Debian 12 con 4 GB y 4 CPU.
Luego la convertí en plantilla para poder vincular todas las demás instancias desde aquí.
Esto facilita la configuración de otras instancias y permite tener la misma base desde la que empezar.


┌──(root㉿debian12-server)-[~]
└─# uname -a
Linux debian12-server 6.1.0-32-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.129-1 (06/03/2025) x86_64 GNU/Linux

apt install unzip
cd /usr/local/src/
wget https://releases.hashicorp.com/vault/1.4.2/vault_1.4.2_linux_amd64.zip
descomprimir vault_1.4.2_linux_amd64.zip
bóveda mv /usr/bin/
setcap cap_ipc_lock=+ep /usr/bin/vault
# bóveda -v
Bóveda v1.4.2

MariaDB 11 Rolling 

vi /etc/network/interfaces
auto ens18
iface ens18 inet estático
    dirección 192.168.3.100
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4

# nombre de host
mariadb1.sqlhjalp.com

sudo apt-get install apt-transport-https curl
sudo mkdir -p /etc/apt/keyrings
sudo curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'
vi /etc/apt/sources.list.d/mariadb.sources

┌──(raíz㉿mariadb1)-[~]
└─# gato /etc/apt/sources.list.d/mariadb.sources
# MariaDB 11 Lista continua de repositorios - creada el 2025-04-01 15:13 UTC
# https://mariadb.org/download/
Nombre de X-Repolib: MariaDB
Tipos: deb
# deb.mariadb.org es un espejo dinámico si su espejo preferido se desconecta. Consulte https://mariadb.org/mirrorbits/ para más detalles.
# URI: https://deb.mariadb.org/11/debian
URI: https://mirror.its.dal.ca/mariadb/repo/11.rolling/debian
Suites: ratón de biblioteca
Componentes: principales
Firmado por: /etc/apt/keyrings/mariadb-keyring.pgp

┌──(raíz㉿mariadb1)-[~]
└─# apt-get update

┌──(raíz㉿mariadb1)-[~]
└─# apt-get install mariadb-server -y

┌──(raíz㉿mariadb1)-[~]
└─# mariadb
Bienvenido al monitor MariaDB. Los comandos terminan en ; o \g.
Su ID de conexión de MariaDB es 32
Versión del servidor: 11.7.2-MariaDB-deb12 distribución binaria mariadb.org

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab y otros.

Escriba 'help;' o '\h' para obtener ayuda. Escriba '\c' para borrar la instrucción de entrada actual.

MariaDB [(ninguno)]>
MariaDB [(ninguno)]> salir
Adiós

┌──(raíz㉿mariadb1)-[~]
└─# systemctl detener mariadb.service

Para que quede claro, sí, con un servidor vinculado a Proxmox, puedes reiniciarlo y conservará todos tus valores y configuración.

┌──(raíz㉿mariadb1)-[~]
└─# tiempo de actividad
 10:27:29 1 min de actividad, 2 usuarios, promedio de carga: 0,15, 0,11, 0,04

┌──(raíz㉿mariadb1)-[~]
└─# mariadb
Bienvenido al monitor MariaDB. Los comandos terminan en ; o \g.
Su ID de conexión de MariaDB es 33
Versión del servidor: 11.7.2-MariaDB-deb12 distribución binaria mariadb.org

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab y otros.

Escriba 'help;' o '\h' para obtener ayuda. Escriba '\c' para borrar la instrucción de entrada actual.

MariaDB [(ninguno)]> estado
--------------
mariadb desde 11.7.2-MariaDB, cliente 15.2 para debian-linux-gnu (x86_64) que utiliza el contenedor EditLine

ID de conexión: 33
Base de datos actual:
Usuario actual: root@localhost
SSL: El cifrado en uso es TLS_AES_256_GCM_SHA384, el certificado es correcto
Buscador actual: stdout
Usando archivo de salida: ''
Usando delimitador: ;
Servidor: MariaDB
Versión del servidor: 11.7.2-MariaDB-deb12 distribución binaria mariadb.org
Versión del protocolo: 10
Conexión: Localhost a través de socket UNIX
Conjunto de caracteres del servidor: utf8mb4
Conjunto de caracteres de la base de datos: utf8mb4
Conjunto de caracteres del cliente: utf8mb3
Conjunto de caracteres de Conn.: utf8mb3
Zócalo UNIX: /run/mysqld/mysqld.sock
Tiempo de actividad: 1 min 45 s

Hilos: 1 Preguntas: 61 Consultas lentas: 0 Aperturas: 33 Tablas abiertas: 26 Consultas por segundo promedio: 0.580
--------------

Innovación MySQL 

vi /etc/network/interfaces
auto ens18
iface ens18 inet estático
    dirección 192.168.3.101
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4


# apt install gnupg -y
# cd /usr/local/src/
# wget https://dev.mysql.com/get/mysql-apt-config_0.8.33-1_all.deb
# dpkg -i mysql-apt-config_0.8.33-1_all.deb

│¿Qué versión de servidor deseas recibir? │
  MySQL-8.0  
  mysql-innovation <-- Elegí esto
  MySQL-8.4-lts    
  clúster mysql-8.0   
  innovación del clúster MySQL    
  clúster mysql-8.4-lts    
  Ninguno

 ¿Qué producto MySQL desea configurar?                                                                                                                           
 Servidor y clúster MySQL (actualmente seleccionado: mysql-innovation)
 Conectores MySQL (actualmente seleccionado: habilitado)
 De acuerdo

# apt-get update
# apt-get install mysql-server -y

─# mysql -u root -p
Introducir contraseña:
Bienvenido al monitor MySQL. Los comandos terminan en ; o \g.
Su ID de conexión MySQL es 9
Versión del servidor: 9.2.0 MySQL Community Server - GPL

Copyright (c) 2000, 2025, Oracle y/o sus filiales.

Oracle es una marca registrada de Oracle Corporation y/o sus
afiliados. Otros nombres pueden ser marcas comerciales de sus respectivos
propietarios.

Escriba 'help;' o '\h' para obtener ayuda. Escriba '\c' para borrar la instrucción de entrada actual.

mysql> estado
--------------
MySQL versión 9.2.0 para Linux en x86_64 (Servidor comunitario MySQL - GPL)

ID de conexión: 9
Base de datos actual:
Usuario actual: root@localhost
SSL: No en uso
Buscador actual: stdout
Usando archivo de salida: ''
Usando delimitador: ;
Versión del servidor: 9.2.0 MySQL Community Server - GPL
Versión del protocolo: 10
Conexión: Localhost a través de socket UNIX
Conjunto de caracteres del servidor: utf8mb4
Conjunto de caracteres de la base de datos: utf8mb4
Conjunto de caracteres del cliente: utf8mb4
Conjunto de caracteres de Conn.: utf8mb4
Zócalo UNIX: /var/run/mysqld/mysqld.sock
Datos binarios como: Hexadecimal
Tiempo de actividad: 47 segundos

Hilos: 2 Preguntas: 6 Consultas lentas: 0 Aperturas: 119 Tablas vaciadas: 3 Tablas abiertas: 38 Consultas por segundo promedio: 0,127

Clúster NDB de innovación de MySQL 

gato /etc/red/interfaces
auto ens18
iface ens18 inet estático
    dirección 192.168.3.102
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4

auto ens18
iface ens18 inet estático
    dirección 192.168.3.103
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4

auto ens18
iface ens18 inet estático
    dirección 192.168.3.103
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4

# apt install gnupg -y
# cd /usr/local/src/
# wget https://dev.mysql.com/get/mysql-apt-config_0.8.33-1_all.deb
# dpkg -i mysql-apt-config_0.8.33-1_all.deb

│¿Qué versión de servidor deseas recibir?                                                                                                                            
 MySQL-8.0  
 innovación en MySQL     
 MySQL-8.4-lts        
 clúster mysql-8.0       
 mysql-cluster-innovation <-- Elegí esto    
 clúster mysql-8.4-lts   
 Ninguno

 ¿Qué producto MySQL desea configurar?                                                                             
  Servidor y clúster MySQL (actualmente seleccionado: mysql-cluster-innovation)  
  Conectores MySQL (actualmente seleccionado: habilitado)     
  De acuerdo

# apt-get update
# apt-get install mysql-cluster-community-server -y
# apt-get install mysql-cluster-community-management-server <-- podemos elegir más tarde cuál usar
# apt-get install mysql-cluster-community-data-node -y

# vi /etc/mysql/conf.d/mysql.cnf

[mysqld]
# Opciones para el proceso mysqld:
ndbcluster # ejecuta el motor de almacenamiento NDB

[clúster mysql]
# Opciones para procesos de clúster NDB:
ndb-connectstring=192.168.3.102 # ubicación del servidor de administración

# mkdir /var/lib/mysql-cluster
# cd /var/lib/mysql-cluster
# vi config.ini
[ndbd predeterminado]
# Opciones que afectan a los procesos ndbd en todos los nodos de datos:
NoOfReplicas=2 # Número de réplicas de fragmentos
DataMemory=98M # Cuánta memoria asignar para el almacenamiento de datos

[ndb_mgmd]
#Opciones del proceso de gestión:
HostName=192.168.3.102 # Nombre de host o dirección IP del nodo de administración
DataDir=/var/lib/mysql-cluster # Directorio para los archivos de registro del nodo de administración

[ndbd]
# Opciones para el nodo de datos "A":
                                # (una sección [ndbd] por nodo de datos)
HostName=192.168.3.103 # Nombre de host o dirección IP
NodeId=2 # ID de nodo para este nodo de datos
DataDir=/var/lib/mysql/data # Directorio para los archivos de datos de este nodo de datos

[ndbd]
# Opciones para el nodo de datos "B":
HostName=192.168.3.104 # Nombre de host o dirección IP
NodeId=3 # ID de nodo para este nodo de datos
DataDir=/var/lib/mysql/data # Directorio para los archivos de datos de este nodo de datos

[mysqld]
# Opciones del nodo SQL:
HostName=192.168.3.102 # Nombre de host o dirección IP
                                # (se pueden agregar conexiones mysqld adicionales)
                                # especificado para este nodo para varios
                                # propósitos como ejecutar ndb_restore)


┌──(root㉿ndb1)-[/var/lib/mysql-cluster]
└─# ndb_mgmd --initial -f /var/lib/mysql-cluster/config.ini
Servidor de administración de clústeres MySQL mysql-9.2.0 ndb-9.2.0
ADVERTENCIA: --ndb-connectstring se ignora cuando mgmd se inicia con -f o config-file.

┌──(root㉿ndb2)-[/var/lib/mysql-cluster]
└─# ndbd
2025-04-01 11:53:11 [ndbd] INFO: Ángel conectado a '192.168.3.102:1186'
2025-04-01 11:53:12 [ndbd] INFO -- Ángel asignó nodeid: 2

┌──(root㉿ndb3)-[/var/lib/mysql-cluster]
└─# ndbd
2025-04-01 11:53:19 [ndbd] INFO: Ángel conectado a '192.168.3.102:1186'
2025-04-01 11:53:20 [ndbd] INFO -- Ángel asignó nodeid: 3


┌──(root㉿ndb1)-[/var/lib/mysql-cluster]
└─# ndb_mgm
-- Clúster NDB -- Cliente de administración --
ndb_mgm> mostrar
Conectado al servidor de administración en el puerto 1186 192.168.3.102 (usando texto sin cifrar)
Configuración del clúster
---------------------
[ndbd(NDB)] 2 nodo(s)
id=2 @192.168.3.103 (mysql-9.2.0 ndb-9.2.0, Grupo de nodos: 0, *)
id=3 @192.168.3.104 (mysql-9.2.0 ndb-9.2.0, Grupo de nodos: 0)

[ndb_mgmd(MGM)] 1 nodo(s)
id=1 @192.168.3.102 (mysql-9.2.0 ndb-9.2.0)

[mysqld(API)] 1 nodo(s)
id=4 (no conectado, aceptando conexión desde 192.168.3.102)

┌──(root㉿ndb1)-[/var/lib/mysql-cluster]
└─# mysql -u root -p -e "seleccionar @@nombredehost"
Introducir contraseña:
+-------------------+
| @@nombredehost |
+-------------------+
| ndb1.sqlhjalp.com |
+-------------------+

┌──(root㉿ndb2)-[/var/lib/mysql-cluster]
└─# mysql -u root -p -e "seleccionar @@nombredehost"
Introducir contraseña:
+-------------------+
| @@nombredehost |
+-------------------+
| ndb2.sqlhjalp.com |
+-------------------+

┌──(root㉿ndb3)-[/var/lib/mysql-cluster]
└─# mysql -u root -p -e "seleccionar @@nombredehost"
Introducir contraseña:
+-------------------+
| @@nombredehost |
+-------------------+
| ndb3.sqlhjalp.com |
+-------------------+

Servidor Percona 

# gato /etc/red/interfaces
 
auto ens18
iface ens18 inet estático
    dirección 192.168.3.105
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4

# apt install curl gnupg gnupg2 lsb-release -y
# cd /usr/local/src/
# curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb
# dpkg -i percona-release_latest.generic_all.deb
# percona-release habilitar-solo ps-84-lts lanzamiento
# percona-release habilitar la liberación de herramientas
# apt install percona-server-server

┌──(root㉿ps1)-[/usr/local/src]
└─# ps -ef |grep mysql
MySQL 5832 1 0 11:58? 00:00:03 /usr/sbin/mysqld
raíz 5924 501 0 12:04 pts/1 00:00:00 grep --color=auto mysql

┌──(root㉿ps1)-[/usr/local/src]
└─# mysql -u root -p
Introducir contraseña:
Bienvenido al monitor MySQL. Los comandos terminan en ; o \g.
Su ID de conexión MySQL es 9
Versión del servidor: 8.4.4-4 Percona Server (GPL), versión '4', revisión '844fde07'

Copyright (c) 2009-2025 Percona LLC y/o sus afiliados
Copyright (c) 2000, 2025, Oracle y/o sus filiales.

Oracle es una marca registrada de Oracle Corporation y/o sus
afiliados. Otros nombres pueden ser marcas comerciales de sus respectivos
propietarios.

Escriba 'help;' o '\h' para obtener ayuda. Escriba '\c' para borrar la instrucción de entrada actual.

Clúster Percona 

# gato /etc/red/interfaces
iface ens18 inet estático
    dirección 192.168.3.106
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4

iface ens18 inet estático
    dirección 192.168.3.106
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4

iface ens18 inet estático
    dirección 192.168.3.106
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4

# apt install curl gnupg gnupg2 lsb-release -y
# cd /usr/local/src/
# curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb
# dpkg -i percona-release_latest.generic_all.deb
# actualización apta
# configuración de percona-release pxc80
# apt install -y percona-xtradb-cluster

 
gato /etc/my.cnf
[cliente]
socket=/var/run/mysqld/mysqld.sock

[copia de seguridad adicional]
límite de archivos abiertos = 1000000

[mysqld]
id del servidor=1
directorio de datos=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
error de registro=/var/log/mysql/error.log
archivo pid=/var/run/mysqld/mysqld.pid
ruta-de-registro-segura=/var/lib/archivos-mysql/
# El período de expiración del registro binario es de 604800 segundos, lo que equivale a 7 días.
binlog_expire_logs_segundos=604800

userstat = 1

 └─# cat /etc/my.cnf | grep cifrar
pxc-encrypt-cluster-traffic = DESACTIVADO
 
┌──(raíz㉿pxc1)-[/]
└─# cat /etc/my.cnf | grep dirección
dirección_del_clúster_wsrep = gcomm://192.168.3.106,192.168.3.107,192.168.3.108
# Dirección IP del nodo
dirección_del_nodo_wsrep=192.168.3.106

┌──(raíz㉿pxc1)-[/etc/mysql/conf.d]
└─# systemctl start mysql@bootstrap

mysql> muestra el estado como 'wsrep_c%';
+------------------------------+--------------------------------------+
| Nombre_de_variable | Valor |
+------------------------------+--------------------------------------+
| wsrep_cert_deps_distance | 0 |
|wsrep_commit_oooe | 0 |
|wsrep_commit_oool | 0 |
| ventana de confirmación wsrep | 0 |
| tamaño del índice del certificado wsrep | 0 |
| recuento de cubos de certificados wsrep | 1 |
| wsrep_causal_reads | 0 |
| intervalo_cert_wsrep | 0 |
| peso_del_clúster_wsrep | 1 |
| wsrep_cluster_capacidades | |
| id de configuración del clúster wsrep | 1 |
| tamaño del clúster wsrep | 1 |
| uuid del estado del clúster wsrep | 71a6ebf4-0f20-11f0-b4eb-0a0f463a7185 |
| wsrep_cluster_status | Primario |
| wsrep_connected | ENCENDIDO |
+------------------------------+--------------------------------------+
15 filas en conjunto (0,00 segundos)

┌──(raíz㉿pxc2)-[/etc.]
└─# cat /etc/my.cnf | grep dirección
dirección_del_clúster_wsrep = gcomm://192.168.3.106,192.168.3.107,192.168.3.108
# Dirección IP del nodo
dirección_del_nodo_wsrep=192.168.3.107

┌──(raíz㉿pxc2)-[/var/lib/mysql]
└─# rm -Rf *

┌──(raíz㉿pxc2)-[/var/lib/mysql]
└─# ls -tla
total 8
drwxr-x--- 2 mysql mysql 4096 1 de abril 13:36 .
drwxr-xr-x 26 raíz raíz 4096 1 abr 12:34 ..

┌──(raíz㉿pxc2)-[/var/lib/mysql]
└─# systemctl iniciar mysql

┌──(raíz㉿pxc2)-[/etc.]
└─# cat /etc/my.cnf | grep dirección
dirección_del_clúster_wsrep = gcomm://192.168.3.106,192.168.3.107,192.168.3.108
# Dirección IP del nodo
dirección_del_nodo_wsrep=192.168.3.107
 ┌──(raíz㉿pxc3)-[/var/lib/mysql]
└─# rm -Rf *

┌──(raíz㉿pxc3)-[/var/lib/mysql]
└─# systemctl iniciar mysql


mysql> muestra el estado como 'wsrep_c%';
+------------------------------+--------------------------------------+
| Nombre_de_variable | Valor |
+------------------------------+--------------------------------------+
| wsrep_cert_deps_distance | 0 |
|wsrep_commit_oooe | 0 |
|wsrep_commit_oool | 0 |
| ventana de confirmación wsrep | 0 |
| tamaño del índice del certificado wsrep | 0 |
| recuento de cubos de certificados wsrep | 1 |
| wsrep_causal_reads | 0 |
| intervalo_cert_wsrep | 0 |
| peso_del_clúster_wsrep | 3 |
| wsrep_cluster_capacidades | |
| id de configuración del clúster wsrep | 3 |
| tamaño del clúster wsrep | 3 |
| uuid del estado del clúster wsrep | 71a6ebf4-0f20-11f0-b4eb-0a0f463a7185 |
| wsrep_cluster_status | Primario |
| wsrep_connected | ENCENDIDO |
+------------------------------+--------------------------------------+
15 filas en conjunto (0,00 segundos)

Configurar exportadores MySQL y Prometheus 

por cada máquina...

apt install -y prometheus-mysqld-exporter
 
CREAR USUARIO SI NO EXISTE 'prometheus'@'localhost' IDENTIFICADO POR '<PASSWORDHERE>'; 
mysql> mostrar concesiones para 'prometheus'@'localhost'; +------------------------------------------------------------------------------+ | Subvenciones para prometheus@localhost | +------------------------------------------------------------------------------+ | CONCEDER SELECCIONAR, PROCESAR, REPLICACIÓN CLIENTE EN *.* A `prometheus`@`localhost` | +------------------------------------------------------------------------------+ 1 fila en el conjunto (0,00 s) ┌──(raíz㉿pxc1)-[~] └─# ls -ltr /etc/mysql/debian.cnf -rw-r--r-- 1 root root 50 1 de abril 16:52 /etc/mysql/debian.cnf # vi /etc/default/prometheus-mysqld-exporter systemctl reiniciar prometheus-mysqld-exporter.service # systemctl reiniciar prometheus-mysqld-exporter.service

Servidor Prometeo 

raíz@prometheus:/etc/prometheus# vi prometheus.yml


  - nombre_trabajo: mysqld-exporter
    configuraciones estáticas:
      - objetivos:
          - 'mysql1.sqlhjalp.com:9104'
          - 'mariadb1.sqlhjalp.com:9104'
          - 'ps1.sqlhjalp.com:9104'
          - 'pxc1.sqlhjalp.com:9104'
          - 'pxc2.sqlhjalp.com:9104'
          - 'pxc3.sqlhjalp.com:9104'
          - 'ndb1.sqlhjalp.com:9104'
          - 'ndb2.sqlhjalp.com:9104'
          - 'ndb3.sqlhjalp.com:9104'
        etiquetas:
          país: EE. UU.
          db_env: 'inicio'
          entorno: "demo"
          Linux: Debian
          nodouse: servidor


mysql_up{entorno="demo"}

Valor del elemento
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="mariadb1.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="mysql1.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="ndb1.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="ndb2.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="ndb3.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="ps1.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="pxc1.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="pxc2.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="pxc3.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1

Configuración de la cuenta de Vault 

mysql>CREAR ROL SI NO EXISTE vaultaccess;
mysql> CONCEDER SELECCIONAR, INSERTAR, ACTUALIZAR, ELIMINAR, CREAR, ELIMINAR, RECARGAR, PROCESAR, ARCHIVO, REFERENCIAS, ÍNDICE, ALTERAR, MOSTRAR BASES DE DATOS, SUPER, CREAR TABLAS TEMPORALES, BLOQUEAR TABLAS, EJECUTAR, CREAR VISTA, MOSTRAR VISTA, CREAR USUARIO, EVENTO, DISPARADOR, CREAR ESPACIO DE TABLA, CREAR ROL, ELIMINAR ROL EN *.* A `vaultaccess`@`%` CON OPCIÓN DE CONCESIÓN;
 
CREAR USUARIO `vaultadmin`@`%` IDENTIFICADO POR '<PASSWORDHERE>' ROL PREDETERMINADO `vaultaccess`@`%` NO REQUIERE CONTRASEÑA NINGUNA CADUCIDAD DE CONTRASEÑA DESBLOQUEAR CUENTA PREDETERMINADA HISTORIAL DE CONTRASEÑAS INTERVALO DE REUTILIZACIÓN DE CONTRASEÑAS PREDETERMINADA CONTRASEÑA PREDETERMINADA REQUIERE ACTUAL PREDETERMINADA ;
mysql> mostrar concesiones para vaultadmin;

CREAR ROL SI NO EXISTE SOLO LECTURA;
CONCEDER SELECCIONAR, EJECUTAR EN *.* A `SOLO LECTURA`@`%` ;

Mariadb

MariaDB [(none)]> CREAR USUARIO `vaultadmin`@`%` IDENTIFICADO POR '<PASSWORDHERE>'; 
MariaDB [(none)]> CONCEDER SELECCIONAR, INSERTAR, ACTUALIZAR, ELIMINAR, CREAR, ELIMINAR, RECARGAR, PROCESAR, ARCHIVO, REFERENCIAS, ÍNDICE, ALTERAR, MOSTRAR BASES DE DATOS, SUPER, CREAR TABLAS TEMPORALES, BLOQUEAR TABLAS, EJECUTAR, CREAR VISTA, MOSTRAR VISTA, CREAR USUARIO, EVENTO, DISPARADOR, CREAR ESPACIO DE TABLA EN *.* A `vaultadmin`@`%` CON OPCIÓN DE CONCESIÓN;

Motor de base de datos Vault: se repite por instancia de base de datos 

bóveda escribir base de datos/config/MYSQL plugin_name=mysql-database-plugin connection_url="{{nombre de usuario}}:{{contraseña}}@tcp(mysql1.sqlhjalp.com:3306)/" roles_permitidos="mi-rol" nombre_de_usuario="vaultadmin" contraseña="<CONTRASEÑA>"
bóveda lee base de datos/configuración/MYSQL Valor clave --- ----- roles permitidos [] detalles_de_conexión map[backend:base_de_datos url_de_conexión:{{nombre_de_usuario}}:{{contraseña}}@tcp(mysql1.sqlhjalp.com:3306)/ duración_máxima_de_conexión:0s conexiones_máximas_inactivas:0 conexiones_máximas_abiertas:4 nombre_de_usuario:vaultadmin] deshabilitar_rotación_automatizada falso política de contraseñas n/a nombre_del_complemento complemento-de-base-de-datos-mysql plugin_version n/a declaraciones de rotación de credenciales raíz [] período de rotación 0 s horario de rotación n/a ventana de rotación 0 rotación de importación de rol estático de salto falso verificar_conexión verdadero base de datos de lectura de bóveda/roles/DEMOREADONLY Valor clave --- ----- creation_statements [CREAR USUARIO '{{name}}'@'%' IDENTIFICADO POR '{{password}}'; CONCEDER SELECCIONAR *.* A '{{name}}'@'%';] tipo_de_credencial contraseña nombre_base_datos MYSQL valor predeterminado_ttl 1h máx. ttl 24 h renovar_declaraciones [] declaraciones_de_revocación [ELIMINAR USUARIO SI EXISTE '{{nombre}}'@'%';] declaraciones_de_reversión []

Ejemplo de usuario dinámico de Vault 

base de datos de lectura de bóveda/creds/DEMOREADONLY
Valor clave
--- -----
base de datos de id de arrendamiento/creds/DEMOREADONLY/1SACMdnTGXseMewbA6ek1T42
duración del arrendamiento 1h
arrendamiento_renovable verdadero
contraseña -piWu8YfOFxUkAqR347a
nombre de usuario v-contraseña-k-DEMOREADON-HFRYaNGE


mysql> mostrar concesiones para 'v-userpass-k-DEMOREADON-HFRYaNGE'@'%';
+------------------------------------------------------------------------+
| Subvenciones para v-userpass-k-DEMOREADON-HFRYaNGE@% |
+------------------------------------------------------------------------+
| CONCEDER SELECCIONAR EN *.* A `v-userpass-k-DEMOREADON-HFRYaANGE`@`%` |
+------------------------------------------------------------------------+
1 fila en el conjunto (0,00 s)

Además..... 

POSTGRESQL

https://docs.vultr.com/how-to-install-postgresql-on-debian-12

# apt install -y postgresql-common
# /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
# actualización apta
# política de apt-cache postgresql
# apt install postgresql -y
# systemctl iniciar postgresql
# estado del sistema postgresql
# sudo -u postgres psqlsudo -u postgres psql
# postgres=# ALTERAR ROL postgres CON CONTRASEÑA CIFRADA '<contraseña>';
ALTERAR ROL
#

Base de datos Oracle XE 


wget https://download.oracle.com/otn-pub/otn_software/db-express/oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm
wget https://yum.oracle.com/repo/OracleLinux/OL8/appstream/x86_64/getPackage/oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm

# yum install ./oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm ./oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm

# /etc/init.d/oracle-xe-21c configurar

$ exportar ORACLE_SID=XE
$ exportar ORAENV_ASK=NO
$ . /opt/oracle/producto/21c/dbhomeXE/bin/oraenv

ORACLE_HOME = [] ? /opt/oracle/producto/21c/dbhomeXE
La base de Oracle se ha establecido en /opt/oracle


[root@localhost ~]# echo $ORACLE_HOME
/opt/oracle/producto/21c/dbhomeXE
[root@localhost ~]# cd $ORACLE_HOME
[root@localhost dbhomeXE]# pwd
/opt/oracle/producto/21c/dbhomeXE

[root@localhost dbhomeXE]# cd bin

[root@localhost bin]# sqlplus /nolog

SQL*Plus: Versión 21.0.0.0.0 - Producción el jueves 3 de abril de 2025 a las 10:35:15
Versión 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle. Todos los derechos reservados.

SQL>

SQL> CONECTAR SYS COMO SYSDBA
Introducir contraseña:
Conectado.
SQL>

SQL> establecer tamaño de línea 1500
SQL> seleccione nombre de usuario, estado_de_cuenta de DBA_USERS;

NOMBRE DE USUARIO ESTADO DE LA CUENTA
-------------------------------------------------------------------------------------------------------------------------------- --------------------------------
SISTEMA ABIERTO
SISTEMA ABIERTO
XS$NULL BLOQUEADO
OJVMSYS BLOQUEADO
LBACSYS BLOQUEADO
BLOQUEADO FUERA
DBSNMP BLOQUEADO
APPQOSSYS BLOQUEADO
DBSFWUSER BLOQUEADO
GGSYS BLOQUEADO
ANÓNIMO BLOQUEADO
 
SQL> SALIR
Desconectado de Oracle Database 21c Express Edition versión 21.0.0.0.0 - Producción
Versión 21.3.0.0.0

SQLSERVER 

# curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2022.repo
# yum install -y mssql-server
# /opt/mssql/bin/mssql-conf configuración
# estado del sistema mssql-server

curl https://packages.microsoft.com/config/rhel/8/prod.repo | sudo tee /etc/yum.repos.d/mssql-release.repo

# yum install -y mssql-tools18 unixODBC-devel

# yum check-update
# yum update mssql-tools18

echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bash_profile
fuente ~/.bash_profile

# /opt/mssql/bin/mssql-conf establecer-contraseña-sa
Introduzca la contraseña de administrador del sistema SQL Server:
Confirme la contraseña del administrador del sistema SQL Server:
Configurando SQL Server...

# sqlcmd -S localhost -No -U sa

# sqlcmd -S localhost -No -U sa
Contraseña:
1> CREAR BASE DE DATOS TestDB;
2> SELECCIONAR Nombre DE sys.databases;
3> IR
Nombre
--------------------------------------------------------------------------------------------------------------------------------
maestro
base de datos temporal
modelo
base de datos de datos de masas
Base de datos de pruebas

(5 filas afectadas)


USO TestDB;

CREAR TABLA dbo.Inventario
(
    id INT, nombre NVARCHAR (50), cantidad INT, CLAVE PRIMARIA (id)
);
Dios mío

INSERTAR EN dbo.Inventory VALORES (1, 'banana', 150);
INSERTAR EN dbo.Inventory VALORES (2, 'naranja', 154);

IR


SELECCIONAR * DE dbo.Inventario DONDE cantidad > 152;
IR

1> SELECCIONAR * DE dbo.Inventario;
2> IR
id nombre cantidad
----------- -------------------------------------------------- -----------
          1 plátano 150
          2 naranjas 154

MONGODB - PERCONA

https://docs.percona.com/percona-server-for-mongodb/8.0/install/apt.html

# apt install -y gnupg2 gnupg curl
# wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
# dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
# percona-release --help | grep psmdb
psmdb36 psmdb40 psmdb42 psmdb44 psmdb60 psmdb50 psmdb70 psmdb80 psmdb40
psmdb60pro psmdb70pro
psmdb-70-pro psmdb-60-pro
psmdb-36 psmdb-40 psmdb-42 psmdb-44 psmdb-60 psmdb-50 psmdb-70 psmdb-80 psmdb40
psmdb-60-pro psmdb-70-pro
psmdb-70-pro psmdb-60-pro

# percona-release habilita la versión psmdb-80
# actualización apta
# apt install percona-server-mongodb
# apt-cache madison percona-server-mongodb
# ls -ltr /etc/mongod.conf
-rw-r--r-- 1 root root 1403 11 feb 23:56 /etc/mongod.conf

# vi /etc/systemd/system/enable-transparent-huge-pages.service
# cat /etc/systemd/system/enable-transparent-huge-pages.service
[Unidad]
Descripción=Habilitar páginas enormes transparentes (THP)
Dependencias predeterminadas=no
Después de=sysinit.target local-fs.target
Antes=mongod.service

[Servicio]
Tipo=one-shot
ExecStart=/bin/sh -c 'echo siempre | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null && echo defer+madvise | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null && echo 0 | tee /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none > /dev/null && echo 1 | tee /proc/sys/vm/overcommit_memory > /dev/null'

[Instalar]
WantedBy=objetivo básico

# systemctl daemon-reload
# systemctl start habilitar páginas transparentes enormes
# cat /sys/kernel/mm/transparent_hugepage/enabled && cat /sys/kernel/mm/transparent_hugepage/defrag && cat /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory
[siempre] madvise nunca
siempre aplazar [aplazar+madvise] madvise nunca
0
1

# systemctl enable habilitar páginas grandes transparentes
# ls -lr /var/lib/mongodb/
total 0


# systemctl iniciar mongod
# estado del control del sistema mongod
#mongosh
ID de registro actual de Mongosh: 67ed4eb0cd874b942d98ebcf
Conectándose a: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.3.2
MongoNetworkError: conexión ECONNREFUSED 127.0.0.1:27017

MONGODB

https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-debian/

 
# apt-get install gnupg curl
# curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \
   sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg \
  --dearmor
# echo "deb [ firmado por = /usr/share/keyrings/mongodb-server-8.0.gpg ] http://repo.mongodb.org/apt/debian bookworm/mongodb-org/8.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list
# apt-get update
# apt-get install -y mongodb-org
# systemctl daemon-reload
# ulimit -c ilimitado
# ulimit -n 64000
# ulimit -f ilimitado
# ulimit -t ilimitado
# ulimit -l ilimitado
# ulimit -m ilimitado
# ulimit -u 64000
# ulimit -a
tiempo real sin bloqueo (microsegundos, -R) ilimitado
tamaño del archivo principal (bloques, -c) ilimitado
tamaño del segmento de datos (kbytes, -d) ilimitado
prioridad de programación (-e) 0
tamaño de archivo (bloques, -f) ilimitado
señales pendientes (-i) 15471
memoria bloqueada máxima (kbytes, -l) ilimitada
tamaño máximo de memoria (kbytes, -m) ilimitado
archivos abiertos (-n) 64000
tamaño de la tubería (512 bytes, -p) 8
Colas de mensajes POSIX (bytes, -q) 819200
prioridad en tiempo real (-r) 0
tamaño de pila (kbytes, -s) 8192
tiempo de CPU (segundos, -t) ilimitado
máximo de procesos de usuario (-u) 64000
memoria virtual (kbytes, -v) ilimitada
bloqueos de archivos (-x) ilimitados

# systemctl iniciar mongod

# wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
# dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
# percona-release --help | grep psmdb
psmdb36 psmdb40 psmdb42 psmdb44 psmdb60 psmdb50 psmdb70 psmdb80 psmdb40
psmdb60pro psmdb70pro
psmdb-70-pro psmdb-60-pro
psmdb-36 psmdb-40 psmdb-42 psmdb-44 psmdb-60 psmdb-50 psmdb-70 psmdb-80 psmdb40
psmdb-60-pro psmdb-70-pro
psmdb-70-pro psmdb-60-pro

# percona-release habilita la versión psmdb-80
# actualización apta
# apt install percona-server-mongodb
# apt-cache madison percona-server-mongodb
# ls -ltr /etc/mongod.conf
-rw-r--r-- 1 root root 1403 11 feb 23:56 /etc/mongod.conf

# vi /etc/systemd/system/enable-transparent-huge-pages.service
# cat /etc/systemd/system/enable-transparent-huge-pages.service
[Unidad]
Descripción=Habilitar páginas enormes transparentes (THP)
Dependencias predeterminadas=no
Después de=sysinit.target local-fs.target
Antes=mongod.service

[Servicio]
Tipo=one-shot
ExecStart=/bin/sh -c 'echo siempre | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null && echo defer+madvise | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null && echo 0 | tee /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none > /dev/null && echo 1 | tee /proc/sys/vm/overcommit_memory > /dev/null'

[Instalar]
WantedBy=objetivo básico

# systemctl daemon-reload
# systemctl start habilitar páginas transparentes enormes
# cat /sys/kernel/mm/transparent_hugepage/enabled && cat /sys/kernel/mm/transparent_hugepage/defrag && cat /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory
[siempre] madvise nunca
siempre aplazar [aplazar+madvise] madvise nunca
0
1

# systemctl enable habilitar páginas grandes transparentes
# ls -lr /var/lib/mongodb/
total 0


# systemctl iniciar mongod
# estado del control del sistema mongod
#mongosh
ID de registro actual de Mongosh: 67ed4eb0cd874b942d98ebcf
Conectándose a: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.3.2
MongoNetworkError: conexión ECONNREFUSED 127.0.0.1:27017


CASANDRA

https://docs.vultr.com/how-to-install-apache-cassandra-on-debian-12

# actualización apta
# gato /etc/apt/source.list
deb https://deb.debian.org/debian bookworm principal firmware no libre
deb http://deb.debian.org/debian bookworm-updates principal
deb http://deb.debian.org/debian-security bookworm-security principal
deb http://deb.debian.org/debian inestable principal no libre contribuciones

# actualización apta
# apt install curl
# apt install openjdk-17-jdk
# java --versión
openjdk 17.0.14 21/01/2025
Entorno de ejecución de OpenJDK (compilación 17.0.14+7-Debian-1deb12u1)
Máquina virtual de servidor OpenJDK de 64 bits (compilación 17.0.14+7-Debian-1deb12u1, modo mixto, uso compartido)

# echo "deb [firmado por=/etc/apt/keyrings/apache-cassandra.asc] https://debian.cassandra.apache.org 41x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list
# curl -o /etc/apt/keyrings/apache-cassandra.asc https://downloads.apache.org/cassandra/KEYS
# actualización apta
# apt install cassandra

# ls -lr /etc/cassandra/cassandra.yaml
-rw-r--r-- 1 raíz raíz 91468 27 ene 07:28 /etc/cassandra/cassandra.yaml

# vi /etc/cassandra/cassandra.yaml
# systemctl reiniciar cassandra

# ls -lr /var/log/cassandra/
total 0

# estado del control del sistema cassandra
# estado de nodetool
nodetool: No se pudo conectar a '127.0.0.1:7199' - ConnectException: 'Conexión rechazada'.

# cqlsh -u cassandra -p cassandra

Advertencia: usar una contraseña en la interfaz de la línea de comandos puede ser inseguro.
Recomendación: utilice el archivo de credenciales para proporcionar la contraseña de forma segura.

Error de conexión: ('No se puede conectar a ningún servidor', {'127.0.0.1:9042': ConnectionRefusedError(111, "Se intentó conectar a [('127.0.0.1', 9042)]. Último error: Conexión rechazada")})