Mostrando entradas con la etiqueta Percona. Mostrar todas las entradas
Mostrando entradas con la etiqueta Percona. Mostrar todas las entradas

domingo, 1 de marzo de 2026

¿Necesita cada nodo PXC tener XtraBackup instalado?

Una pregunta que surge regularmente en los foros de Percona: ¿Necesita cada nodo en un Percona XtraDB Cluster (PXC) tener XtraBackup instalado? Es una pregunta justa, especialmente cuando se gestiona un entorno mixto o se intenta minimizar la huella de software en ciertos nodos. Aquí está lo que confirman las mecánicas reales y las pruebas.

La respuesta corta (pero sigue leyendo)

Depende de lo que quieras que haga ese nodo. La sutileza importa mucho aquí, por lo que vale la pena repasar cómo funciona State Snapshot Transfer (SST) en PXC y por qué la presencia —o ausencia— de XtraBackup en un nodo dado es significativa.

Un repaso rápido sobre SST en PXC

Cuando un nuevo nodo se une a un Percona XtraDB Cluster, o cuando un nodo existente ha estado caído el tiempo suficiente como para que Incremental State Transfer (IST) ya no sea posible, el clúster realiza un State Snapshot Transfer (SST). Esto es esencialmente una copia completa de datos desde un nodo donante al nodo que se une.

PXC soporta múltiples métodos SST, configurados en my.cnf:

[mysqld]
wsrep_sst_method = xtrabackup-v2

Los métodos SST disponibles incluyen:

  • xtrabackup-v2 — El método recomendado para PXC, usando Percona XtraBackup; realiza SST sin bloquear el donante por períodos extendidos
  • clone — Disponible en PXC 8.0.22+ usando el Plugin Clone integrado de MySQL; elimina la dependencia de XtraBackup para SST
  • mysqldump — Más lento y bloquea el donante durante la transferencia; no recomendado para producción
  • rsync — Requiere que el donante esté en modo solo lectura durante la transferencia, bloqueando escrituras; tampoco recomendado para clústeres en vivo

El método xtrabackup-v2 ha sido históricamente el enfoque predeterminado y sigue siendo ampliamente utilizado en implementaciones existentes precisamente porque mantiene el nodo donante disponible para escrituras durante la transferencia. Los otros métodos legacy pueden bloquear escrituras en el donante, lo cual es generalmente inaceptable en un clúster de producción. Nota que Percona ha estado recomendando cada vez más el método clone para nuevas instalaciones en PXC 8.0.22 y posteriores, ya que elimina la dependencia de herramientas externas en la capa SST.

¿Dónde necesita estar instalado XtraBackup?

Cuando se activa un SST usando xtrabackup-v2, tanto el donante como el que se une necesitan tener XtraBackup instalado y accesible. Aquí está por qué ambos lados están involucrados:

``````html
  • El donor ejecuta XtraBackup para transmitir los datos de la instantánea hacia afuera
  • El joiner ejecuta XtraBackup — específicamente las utilidades xbstream y xbcrypt — para recibir y aplicar esos datos transmitidos

Si el nodo joiner no tiene XtraBackup instalado y intentas incorporarlo al clúster usando xtrabackup-v2, el SST fallará. El registro de errores en el joiner típicamente mostrará algo como esto:

[ERROR] WSREP: Failed to read 'ready <addr>' from: wsrep_sst_xtrabackup-v2
...
wsrep_sst_xtrabackup-v2: line 522: xbstream: command not found
[ERROR] WSREP: SST failed: 2 (No such file or directory)

Esa es una modalidad de fallo clara e inequívoca. Si xbstream no está presente en el joiner, el SST no se completará.

¿Qué pasa con los nodos que nunca serán joiners?

Técnicamente, si un nodo siempre actuará como donor y nunca necesitará reincorporarse al clúster desde cero, podrías argumentar que solo necesita XtraBackup en su capacidad de donor. Sin embargo, en la práctica, cualquier nodo puede convertirse en joiner — después de un fallo, después de mantenimiento planificado, o después de recuperarse de una partición de red. No hay forma confiable de garantizar que un nodo nunca necesite recibir un SST.

La guía práctica aquí es directa: instala XtraBackup en cada nodo PXC, sin excepción. La sobrecarga de tenerlo instalado es insignificante. El costo de un SST fallido durante una interrupción no planificada no lo es.

La alternativa del Plugin Clone (PXC 8.0.22+)

A partir de PXC 8.0.22, Percona agregó soporte para el MySQL Clone Plugin como método SST. Esto vale la pena saberlo porque elimina completamente la dependencia de XtraBackup para fines de SST:

[mysqld]
wsrep_sst_method = clone

Con el método clone, el Clone Plugin debe estar cargado en todos los nodos:

