Manejo y registro de errores en MySQL

MySQLMySQLBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, explorarás técnicas de manejo de errores y registro en MySQL. El laboratorio cubre la habilitación del registro general de consultas para registrar todas las declaraciones SQL ejecutadas en el servidor, lo cual es útil para la depuración y la auditoría. Aprenderás cómo habilitar el registro general de consultas configurando la variable del sistema general_log en ON y cómo verificar o modificar la ubicación del archivo de registro utilizando la variable general_log_file.

El primer paso consiste en conectarte al servidor MySQL como usuario root y luego habilitar el registro general de consultas de forma global. También aprenderás cómo ver la ubicación actual del archivo de registro y cómo cambiarla a una ruta diferente, asegurándote de que el proceso del servidor MySQL tenga permisos de escritura en la ubicación especificada.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mysql(("MySQL")) -.-> mysql/BasicKeywordsandStatementsGroup(["Basic Keywords and Statements"]) mysql(("MySQL")) -.-> mysql/SystemManagementToolsGroup(["System Management Tools"]) mysql(("MySQL")) -.-> mysql/AdvancedFeaturesGroup(["Advanced Features"]) mysql/BasicKeywordsandStatementsGroup -.-> mysql/create_database("Database Creation") mysql/BasicKeywordsandStatementsGroup -.-> mysql/create_table("Table Creation") mysql/BasicKeywordsandStatementsGroup -.-> mysql/select("Data Retrieval") mysql/BasicKeywordsandStatementsGroup -.-> mysql/insert("Data Insertion") mysql/BasicKeywordsandStatementsGroup -.-> mysql/update("Data Update") mysql/SystemManagementToolsGroup -.-> mysql/show_variables("Configuration Overview") mysql/AdvancedFeaturesGroup -.-> mysql/stored_procedures("Procedure Management") subgraph Lab Skills mysql/create_database -.-> lab-550905{{"Manejo y registro de errores en MySQL"}} mysql/create_table -.-> lab-550905{{"Manejo y registro de errores en MySQL"}} mysql/select -.-> lab-550905{{"Manejo y registro de errores en MySQL"}} mysql/insert -.-> lab-550905{{"Manejo y registro de errores en MySQL"}} mysql/update -.-> lab-550905{{"Manejo y registro de errores en MySQL"}} mysql/show_variables -.-> lab-550905{{"Manejo y registro de errores en MySQL"}} mysql/stored_procedures -.-> lab-550905{{"Manejo y registro de errores en MySQL"}} end

Habilitar el registro general de consultas

En este paso, habilitaremos el registro general de consultas en MySQL. El registro general de consultas registra todas las declaraciones SQL ejecutadas en el servidor. Esto puede ser útil para la depuración, la auditoría y el análisis de rendimiento. Sin embargo, es importante tener en cuenta que habilitar el registro general de consultas puede generar una gran cantidad de datos y puede afectar el rendimiento del servidor, especialmente en entornos de alto tráfico. Por lo tanto, se debe utilizar con precaución y solo habilitarse cuando sea necesario.

Primero, conectémonos al servidor MySQL como usuario root. Abra una terminal y ejecute el siguiente comando:

mysql -u root -p

Se le pedirá la contraseña de root. Ingrese la contraseña y presione Enter. Si no ha configurado una contraseña de root, simplemente presione Enter.

Ahora que está conectado al servidor MySQL, puede habilitar el registro general de consultas. Para hacer esto, debe establecer la variable del sistema general_log en ON. Ejecute la siguiente declaración SQL:

SET GLOBAL general_log = 'ON';

Este comando habilita el registro general de consultas globalmente para todas las conexiones.

A continuación, debe especificar el archivo de registro donde se escribirán las consultas. El archivo de registro predeterminado generalmente se encuentra en el directorio de datos de MySQL y se llama hostname.log. Puede verificar la ubicación actual del archivo de registro ejecutando la siguiente declaración SQL:

SHOW VARIABLES LIKE 'general_log_file';

La salida mostrará el valor actual de la variable general_log_file, que es la ruta al archivo de registro.

Si desea cambiar la ubicación del archivo de registro, puede establecer la variable del sistema general_log_file en una ruta diferente. Por ejemplo, para establecer el archivo de registro en /tmp/mysql_general.log, ejecute la siguiente declaración SQL:

SET GLOBAL general_log_file = '/tmp/mysql_general.log';

