Cómo solucionar el error ORA-01114: IO error writing block to file (block #) en un servidor de bases de datos Oracle. Indicamos un posible motivo del error y varias soluciones. Mostramos cómo mover los ficheros de datos (datafiles) de un tablespace de Oracle de una ubicación a otra.

Error ORA-01114 IO error writing block to file block en ORACLE

Síntomas

La base de datos Oracle se detiene sin motivo. Se inicia con un startup normal y vuelve a funcionar. Transcurridos unos minutos/horas vuelve a detenerse.

Consultando el fichero alert.log de Oracle, aparece este error:

Mon Oct 25 07:50:46 2021
Thread 1 advanced to log sequence 4993822 (LGWR switch)
Current log# 3 seq# 4993822 mem# 0: /orasid/ORASID/onlinelog/o1_mf_3_dc0bglpx_.log
Current log# 3 seq# 4993822 mem# 1: /oralog/ORASID/onlinelog/o1_mf_3_dc0bglr4_.log
Archived Log entry 4993310 added for thread 1 sequence 4993821 ID 0xa7eac4e2 dest 1:
Mon Oct 25 07:50:46 2021
Errors in file /opt/oracle/diag/rdbms/orasid/ORASID/trace/ORASID_j000_74350.trc:
ORA-01114: IO error writing block to file (block #)
Mon Oct 25 07:50:48 2021
Starting background process SMCO
Mon Oct 25 07:50:48 2021
SMCO started with pid=91, OS id=74436

Error ORA-01114 IO error writing block to file block en ORACLE

En algunos casos, en el fichero de log del export (backup a fichero) de la base de datos, pueden aparecer estos errores:

ORA-31693: Table data object «CONTABILIDAD».»FACTURAS» failed to load/unload and is being skipped due to error:
ORA-29913: error in executing ODCIEXTTABLEPOPULATE callout
ORA-29400: data cartridge error
KUP-04038: internal error: kupax-meta1

Posible motivo del error ORA-01114

Uno de los motivos principales por los que se pueden producir los erroes anteriores es que la unidad de disco donde se encuentren los datafiles del tablespace SYSTEM de Oracle se ha llenado. Cuando la unidad se queda sin espacio, algunos procesos de Oracle, que generan registros y objetos en el tablespace SYSTEM, dejan de funcionar correctamente.

Esto puede provocar, incluso, que la base de datos se detenga.

Solución a los errores ORA-01114 ORA-31693 ORA-29913 ORA-29400 KUP-04038

La solución más rápida para estos errores es ampliar el tamaño de la unidad que contenga los ficheros (datafiles) del tablespace SYSTEM. Si tenemos alojados los ficheros de datos de Oracle en diferentes unidades, revisaremos la unidad que contenga el SYSTEM. Lo normal es que se haya quedado sin espacio. Por ello, lo más rápido es ampliar el tamaño de la unidad, bien sea equipo Windows o Linux.

Si no es posible ampliar el tamaño de la unidad, en el siguiente artículo explicamos cómo liberar espacio en el tablespace SYSTEM:

Si no es posible ampliar el tamaño de la unidad, podremos mover los datafiles de algún tablespace que esté en la unidad sin espacio a otra unidad. Explicamos cómo hacer esto a continuación.

Mover ficheros de datos datafiles de un tablespace de Oracle a otra unidad de disco

A continuación explicamos cómo mover los ficheros de datos (datafiles) de un tablespace de Oracle de una unidad de disco a otra, o bien de una carpeta a otra. En nuestro caso, al quedar la unidad del servidor Linux /ficheros_oracle sin espacio, se ha agregado una segunda unidad, con espacio libre suficiente, llamada /ficheros_oracle2, donde moveremos algunos datafiles de algún tablespace, para liberar espacio en la unidad /ficheros_oracle.

Para mover datafiles de un tablespace de Oracle, en primer lugar deberemos cambiar el estado del tablespace a offline y dejará de estar disponible. Por ello, recomendamos encarecidamente que antes de hacer el proceso realicemos las siguientes tareas:

  • Copia de seguridad completa de la base de datos Oracle, tanto export a fichero con RMAN en caliente.
  • Asegurarnos de que el tablespace que vamos a mover, el que dejaremos temporalmente offline, no afecta a aplicativos ni servicios en producción. Las tablas que contengan este tablespace permanecerán inaccesibles durante el proceso de movimiento de los datafiles.

En cuanto tengamos el backup de Oracle y sepamos que no hay usuarios conectados, podremos realizar el siguiente proceso.

En primer lugar estableceremos el tablespace a offiline. Para ello, accederemos a la utilidad de Oracle SQL Plus. En el caso de un servidor Oracle con Linux, accederemos con el usuario «oracle»:

su – oracle

Abriremos SQL Plus con:

sqlplus /nolog

Conectaremos a la base de datos con:

Y estableceremos el tablespace a offine, en nuestro caso el tablespace que queremos mover se llama «CONTA», por lo tanto ejecuaremos en SQL Plus el siguiente comando:

Si se ha establecido a offline, mostrará el mensaje:

Tablespace altered.

En caso de no poder establecerlo a offline, mostrará el motivo con un código de error. Si por ejemplo RMAN está haciendo un backup de este tablespace, es posible que no deje establecerlo offline con el parámetro NORMAL. Recomendamos usar siempre «NORMAL» para que en caso de no poderse poner a offline no lo fuerce y nos indice el por qué.

Una vez que tengamos el tablespace a offline, podremos ejecutar la siguiente consulta SQL (se puede ejecutar antes tambié), que nos mostrará los ficheros de datos (datafiles) de dicho tablespace y su ubicación actual:

El comando anterior nos mostrará todos los ficheros de datos del tablespace CONTA, también nos mostrará su estado, debe indicar OFFLINE:

FILE_NAMEONLINE_STATUSTABLESPACE_NAME
/ficheros_oracle/CONTA01.dbfOFFLINECONTA
/ficheros_oracle/CONTA02.dbf OFFLINECONTA
/ficheros_oracle/CONTA03.dbf OFFLINECONTA
/ficheros_oracle/CONTA04.dbf OFFLINECONTA

En nuestro caso el tablespace CONTA que queremos mover tiene cuatro ficheros en la unidad /ficheros_oracle. Queremos moverlos a la nueva unidad /ficheros_oracle2. Puesto que están OFFLINE y no hay procesos modificando sus tablas, podremos moverlos. Para ello abriremos una ventana de consola de comandos, y desde el sistema operativo, ejecutaremos los siguientes comandos para mover los cuatro ficheros de la unidad /ficheros_oracle a la unidad /ficheros_oracle2:

Solución a los errores ORA-01114 ORA-31693 ORA-29913 ORA-29400 KUP-04038

Una vez movidos los ficheros en el sistema operativo, volveremos a acceder a SQL Plus para establecer el cambio en el tablespace. Una vez en SQL PLus, ejecutaremos los siguientes comandos para establecer la nueva ruta para los cuatro ficheros de datos:

Si se ejecutan correctamente mostrarán el mensaje:

Tablespace altered.

En los comandos anteriores vemos que se debe indicar la ruta actual y el nombre del datafile: /ficheros_oracle/CONTA01.dbf y la nueva ruta: /ficheros_oracle2/CONTA01.dbf, por cada fichero de datos que hayamos movido.

Una vez movidos los datafiles en el sistema operativo y establecida su nueva ubicación en Oracle, podremos modificar el estado del tablespace a ONLINE, para ello ejecutaremos desde SQL Plus el siguiente comando:

Si todo es correcto mostrará el mensaje:

Tablespace altered.

Ahora podremos comprobar que la ubicación de los datafiles del tablespace CONTA es la nueva unidad /ficheros_oracle2, ejecutando:

O bien esta otra consulta SQL:

Nos devolverá:

FILE_NAMEONLINE_STATUSTABLESPACE_NAME
/ficheros_oracle2/CONTA01.dbfONLINECONTA
/ficheros_oracle2/CONTA02.dbf ONLINECONTA
/ficheros_oracle2/CONTA03.dbf ONLINECONTA
/ficheros_oracle2/CONTA04.dbf ONLINECONTA
Solución a los errores ORA-01114 ORA-31693 ORA-29913 ORA-29400 KUP-04038

Vemos que los ficheros de datos ya están en /ficheros_oracle2, la nueva ubicación. Y están en estado ONLINE.

Por último, comprobaremos que los aplicativos que usen este tablespace CONTA funcionan correctamente. También podremos ejecutar cualquier consulta SQL que muestre registros de alguna tabla de esta tablespace para verificar que el cambio se ha efectuado correctamente.

Una vez liberado espacio en la unidad donde se encuentra el tablespace SYSTEM de Oracle, los errores ORA-01114 ORA-31693 ORA-29913 ORA-29400 KUP-04038 quedarán resueltos.