INSTALL PLUGIN clone SONAME 'mysql_clone.so';
SHOW PLUGINS WHERE Name = 'clone';
+-------+--------+-------+----------------+---------+
| Name  | Status | Type  | Library        | License |
+-------+--------+-------+----------------+---------+
| clone | ACTIVE | CLONE | mysql_clone.so | GPL     |
+-------+--------+-------+----------------+---------+

El método clone es una opción sólida para estandarizar sin XtraBackup como dependencia SST. Dicho esto, XtraBackup aún tiene valor real para tu estrategia de respaldo externo independientemente del método SST que elijas. SST es un mecanismo de sincronización de clúster — no es un respaldo, y nunca debe tratarse como tal.

Verificando tu configuración SST actual

Puedes verificar tu método SST actual y configuraciones relacionadas con Galera con:

SHOW VARIABLES LIKE 'wsrep_sst_method';
+------------------+---------------+
| Variable_name    | Value         |
+------------------+---------------+
| wsrep_sst_method | xtrabackup-v2 |
+------------------+---------------+

Para verificar el estado del clúster y confirmar qué nodo puede estar actuando como donor:

SHOW STATUS LIKE 'wsrep_local_state_comment';
+---------------------------+--------+
| Variable_name             | Value  |
+---------------------------+--------+
| wsrep_local_state_comment | Synced |
+---------------------------+--------+
SHOW STATUS LIKE 'wsrep_connected';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| wsrep_connected | ON    |
+-----------------+-------+
SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

Observaciones prácticas

Algunas cosas que vale la pena notar de trabajar directamente con entornos PXC:

``````html
  • La versión de XtraBackup debe coincidir con la versión de PXC. Usar XtraBackup 2.x con PXC 8.0 provocará fallos en SST. Use Percona XtraBackup 8.0 con PXC 8.0 y confirme la alineación de versiones después de cualquier actualización.
  • Incluso si cambia al método SST clone, mantenga XtraBackup instalado para copias de seguridad programadas. Su estrategia de respaldo y su método SST son preocupaciones separadas y deben tratarse como tales.
  • La variable wsrep_sst_donor le permite especificar un nodo donante preferido, lo cual es útil para dirigir SST lejos de su miembro más ocupado o sensible a la latencia.
  • Si está ejecutando Percona Toolkit junto con PXC, tenga en cuenta cómo funciona la replicación DDL en su versión específica de PXC — el comportamiento de Total Order Isolation (TOI) versus Rolling Schema Upgrade (RSU) difiere y merece una revisión dedicada antes de realizar cambios de esquema en producción.

Resumen

Para responder directamente a la pregunta: si está usando xtrabackup-v2 como su método SST — que sigue siendo el predeterminado en muchas implementaciones existentes de PXC — entonces sí, XtraBackup debe estar instalado en cada miembro del clúster. Cualquier nodo puede ser donante o unidor dependiendo de las circunstancias, y ambos roles requieren que XtraBackup esté presente al usar este método.

Si está en PXC 8.0.22 o posterior y desea eliminar esa dependencia en la capa SST, el método del Plugin Clone es una alternativa viable y cada vez más recomendada por Percona para nuevas implementaciones. Si está comenzando de cero, PXC 8.4 LTS es la versión de soporte a largo plazo actual y el objetivo recomendado para nuevas instalaciones. Incluso al usar clone para SST, XtraBackup sigue siendo la herramienta adecuada para sus trabajos reales de respaldo.

No intente ahorrar unos pocos megabytes de espacio en disco omitiendo XtraBackup en nodos seleccionados. El fallo de SST que eventualmente resulta de esa decisión no es un compromiso que valga la pena hacer.

Recursos

sábado, 21 de febrero de 2026

Funciones JSON de MySQL 8.0: Ejemplos Prácticos e Indexación

This article was originally published in English at AnotherMySQLDBA.

Esta publicación cubre una guía práctica de las funciones JSON de MySQL 8.0. El soporte para JSON ha estado en MySQL desde 5.7, pero 8.0 añadió un conjunto significativo de mejoras —mejores estrategias de indexación, nuevas funciones y índices multi-valor— que hacen que trabajar con datos JSON sea considerablemente más práctico. Lo siguiente documenta varios de los patrones más comúnmente necesarios, incluyendo la salida de EXPLAIN y observaciones de rendimiento que vale la pena conocer.

Esta no es una publicación de debate "JSON vs. relacional". Si estás almacenando JSON en MySQL, probablemente ya tienes tus razones. El objetivo aquí es asegurarte de que estás usando las herramientas disponibles de manera efectiva.

Entorno

mysql> SELECT @@version, @@version_comment\G
*************************** 1. row ***************************
        @@version: 8.0.36
@@version_comment: MySQL Community Server - GPL