Importante: Asegúrese de que el proceso del servidor MySQL tenga permisos de escritura en la ubicación del archivo de registro especificada.

Ahora que el registro general de consultas está habilitado, todas las declaraciones SQL ejecutadas en el servidor se escribirán en el archivo de registro. Para verificar que el registro está funcionando, ejecute algunas declaraciones SQL simples, como:

SELECT NOW();
SHOW DATABASES;

Luego, salga del cliente MySQL:

exit

Finalmente, verifique el contenido del archivo de registro para ver si se registraron las declaraciones SQL. Puede usar el comando cat para ver el archivo de registro. Si utilizó la ubicación del archivo de registro predeterminada, el comando sería similar a:

sudo cat /var/log/mysql/mysql.log

Si cambió la ubicación del archivo de registro a /tmp/mysql_general.log, el comando sería:

sudo cat /tmp/mysql_general.log

Debería ver las declaraciones SQL que ejecutó en el archivo de registro, junto con marcas de tiempo y otra información.

Recuerde deshabilitar el registro general de consultas cuando haya terminado de usarlo, ya que puede consumir una cantidad significativa de espacio en disco y afectar el rendimiento del servidor. Para deshabilitar el registro general de consultas, ejecute la siguiente declaración SQL:

mysql -u root -p -e "SET GLOBAL general_log = 'OFF';"

Este comando deshabilita el registro general de consultas globalmente.

Agregar manejo de errores a un procedimiento almacenado

En este paso, agregaremos manejo de errores a un procedimiento almacenado en MySQL. El manejo de errores es crucial para garantizar la robustez y confiabilidad de tus procedimientos almacenados. Te permite manejar de manera elegante situaciones inesperadas, como entradas inválidas, errores de conexión a la base de datos o violaciones de integridad de datos.

Primero, creemos un procedimiento almacenado simple sin manejo de errores. Este procedimiento intentará insertar un nuevo registro en una tabla. Si la inserción falla (por ejemplo, debido a una clave duplicada), el procedimiento simplemente terminará sin proporcionar información específica sobre el error.

Conéctate al servidor MySQL como usuario root:

mysql -u root -p

Ahora, creemos una base de datos y una tabla para nuestro ejemplo:

CREATE DATABASE IF NOT EXISTS testdb;
USE testdb;

CREATE TABLE IF NOT EXISTS products (
    id INT PRIMARY KEY,
    name VARCHAR(255)
);

A continuación, crea un procedimiento almacenado llamado insert_product que inserte un nuevo producto en la tabla products:

DELIMITER //
CREATE PROCEDURE insert_product(IN p_id INT, IN p_name VARCHAR(255))
BEGIN
    INSERT INTO products (id, name) VALUES (p_id, p_name);
END //
DELIMITER ;

Este procedimiento almacenado toma dos parámetros de entrada: p_id (el ID del producto) y p_name (el nombre del producto). Luego intenta insertar un nuevo registro en la tabla products con los valores dados.

Ahora, agreguemos manejo de errores al procedimiento almacenado. Usaremos la sintaxis DECLARE ... HANDLER para definir manejadores de errores que se ejecutarán cuando ocurran errores específicos.

Modifica el procedimiento almacenado insert_product de la siguiente manera:

DELIMITER //
CREATE PROCEDURE insert_product(IN p_id INT, IN p_name VARCHAR(255))
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        SELECT 'An error occurred during the insertion.' AS message;
    END;

    INSERT INTO products (id, name) VALUES (p_id, p_name);
END //
DELIMITER ;

En esta versión modificada, hemos agregado un manejador de errores usando DECLARE EXIT HANDLER FOR SQLEXCEPTION. Este manejador se ejecutará si ocurre alguna excepción SQL durante la ejecución del procedimiento almacenado. Dentro del manejador, simplemente seleccionamos un mensaje que indica que se produjo un error.

Probemos el procedimiento almacenado con manejo de errores. Primero, insertemos un producto:

CALL insert_product(1, 'Product A');

Esto debería insertar un nuevo registro en la tabla products sin ningún error.

Ahora, intentemos insertar el mismo producto de nuevo:

CALL insert_product(1, 'Product A');

Esta vez, la inserción fallará porque la columna id es una clave primaria y no puede contener valores duplicados. Sin embargo, en lugar de simplemente terminar, se ejecutará el manejador de errores y verás el mensaje "An error occurred during the insertion."

