Bienvenidos sean a este post, hoy hablaremos sobre la depuracion en mariadb.
Cuando hablamos de depuracion (debug) nos referimos a la capacidad de poder obtener informacion que nos pueda orientar para solucionar un problema, por esta razon en muchos lenguajes siempre es una buena idea comentar las secciones del programa y tenerlo de la forma mas legible posible, pero aqui en mariadb lo haremos por medio de las notificaciones que tengamos, estas pueden ser de error impidiendo la ejecucion o de aviso (warning) la cual lo ejecutara pero nos notificara que hubo uno, en algunos posts anteriores no solamente hemos usado operadores para convertir los errores en avisos y en otro post hemos visto como activarlos y desactivarlos, hoy nos adentraremos en como son cada uno de estos errores y como nos ayudan, comencemos con el primero.
El valor SQLSTATE
Este es un valor alfanumerico de cinco caracteres, los dos primeros representan una clase y dan una informacion general sobre el problema, los siguientes tres representan a una subclase e indican el error exacto o un conjunto de posibles errores, en caso de no ser indicada se pasa 000, por ultimo todos los caracteres no numericos son en mayusculas y del alfabeto ingles, al igual que sucede con la mayoria de los lenguajes cuando nos devuelve el valor 00000 significa que fue exitoso, este es el unico valor de esta clase y no puede ser generada por el usuario, veamos algunas otras clases:
- 00, como dijimos es para cuando todo es exitoso
- 01, es la que nos notifica cuando se ejecuto pero hubo algunos errores
- 02, es para cuando la condicion no fue cumplida, no es un error pero el lenguaje necesita saberlo internamente
- HY, en conjunto con 000 se usa para indicar falla general
El estandar SQL dice que todas las clases deben comenzar con el valor de 0 a 9 y de A a la E las letras F y G deben quedar para las clases estandar definidas, por otro lado cada identificacion de las clases queda sujeta al desarrollador, por lo tanto no todas las identificaciones seran iguales pero mantienen un estandar bastante similar, como en mariadb hay algunos errores que no estan cubiertos se utiliza HY000 para lo indicado anteriormente
Numero de error
El numero de error o codigo es un valor SMALLINT SIGNED cuyo valor maximo es 32767, el cual simboliza una condicion y al igual que en el caso anterior 0 equivale a exito y no puede ser generado por el usuario, la version de mariadb comparte los errores de la version de mysql que esta basada, los errores especificos comienzan desde 1900 y estos representan errores en las caracteristicas especificas de mariadb.
Mensaje de error
Es la notificacion entendible para humanos, es una cadena varchar con un ancho de 128, en los casos mas simples es un texto que describe el error para evitar buscar el codigo en la documentacion de mariadb, ocasionalmente puede contener el nombre de la base, tabla o columna donde ocurrio el error, por lo general son bastante claros pero cuando son vago o dificil de explicar pueden incluir el codigo de error para que se busque en la documentacion.
Errores personalizados
Este es un error generado por el usuario a traves de SIGNAL o RESIGNAL, esto permite definir los valores para el valor SQLSTATE, el codigo de error o mensaje de error de dichos errores, la principal diferencia entre los comandos es que el primero permite crear y generar un nuevo error, en cambio el segundo modifica las propiedades del error antes de generarlo nuevamente.
Nota: Cuando nos referimos a generar es la accion de notificar al usuario mediante un mensaje el error que sucedio en la ejecucion.
Pero cual es la utilidad de generar un error? En este caso es para tener una mejor interpretacion del error que esta ocurriendo, como SIGNAL permite ejecutarlo en programas almacenados podemos usarlo para que deje un mensaje en el log y este puede ser interpretado por el DBA, por lo general como regla se establecio que los errores personalizados se deben hacer del valor 45000 de SQLSTATE en adelante, esto es asi porque en general la mayoria de las bases de datos acordaron no usar nunca desde este valor en adelante incluyendo futuras versiones, por ultimo el valor de 45000 es tambien aceptado para ser utilizado como «falla general».
Una de las razones para poder trabajar con este tipo de error es para ser mas especificos a la hora de trabajar con nuestro codigo, por lo general se utiliza la clase 01 para indicar un aviso de que algo sucedio mal pero podemos crear un nuevo codigo para indicar cuando una clave especificada se duplico, pero nosotros podemos necesitar que se utilice el codigo de error que existe para una clave duplicada, por lo tanto podemos decir que el error personalizado utilice el valor 23000 de SQLSTATE, una propiedad que es parcialmente soportada por mariadb son las propiedades de condiciones y estas pueden proveer informacion adicional a la causa del error, se las puede configurar mediante SIGNAL y RESIGNAL, a su vez estas pueden ser leidas via GET DIAGNOSTICS pero al no estar completamente implementadas y no aparecer al usuario por lo general son ignoradas por los desarrolladores.
SHOW WARNINGS y SHOW ERRORS
En mariadb cuando hablamos de avisos (warnings) y errores (errors) las referimos como condiciones, estas a su vez se almacenan en un contenedor llamado area de diagnosticos, por lo general aqui se almacenan los generados por la ultima ejecucion, sin embargo el mecanismo que determina como se completa o vacia es un poco mas complejo y lo veremos en su propio post, uno de los comandos que existe para verificar ya lo utilizamos en este post, SHOW WARNINGS, el cual nos devolvera todos los avisos que tuvimos, el otro es SHOW COUNT(*) WARNINGS, nos devuelve la cantidad de estas condiciones, tambien es almacenado en la variable warning_count, para repasar el concepto vamos a ejecutar el siguiente comando, antes de probarlo necesitamos tener la base y la tabla donde trabajaremos en caso de no tenerlas ejecuten primero este comando:
MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS base1;
Con este creamos la base ahora agregaremos la siguiente tabla:
MariaDB [(none)]> create table base1.tabla3 (
-> id int(20) NOT NULL AUTO_INCREMENT UNIQUE PRIMARY KEY,
-> nombre varchar(20) NOT NULL,
-> apellido varchar(20) NOT NULL,
-> correo varchar(20) NOT NULL,
-> edad int(3) NULL,
-> ciudad varchar(20));
Con esto crearan la tabla para trabajar pero esto es para los que no tienen dichos elementos si venis de los posts anteriores no te preocupes porque son los que generamos y modificamos anteriormente, con esto explicado ejecutarmos el siguiente comando:
MariaDB [(none)]> insert ignore into base1.tabla3
-> set nombre='John', apellido='Doe',
-> correo='thebiggerdickonthistown@gmail.com', edad=23,
-> ciudad='New York';
Antes de ejecutarlo observen que el tamaño del correo es mucho mas grande que el permitido pero al ejecutarlo con el ignore no nos devolvera ningun error sino que lo ignorara y ejecutara pero debera mostrar una notificacion, veamos:
MariaDB [(none)]> insert ignore into base1.tabla3
-> set nombre='John', apellido='Doe',
-> correo='thebiggerdickonthistown@gmail.com', edad=23,
-> ciudad='New York';
Query OK, 1 row affected, 1 warning (0.010 sec)
Ahora ejecutemos el comando show warnings para ver cual es el resultado:
MariaDB [(none)]> show warnings;
+---------+------+---------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------+
| Warning | 1265 | Data truncated for column 'correo' at row 1 |
+---------+------+---------------------------------------------+
1 row in set (0.000 sec)
MariaDB [(none)]>
Observen que nos informo un codigo y una descripcion del error en si, que al no ser tan grave procede a ignorarlo pero queda registrado, en cambio si ejecutamos el comando anterior con \G veremos lo siguiente:
MariaDB [(none)]> show warnings\G
*************************** 1. row ***************************
Level: Warning
Code: 1265
Message: Data truncated for column 'correo' at row 1
1 row in set (0.000 sec)
MariaDB [(none)]>
Veamos el comando para contar los avisos:
MariaDB [(none)]> SHOW COUNT(*) WARNINGS;
+-------------------------+
| @@session.warning_count |
+-------------------------+
| 1 |
+-------------------------+
1 row in set (0.000 sec)
MariaDB [(none)]>
Con esto cubrimos lo basico de ver los avisos pero que sucede cuando ocurre un error, para ello vamos a ejecutar el siguiente comando:
MariaDB [(none)]> drop table base1.t1;
Lo cual nos devolvera el siguiente error:
MariaDB [(none)]> drop table base1.t1;
ERROR 1051 (42S02): Unknown table 'base1.t1'
MariaDB [(none)]>
Pero si ejecutamos el show warnings nos devolvera lo siguiente:
MariaDB [(none)]> show warnings\G
*************************** 1. row ***************************
Level: Error
Code: 1051
Message: Unknown table 'base1.t1'
1 row in set (0.000 sec)
MariaDB [(none)]>
En este caso nos informa que ocurrio el nivel de aviso es Error, no es Warning como vimos anteriormente, nos pasa el codigo y la descripcion pero si nosotros ejecutamos el comando anterior con la siguiente modificacion:
MariaDB [(none)]> drop table if exists base1.t1;
Nos devolvera un aviso pero sin error pero si volvemos a ejecutar el show warnings veremos lo siguiente:
MariaDB [(none)]> show warnings\G
*************************** 1. row ***************************
Level: Note
Code: 1051
Message: Unknown table 'base1.t1'
1 row in set (0.000 sec)
MariaDB [(none)]>
Observen que en lugar de mostrar Error o Warning nos dio el nivel de Note, esto es debido al condicional porque en lugar de eliminar la tabla primero verifica que exista y en caso de ser verdadero procedera a eliminarlo pero al no cumplirse la condicion lo ignora, al no ejecutarse el comando no es un error ni un aviso pero deja constancia de que no se ejecuto gracias al condicional, por lo tanto tenemos algunas opciones que nos convierten los errores en avisos (por ejemplo IGNORE), otros como IF EXISTS o IF NOT EXISTS transformaran a estos en notas para dejar asentada la accion y cuando no usemos nada solo el comando directo procedera a guardarlo como un error.
El siguiente tema el SHOW ERRORS que hace exactamente lo mismo pero en lugar de mostrar los avisos nos mostrara los errores, tambien se puede utilizar a SHOW COUNT(*) ERRORS para saber las cantidades, veamos el ejemplo anterior sin el condicional y luego ejecutemos el SHOW ERRORS:
MariaDB [(none)]> drop table base1.t1;
ERROR 1051 (42S02): Unknown table 'base1.t1'
MariaDB [(none)]> show errors\G
*************************** 1. row ***************************
Level: Error
Code: 1051
Message: Unknown table 'base1.t1'
1 row in set (0.000 sec)
MariaDB [(none)]>
Como pueden ver nos devolvio el error que tuvimos anteriormente pero con show errors no veremos los avisos o notas, probemos de ejecutar el mismo comando con el condicional pero luego ejecutaremos el contador:
MariaDB [(none)]> drop table if exists base1.t1;
Query OK, 0 rows affected, 1 warning (0.001 sec)
MariaDB [(none)]> show count(*) errors;
+-----------------------+
| @@session.error_count |
+-----------------------+
| 0 |
+-----------------------+
1 row in set (0.000 sec)
MariaDB [(none)]>
Al ejecutar el contador de errores observen como nos devolvio que hubo cero errores porque como mencionamos anteriormente solamente ve errores pero si ejecutamos el contador de avisos obtendremos lo siguiente:
MariaDB [(none)]> show count(*) warnings;
+-------------------------+
| @@session.warning_count |
+-------------------------+
| 1 |
+-------------------------+
1 row in set (0.000 sec)
MariaDB [(none)]>
Esta es la diferencia fundamental entre ambos, por ultimo tengan esto en cuenta a la hora de trabajar con la depuracion, dado que obtendran mas o menos informacion tambien tengan en cuenta como desean ver la salida tal como vimos en el post.
En resumen, hoy hemos hablado sobre como es la depuracion en mariadb, cuales son los valores que podemos manejar, que representa cada uno, como interpretarlos, luego vimos como trabajan los comandos para ver los avisos y los erores, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