Las pruebas se realizaron en una VM con 8GB de RAM y innodb_buffer_pool_size configurado en 4G. Una nota de mantenimiento que vale la pena mencionar: query_cache_type es irrelevante en 8.0 ya que la caché de consultas fue eliminada por completo. Si migraste una instancia de 5.7 y aún tienes esa variable en tu my.cnf, elimínala — MySQL 8.0 lanzará un error de inicio.

Configuración de una Tabla de Prueba

La tabla de prueba simula un patrón bastante común — una aplicación que almacena datos de perfil de usuario y metadatos de eventos como bloques JSON:

CREATE TABLE user_events (
  id          INT UNSIGNED NOT NULL AUTO_INCREMENT,
  user_id     INT UNSIGNED NOT NULL,
  event_data  JSON NOT NULL,
  created_at  DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  INDEX idx_user (user_id)
) ENGINE=InnoDB;

INSERT INTO user_events (user_id, event_data) VALUES
(1, '{"action":"login","ip":"192.168.1.10","tags":["mobile","vpn"],"score":88}'),
(1, '{"action":"purchase","ip":"192.168.1.10","tags":["desktop"],"score":72,"amount":49.99}'),
(2, '{"action":"login","ip":"10.0.0.5","tags":["mobile"],"score":91}'),
(3, '{"action":"logout","ip":"10.0.0.9","tags":["desktop","vpn"],"score":65}'),
(2, '{"action":"purchase","ip":"10.0.0.5","tags":["mobile"],"score":84,"amount":129.00}');

Extracción Básica: JSON_VALUE vs. JSON_EXTRACT

JSON_VALUE() fue introducida en MySQL 8.0.21 y es la forma más limpia de extraer valores escalares con conversión de tipo incorporada. Antes de eso, usabas JSON_EXTRACT() (o la abreviatura ->) y convertías manualmente, lo que funciona pero añade ruido a tus consultas.

-- Pre-8.0.21 approach
SELECT user_id,
       JSON_EXTRACT(event_data, '$.action') AS action,
       CAST(JSON_EXTRACT(event_data, '$.score') AS UNSIGNED) AS score
FROM user_events;

-- Cleaner 8.0.21+ approach
SELECT user_id,
       JSON_VALUE(event_data, '$.action') AS action,
       JSON_VALUE(event_data, '$.score' RETURNING UNSIGNED) AS score
FROM user_events;

Salida de la segunda consulta:

+---------+----------+-------+
| user_id | action   | score |
+---------+----------+-------+
|       1 | login    |    88 |
|       1 | purchase |    72 |
|       2 | login    |    91 |
|       3 | logout   |    65 |
|       2 | purchase |    84 |
+---------+----------+-------+
5 rows in set (0.00 sec)

La cláusula RETURNING es genuinamente útil. Elimina el patrón incómodo de doble conversión y hace que la intención sea más clara al leer el código de la consulta más tarde.

Índices Multi-Valor: El Verdadero Cambiador de Juego

Aquí es donde 8.0 realmente movió la aguja para las cargas de trabajo JSON. Los índices multi-valor, disponibles desde MySQL 8.0.17, te permiten indexar elementos de array dentro de una columna JSON directamente. Así es como se ve en la práctica:

ALTER TABLE user_events
  ADD INDEX idx_tags ((CAST(event_data->'$.tags' AS CHAR(64) ARRAY)));

Aquí es lo que muestra EXPLAIN antes y después en una consulta que filtra por valor de etiqueta:

-- Without the multi-valued index:
EXPLAIN SELECT * FROM user_events
WHERE JSON_CONTAINS(event_data->'$.tags', '"vpn"')\G

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_events
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 5
     filtered: 100.00
        Extra: Using where

-- After adding the multi-valued index:
EXPLAIN SELECT * FROM user_events
WHERE JSON_CONTAINS(event_data->'$.tags', '"vpn"')\G

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_events
   partitions: NULL
         type: range
possible_keys: idx_tags
          key: idx_tags
      key_len: 67
          ref: NULL
         rows: 2
     filtered: 100.00
        Extra: Using where

Barrido completo de tabla reducido a un barrido de rango. En 5 filas esto es trivial, pero en una tabla con millones de filas y filtrado frecuente basado en etiquetas, esa diferencia es significativa. La mejora escala directamente con el tamaño de la tabla y la frecuencia de las consultas.

Un importante inconveniente: MEMBER OF() y JSON_OVERLAPS() también se benefician de los índices multi-valor, pero JSON_SEARCH() no. Esto importa al elegir tu patrón de consulta en tiempo de diseño:

-- This WILL use the multi-valued index:
SELECT * FROM user_events
WHERE 'vpn' MEMBER OF (event_data->'$.tags');