También puedes agregar manejadores de errores más específicos para diferentes tipos de errores. Por ejemplo, puedes agregar un manejador para errores de clave duplicada (SQLSTATE '23000'):

DELIMITER //
CREATE PROCEDURE insert_product(IN p_id INT, IN p_name VARCHAR(255))
BEGIN
    DECLARE EXIT HANDLER FOR SQLSTATE '23000'
    BEGIN
        SELECT 'Duplicate key error.' AS message;
    END;

    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        SELECT 'An error occurred during the insertion.' AS message;
    END;

    INSERT INTO products (id, name) VALUES (p_id, p_name);
END //
DELIMITER ;

Ahora, si intentas insertar un producto duplicado, verás el mensaje "Duplicate key error." en lugar del mensaje de error genérico.

Este ejemplo demuestra cómo agregar manejo de errores básico a un procedimiento almacenado en MySQL. Al usar manejadores de errores, puedes hacer que tus procedimientos almacenados sean más robustos y proporcionar mensajes de error más informativos a los usuarios.

Generar un error personalizado con SIGNAL

En este paso, aprenderemos cómo generar un error personalizado en MySQL utilizando la declaración SIGNAL. La declaración SIGNAL te permite generar condiciones de error definidas por el usuario dentro de procedimientos almacenados, funciones o disparadores (triggers). Esto es útil para aplicar reglas comerciales, validar datos de entrada y proporcionar mensajes de error más informativos a los usuarios.

Primero, conéctate al servidor MySQL como usuario root:

mysql -u root -p

Seguiremos utilizando la base de datos testdb y la tabla products del paso anterior. Si aún no las has creado, ejecuta las siguientes declaraciones SQL:

CREATE DATABASE IF NOT EXISTS testdb;
USE testdb;

CREATE TABLE IF NOT EXISTS products (
    id INT PRIMARY KEY,
    name VARCHAR(255),
    quantity INT
);

Ahora, creemos un procedimiento almacenado que actualice la cantidad de un producto. Agregaremos una comprobación para asegurarnos de que la cantidad que se está actualizando no sea negativa. Si lo es, generaremos un error personalizado utilizando la declaración SIGNAL.

DELIMITER //
CREATE PROCEDURE update_quantity(IN p_id INT, IN p_quantity INT)
BEGIN
    IF p_quantity < 0 THEN
        SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Quantity cannot be negative.';
    END IF;

    UPDATE products SET quantity = p_quantity WHERE id = p_id;
END //
DELIMITER ;

En este procedimiento almacenado, primero comprobamos si la cantidad de entrada p_quantity es menor que 0. Si lo es, ejecutamos la declaración SIGNAL.

La declaración SIGNAL toma un valor SQLSTATE como argumento. SQLSTATE es una cadena de cinco caracteres que representa una condición de error específica. En este caso, estamos utilizando el valor SQLSTATE '45000', que es un error genérico definido por el usuario. Puedes utilizar cualquier valor SQLSTATE en el rango '45000' a '45999' para tus errores personalizados.

La cláusula SET MESSAGE_TEXT te permite especificar un mensaje de error personalizado que se devolverá al usuario. En este caso, estamos estableciendo el mensaje de error en 'Quantity cannot be negative.'.

Ahora, probemos el procedimiento almacenado. Primero, insertemos un producto en la tabla products:

INSERT INTO products (id, name, quantity) VALUES (1, 'Product A', 10);

Ahora, intentemos actualizar la cantidad a un valor negativo:

CALL update_quantity(1, -5);

Esto generará un error personalizado con el mensaje "Quantity cannot be negative.". Deberías ver un mensaje de error similar al siguiente:

ERROR 1644 (45000): Quantity cannot be negative.

Si intentas actualizar la cantidad a un valor positivo, la actualización tendrá éxito:

CALL update_quantity(1, 15);
SELECT * FROM products WHERE id = 1;

Esto actualizará la cantidad del producto 1 a 15.

También puedes definir valores SQLSTATE personalizados y mensajes de error para diferentes condiciones de error. Esto te permite proporcionar mensajes de error más específicos e informativos a los usuarios.

Este ejemplo demuestra cómo generar un error personalizado utilizando la declaración SIGNAL en MySQL. Al utilizar la declaración SIGNAL, puedes aplicar reglas comerciales, validar datos de entrada y proporcionar mensajes de error más informativos a los usuarios.

