Instalación y Configuración de MySQL 8.0 en CentOS 7

Requisitos Previos del Entorno

Para garantizar un rendimiento óptimo y evitar conflictos durante el despliegue del servidor de base de datos, se debe contar con la siguiente configuración base:

  • Sistema Operativo: CentOS 7.9
  • Memoria RAM: Mínimo 8 GB
  • Almacenamiento: 50 GB dedicados y montados de forma independiente para el directorio de datos.
  • Privilegios: Acceso como usuario root.

Configuración del Firewall

En entornos de red aislados, es común deshabilitar el firewall temporalmente. Sin embargo, para entornos productivos, se debe permitir el tráfico a través del puerto predeterminado.

# Deshabilitar el firewall permanentemente
systemctl disable --now firewalld

# Alternativa: Abrir el puerto 3306 manteniendo el firewall activo
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload

Descarga e Instalación de Binarios

El método de instalación mediante binarios precompilados acelera el despliegue al evitar el proceso de compilación desde el código fuente.

# Descargar el archivo comprimido usando curl
curl -LO https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.30-el7-x86_64.tar.gz

# Descomprimir en el directorio de aplicaciones
tar -zxvf mysql-8.0.30-el7-x86_64.tar.gz -C /opt/

# Renombrar para simplificar la ruta de acceso
cd /opt/
mv mysql-8.0.30-el7-x86_64 mysql

Resolución de Dependencias

Aunque el paquete binario incluye la mayoría de las bibliotecas necesarias, es fundamental verificar la presencia de dependencias críticas del sistema.

# Comprobar bibliotecas faltantes en el binario principal
ldd /opt/mysql/bin/mysqld | grep -i "not found"

# Instalar los paquetes requeridos por el motor InnoDB y la interfaz
yum install -y libaio numactl-libs ncurses-compat-libs

Creación de Usuario Dedicado

Por razones de seguridad, el servicio no debe ejecutarse con privilegios de superusuario. Se crea un usuario y grupo específicos.

groupadd -r dbadmin
useradd -r -g dbadmin -s /sbin/nologin dbadmin

Estructura de Directorios

Para evitar cuellos de botella de E/S, es una práctica recomendada separar los archivos binarios, los datos, los registros y los archivos temporales en diferentes particiones o discos físicos.

# Asignar propiedad del software
chown -R dbadmin:dbadmin /opt/mysql/
chmod -R 755 /opt/mysql/

# Crear la estructura de directorios segregada
mkdir -p /var/lib/mysql_data
mkdir -p /var/log/mysql_logs
mkdir -p /var/run/mysql_tmp

# Crear archivo de log inicial
touch /var/log/mysql_logs/error.log

# Asignar permisos a los directorios de datos y logs
chown -R dbadmin:dbadmin /var/lib/mysql_data /var/log/mysql_logs /var/run/mysql_tmp
chmod -R 750 /var/lib/mysql_data /var/log/mysql_logs /var/run/mysql_tmp

Inicialización del Clúster de Datos

El proceso de inicialización genera las bases de datos del sistema. En MySQL 8.0, el parámetro lower_case_table_names debe configurarse exclusivamente en esta etapa.

/opt/mysql/bin/mysqld --initialize \
  --user=dbadmin \
  --datadir=/var/lib/mysql_data \
  --basedir=/opt/mysql \
  --lower_case_table_names=1

Al finalizar, la consola mostrará una contraseña temporal generada para el usuario root. Este valor es obligatorio para el primer acceso.

Configuración del Servidor (my.cnf)

El archivo de configuración global debe optimizarse según los recursos de hardware disponibles y los requisitos de replicación.

cat > /etc/my.cnf << 'EOF'
[client]
port = 3306
socket = /var/run/mysql_tmp/mysql.sock

[mysql]
no-auto-rehash
prompt="\u@\h [\d]> "

[mysqld]
# Configuración básica
user = dbadmin
port = 3306
basedir = /opt/mysql
datadir = /var/lib/mysql_data
socket = /var/run/mysql_tmp/mysql.sock
pid-file = /var/run/mysql_tmp/mysql.pid

# Internacionalización y compatibilidad
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
lower_case_table_names = 1

# Gestión de conexiones y memoria
open_files_limit = 65535
max_connections = 1000
max_connect_errors = 100000
max_allowed_packet = 512M
interactive_timeout = 600
wait_timeout = 600

# Optimización InnoDB
innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 4
innodb_flush_log_at_trx_commit = 1
innodb_log_file_size = 1G
innodb_open_files = 65535

# Registros y replicación
log-error = /var/log/mysql_logs/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql_logs/slow.log
long_query_time = 2

server-id = 100
log-bin = mysql-bin
binlog_format = row
binlog_row_image = full
sync_binlog = 1
binlog_cache_size = 16M
relay-log = mysql-relay-bin

# Autenticación
authentication_policy = mysql_native_password
secure_file_priv = ''
EOF

chmod 644 /etc/my.cnf

Creación del Servicio Systemd

Entegrar el servicio con el administrador de inicio del sistema operativo garantiza un manejo adecuado de los recursos y reinicios automáticos ante fallos.

cat > /etc/systemd/system/mysqld.service << 'EOF'
[Unit]
Description=MySQL 8.0 Database Server
Documentation=man:mysqld(8)
After=network.target

[Service]
Type=notify
User=dbadmin
Group=dbadmin
ExecStart=/opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=65535
Restart=on-failure
RestartPreventExitStatus=1
TimeoutSec=0

[Install]
WantedBy=multi-user.target
EOF

# Recargar el daemon y habilitar el servicio
systemctl daemon-reload
systemctl enable mysqld
systemctl start mysqld

Primer Inicio y Configuración de Seguridad

Se deben actualizar las credenciales por defecto y configurar las políticas de acceso remoto.

# Crear enlace simbólico para el cliente
ln -s /opt/mysql/bin/mysql /usr/local/bin/mysql

# Acceder con la contraseña temporal
mysql -uroot -p

-- Actualizar la contraseña del administrador local
ALTER USER 'root'@'localhost' IDENTIFIED BY 'SecurePass#2024!';

-- Crear un usuario para conexiones remotas
CREATE USER 'root'@'%' IDENTIFIED BY 'SecurePass#2024!';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

Validación de la Instalación

Para verificar la integridad del motor y la capacidad de procesamiento de consultas, se ejecuta un flujo de trabajo transaccional básico.

-- Generar un esquema de prueba
CREATE DATABASE inventory_system;
USE inventory_system;

-- Definir estructura de datos
CREATE TABLE products (
    product_id INT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(100) NOT NULL,
    stock_quantity INT DEFAULT 0,
    created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Insertar registros de prueba
INSERT INTO products (product_name, stock_quantity) 
VALUES ('Servidor Rack 1U', 15), ('Switch 48 Puertos', 30);

-- Verificar lectura de datos
SELECT * FROM products;

-- Limpieza del entorno de prueba
DROP DATABASE inventory_system;

Etiquetas: MySQL centos InnoDB systemd SQL

Publicado el 7-4 21:12