-- This will NOT use it:
SELECT * FROM user_events
WHERE JSON_SEARCH(event_data->'$.tags', 'one', 'vpn') IS NOT NULL;

Aggregating and Transforming JSON

``````html
-- Build a JSON array of actions per user
SELECT user_id,
       JSON_ARRAYAGG(JSON_VALUE(event_data, '$.action')) AS actions
FROM user_events
GROUP BY user_id;

+---------+----------------------+
| user_id | actions              |
+---------+----------------------+
|       1 | ["login","purchase"] |
|       2 | ["login","purchase"] |
|       3 | ["logout"]           |
+---------+----------------------+
3 rows in set (0.01 sec)

-- Summarize into a JSON object keyed by action
SELECT user_id,
       JSON_OBJECTAGG(
         JSON_VALUE(event_data, '$.action'),
         JSON_VALUE(event_data, '$.score' RETURNING UNSIGNED)
       ) AS score_by_action
FROM user_events
GROUP BY user_id;

+---------+--------------------------------+
| user_id | score_by_action                |
+---------+--------------------------------+
|       1 | {"login": 88, "purchase": 72}  |
|       2 | {"login": 91, "purchase": 84}  |
|       3 | {"logout": 65}                 |
+---------+--------------------------------+
3 rows in set (0.00 sec)

JSON_OBJECTAGG() lanzará un error si hay claves duplicadas dentro de un grupo. Esto es importante saberlo antes de encontrártelo en un pipeline ETL de producción. En ese caso, necesitarás desduplicar aguas arriba o manejarlo en la lógica de la aplicación antes de que los datos lleguen a este paso de agregación.

Comprobando SHOW STATUS después de consultas intensivas en JSON

Al evaluar patrones de consultas, comprobar las métricas de handler es un hábito útil:

FLUSH STATUS;

SELECT * FROM user_events
WHERE JSON_VALUE(event_data, '$.score' RETURNING UNSIGNED) > 80;

SHOW STATUS LIKE 'Handler_read%';

+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Handler_read_first         | 1     |
| Handler_read_key           | 0     |
| Handler_read_last          | 0     |
| Handler_read_next          | 4     |
| Handler_read_prev          | 0     |
| Handler_read_rnd           | 0     |
| Handler_read_rnd_next      | 6     |
+----------------------------+-------+
7 rows in set (0.00 sec)

El valor de Handler_read_rnd_next confirma un escaneo completo — no es una sorpresa ya que no hay un índice funcional en el valor de score. Para filtrado basado en score a escala, una columna generada con un índice es la solución correcta:

ALTER TABLE user_events
  ADD COLUMN score_val TINYINT UNSIGNED
    GENERATED ALWAYS AS (JSON_VALUE(event_data, '$.score' RETURNING UNSIGNED)) VIRTUAL,
  ADD INDEX idx_score (score_val);

Después de agregarlo, la misma consulta cae a un escaneo de rango de índice adecuado. Las columnas generadas en campos JSON están disponibles tanto en MySQL 8.0 como en Percona Server 8.0, y siguen siendo el camino más confiable para filtrado de campos JSON escalares a cualquier escala significativa.

Si estás ejecutando Percona Server, pt-query-digest del Percona Toolkit sigue siendo la forma más práctica de identificar qué consultas intensivas en JSON están realmente causando problemas en producción antes de que empieces a agregar índices especulativamente.

Observaciones prácticas

  • Los índices multi-valor (8.0.17+) son una mejora muy esperada y funcionan bien cuando tus patrones de consulta se alinean con JSON_CONTAINS() o MEMBER OF()
  • JSON_VALUE() con RETURNING (8.0.21+) es más limpio que el viejo patrón de casteo después de extraer y vale la pena adoptarlo consistentemente
  • Las columnas generadas más índices siguen siendo el camino más confiable para filtrado de campos JSON escalares a escala
  • Vigila los errores de claves duplicadas en JSON_OBJECTAGG() en datos agrupados — aparece como un error duro en pipelines ETL y puede ser fácil de pasar por alto en pruebas si tus datos de muestra casualmente están limpios
  • Verifica siempre el uso de índices con EXPLAIN — el optimizador no siempre detecta índices multi-valor en cláusulas WHERE complejas, y vale la pena confirmarlo en lugar de asumirlo

Resumen

Las mejoras de JSON en MySQL 8.0 son genuinamente útiles, particularmente los índices multi-valor y JSON_VALUE() con casteo de tipo. No reemplazan un buen diseño de esquema, pero para casos donde el almacenamiento JSON es apropiado o heredado, ahora tienes herramientas reales con las que trabajar en lugar de solo esperar que el optimizador lo resuelva. El patrón de columna generada en particular vale la pena evaluarlo temprano si sabes que ciertos campos JSON se usarán regularmente en cláusulas WHERE.

Referencias útiles:

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")})