ARTICULO: Registro bloqueado al renombrar una tabla

Aug
16
2017

Cuando intentamos renombrar una tabla o modificarla de alguna manera nos podemos encontrar con los errores:

-242 SQL error: Could not open database table
-106 ISAM error: non-exclusive access

Sin embargo, cuando buscamos por bloqueos sobre esa tabla no encontramos ninguno. Poner set lock mode to wait no funciona y no espera y tenemos la posibilidad de bloquear la tabla en exclusiva con un lock table in exclusive mode pero seguimos sin poder realizar la operación.

En este caso lo que ocurre es que quedan descriptores abiertos en algunas sesiones así que hay que localizarlos para identificar a estas sesiones y matarlas.

Para ello debemos obtener primero el partnum de la tabla que queremos modificar. Para ello lanzamos la siguiente select contra la base de datos que contenga la tabla:

select hex(partnum) from systables where tabname = "nombre_tabla"

Con este valor, por ejemplo 0x00a000a4, podemos obtener el thread que tiene referencias sobre la tabla:

# onstat -g opn|grep 00a000a4
932017 0x00000002b1b92e98 2 0x00000400 0x00000281 0x00a000a4 1 1 3
932516 0x00000002b5193e00 2 0x00000400 0x00000397 0x00a000a4 1 1 9
930820 0x00000002b891e9e0 6 0x00000400 0x00000397 0x00a000a4 1 1 0

Con el valor de la primera columna podemos cruzar el valor con los threads:

# onstat -g ath|grep 932017
932017 2c698e8b0 2b1b92e98 1 cond wait netnorm
1cpu sqlexec

De aquí cogemos la tercera columna y la cruzamos con los usuarios:

# onstat -u | grep 2b1b92e98
2b1b92e98 Y--P--- 529940 prueba - 2c7807eb8 0
1 0 0

Y aquí ya tenemos la sesión que nos mantiene la referencia a la tabla que no permite que la borremos, en este caso la 529940. Ya habría que ver la conveniencia de matarla, cerrarla o dejarla.

Para cualquier tema relacionado con este artículo o relacionado con informix, no dude en ponerse en contacto con nosotros en info@proyectosysoluciones.es