Revisar las entradas del registro de errores

En este paso, revisaremos el registro de errores de MySQL para identificar y entender los mensajes de error generados durante las operaciones de la base de datos. El registro de errores es un recurso crucial para solucionar problemas, diagnosticar fallas y monitorear el estado de tu servidor MySQL.

La ubicación del archivo del registro de errores de MySQL depende de la configuración de tu sistema. Una ubicación común es /var/log/mysql/error.log. Puedes determinar la ubicación exacta consultando la variable del sistema log_error.

Primero, conéctate al servidor MySQL como usuario root:

mysql -u root -p

Luego, ejecuta la siguiente declaración SQL para encontrar la ubicación del archivo del registro de errores:

SHOW VARIABLES LIKE 'log_error';

La salida mostrará el valor actual de la variable log_error, que es la ruta al archivo del registro de errores.

Ahora que sabes la ubicación del archivo del registro de errores, puedes usar un editor de texto o una herramienta de línea de comandos para ver su contenido. En el entorno de la máquina virtual (VM) de LabEx, recomendamos usar el editor nano o el comando cat.

Por ejemplo, si el archivo del registro de errores está ubicado en /var/log/mysql/error.log, puedes verlo usando el siguiente comando:

sudo cat /var/log/mysql/error.log

O bien, puedes usar nano para abrir el archivo en un editor de texto:

sudo nano /var/log/mysql/error.log

El archivo del registro de errores contiene un registro cronológico de eventos, incluyendo errores, advertencias y mensajes informativos. Cada entrada generalmente incluye una marca de tiempo, el nivel de gravedad del mensaje y una descripción del evento.

Generemos algunas entradas en el registro de errores causando intencionalmente errores en nuestras operaciones de base de datos. Usaremos la base de datos testdb y la tabla products de los pasos anteriores.

Primero, intentemos insertar un producto duplicado en la tabla products:

INSERT INTO products (id, name, quantity) VALUES (1, 'Product A', 10);

Esto generará un error de clave duplicada porque la columna id es una clave primaria.

A continuación, intentemos actualizar la cantidad de un producto a un valor negativo usando el procedimiento almacenado update_quantity:

CALL update_quantity(1, -5);

Esto generará un error personalizado que definimos en el paso anterior.

Ahora, revisa nuevamente el archivo del registro de errores para ver los mensajes de error generados por estas operaciones. Deberías ver entradas similares a las siguientes:

[timestamp] [ERROR] [MY-013187] [InnoDB] Duplicate entry '1' for key 'products.PRIMARY'
[timestamp] [ERROR] [MY-013187] [Server] Quantity cannot be negative.

La primera entrada indica un error de clave duplicada al intentar insertar un producto con un ID existente. La segunda entrada muestra el mensaje de error personalizado generado por el procedimiento almacenado update_quantity.

Al analizar las entradas del registro de errores, puedes obtener información valiosa sobre las causas de los errores y tomar las medidas adecuadas para resolverlos. Por ejemplo, es posible que debas corregir errores de entrada de datos, modificar procedimientos almacenados o ajustar la configuración de la base de datos.

Es importante revisar regularmente el archivo del registro de errores para identificar y solucionar posibles problemas antes de que se conviertan en problemas más graves. También puedes configurar MySQL para que rote automáticamente el archivo del registro de errores y evitar que crezca demasiado.

Finalmente, recuerda deshabilitar el registro general de consultas si lo habilitaste en el primer paso, ya que puede consumir una cantidad significativa de espacio en disco e impactar el rendimiento del servidor:

mysql -u root -p -e "SET GLOBAL general_log = 'OFF';"

Resumen

En este laboratorio (lab), comenzamos habilitando el registro general de consultas en MySQL, que registra todas las declaraciones SQL ejecutadas para depuración, auditoría y análisis de rendimiento. Nos conectamos al servidor MySQL como usuario root y habilitamos globalmente la variable del sistema general_log.

Luego, examinamos la ubicación predeterminada del archivo del registro general de consultas utilizando SHOW VARIABLES LIKE 'general_log_file' y aprendimos cómo modificar la ubicación del archivo de registro estableciendo la variable del sistema general_log_file, enfatizando la importancia de garantizar que el proceso del servidor MySQL tenga permisos de escritura en la ubicación del archivo de registro especificada.