Skip to main content

Limpieza de mysql tras una migración: permisos de host antiguos

Introducción

Cuando se realizan migraciones entre servidores, ya sea cPanel a Cpanel, cPAnel a Directamdin,, siempre quedan proquerías que hay que limpiar.

Una de ellas son las entradas en la tabla user de mysql/maridab en la que se conservan los hosts remotos de antiguos servidores.

He visto alguna vez cuando me han contratado para un mantenimiento de un servidor y un tunning, servidores con mas de 1000 usarios mysql, y que llevaban arrastrando 4 o 5 hosts de distintos servidores, de migración en migración.

Luego, claro, mysql va lento.

Nota. No es precismanet la raíz del porblema, peoro cuando en el jardin dejas malas hierbas, al final caban poniendose feo.

Revisión

Accedemos a nuestro mysql

> mysql
SELECT User, Host FROM mysql.user;
+--------------------------+--------------------+
| User                     | Host               |
+--------------------------+--------------------+
| cdbtnet                  | localhost          |
| cdbtnet                  | old.server.com     |
| cdbtnet                  | old2.server.com    |
...

Cramos el script

El escript se ejecuta pasandole un parámetro:

  • El nombre del host a eliminar

ATENCIÓN

ESTE COMO TODOS LOS COMANDOS DE ELIMINACION DEBE HACER LEYYENDOSE, ENTENDIENDOLO Y CON ... BACKUP


#!/bin/bash

# Verificar que se haya pasado un parámetro
if [ $# -eq 0 ]; then
    echo "Debe proporcionar un host para eliminar los usuarios. Uso: $0 <host>"
    exit 1
fi

# Guardar el parámetro proporcionado como el host a eliminar
delete_host=$1

# Variables de conexión a la base de datos
db_user="da_admin"
db_password=$(grep 'passwd' /usr/local/directadmin/conf/mysql.conf | awk -F= '{print $2}')
db_host="localhost"  # Cambia si tu base de datos no está en localhost

# Comando para listar usuarios del host específico
list_users_command="SELECT user, host FROM mysql.user WHERE host='${delete_host}';"

# Conéctate a MySQL y obtiene la lista de usuarios
users=$(mysql -u "$db_user" -p"$db_password" -h "$db_host" -Bse "$list_users_command")

# Verificar si se obtuvieron usuarios
if [ -z "$users" ]; then
    echo "No se encontraron usuarios con host '$delete_host'."
    exit 0
fi

# Generar y ejecutar los comandos de eliminación de usuario
while IFS=$'\t' read -r user host; do
    if [ ! -z "$user" ] && [ ! -z "$host" ]; then
        drop_user_command="DROP USER '$user'@'$host';"
        mysql_command="mysql -u \"$db_user\" -p\"$db_password\" -h \"$db_host\" -e \"$drop_user_command\""
        echo "Ejecutando: $drop_user_command"

        eval $mysql_command

        # Verificar si el comando se ejecutó correctamente
        if [ $? -ne 0 ]; then
            echo "Error al ejecutar: $drop_user_command"
        else
            echo "Usuario eliminado con éxito: $user@$host"
        fi

    fi
done <<< "$users"
chmod +x nombre_script.sh
./nombre_script.sh 5.0.0.0
....
Ejecutando: DROP USER 'tblrmmll_root'@'5.0.0.0';
Comando que se ejecutará: mysql -u "da_admin" -p"ElPaSsWoRd" -h "localhost" -e "DROP USER 'tblrmmll_root'@'5.0.0.0';"
...
Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.