Hoy durante la creación de un Tablespace con tres datafiles de 100G en mi base de datos se generó el error "ORA-01144: File size (12800000 blocks) exceeds maximum of 4194303 blocks". Es por eso que se analiza el error y se describe como resolver el problema.
Oracle tiene limites con el db_block_size, dependiendo del db_block_size se puede crear datafiles hasta un tamaño en especifico, como se detalla a continuacion:
Revisando el parámetro en la base de datos se tiene lo siguiente:
SQL> show parameter db_block_size
NAME TYPE VALUE
---------------------------------- --------- ---------------
db_block_size integer 8192
Su valor corresponde a 8kb, por lo tanto el tamaño máximo para crear un datafile es definido por la formula db_block_size*4194303 (expresado en bits), en el escenario presentado solo puedo crear datafile de tamaño maximo hasta de 32Gb.
La solución para este escenario consiste en crear múltiples datafiles para el tablespace mencionado con un tamaño más pequeño o igual al soportado. La otra alternativa es utilizar tablespaces de archivo grande (Bigfile tablespaces).
Oracle tiene dos tipos de parámetros de Inicialización:
1) Parámetros de Inicialización Documentados.
2) Parámetros de Inicialización No Documentados.
El segundo tipo de Parámetros también es llamado Parámetro de Inicialización Ocultos y no existe documentación disponible acerca de esos parámetros. Por lo general la modificación de estos parámetros se lo realizan bajo la recomendación de Oracle Support.
Para visualizar los parámetros no documentados es necesario visualizar con la tabla "X$KSPPI" que contiene a todos los parámetros que influyen en la operación de una base de datos Oracle. Recordar que "X$tablas" solo puede ser utilizada cuando nos conectamos a la instancia como usuario "SYS".
A continuación se detalla el script para visualizar las parámetros no documentados y con que valor esta asignado en nuestra base de datos.
SET LINE 200
SET PAGES 100
COLUMN name FORMAT a30
COLUMN value FORMAT a20
COLUMN deflt FORMAT a20
COLUMN type FORMAT a20
COLUMN description FORMAT a50
SELECT a.ksppinm name,
b.ksppstvl VALUE,
b.ksppstdf deflt,
DECODE (a.ksppity,
1, 'boolean',
2, 'string',
3, 'number',
4, 'file',
a.ksppity)
TYPE,
a.ksppdesc description
FROM sys.x$ksppi a, sys.x$ksppcv b
WHERE a.ksppinm LIKE '_use_adaptive_log_file_sync'
AND a.indx = b.indx
AND a.ksppinm LIKE '\_%' ESCAPE '\'
ORDER BY name;
Se realizará la eliminación (DROP) y creación (CREATE) de grupo de archivos Online RedoLog.
Nuestro escenario actual es el siguiente:
SQL> select GROUP#, STATUS, members, BYTES/1024/1024 MB, THREAD# from v$log;
GROUP# STATUS MEMBERS MB THREAD#
---------- ---------------- ---------- ---------- ----------
4 CURRENT 1 50 1
5 INACTIVE 1 50 1
6 INACTIVE 1 50 1
SQL> set pages 100
SQL> column status format a10
SQL> column member format a50
SQL> select group#, status, type, member from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ---------- ------- --------------------------------------------------
4 ONLINE +REDO/sin/onlinelog/group_4.256.838035233
5 ONLINE +REDO/sin/onlinelog/group_5.257.838035233
6 ONLINE +REDO/sin/onlinelog/group_6.258.838035235
3 rows selected.
Realizaremos la creación de nuevos GRUPOS REDOLOG y eliminaremos los actuales por dos motivos principales:
1. Se Multiplexará e incrementará (de 50Mb a 1024Mb) el tamaño a los miembros de los grupos ONLINE REDOLOG en diferentes diskgroups, y cada grupo tendrá 2 miembros
2. Se eliminará a los actuales GRUPOS ONLINE REDOLOG existentes (grupos 4, 5 y 6).
a) Creación de GRUPOS ONLINE REDOLOG, con miembros ya multiplexados
SQL> ALTER DATABASE ADD LOGFILE GROUP 11 ('+REDO', '+FRA') SIZE 1024M;
Database altered.
SQL> ALTER DATABASE ADD LOGFILE GROUP 12 ('+REDO', '+FRA') SIZE 1024M;
Database altered.
b) Creación de GRUPO ONLINE REDOLOG con un solo miembro y adicionamos su nuevo miembro.
Creamos:
SQL> ALTER DATABASE ADD LOGFILE GROUP 13 ('+REDO') SIZE 1024M;
Database altered.
Adicionamos:
SQL> ALTER DATABASE ADD LOGFILE MEMBER '+FRA' TO GROUP 13;
Database altered.
c) Eliminación de GRUPOS ONLINE REDOLOG.
Antes de eliminar ejecutamos lo siguiente:
SQL> ALTER DATABASE DROP LOGFILE GROUP 4;
Database altered.
SQL> ALTER DATABASE DROP LOGFILE GROUP 5;
Database altered.
SQL> ALTER DATABASE DROP LOGFILE GROUP 6;
ALTER DATABASE DROP LOGFILE GROUP 6
*
ERROR at line 1:
ORA-01623: log 6 is current log for instance sin (thread 1) - cannot drop
ORA-00312: online log 6 thread 1: '+REDO/sin/onlinelog/group_6.258.838035235'
Oracle jamás permitirá que se eliminen los grupos ONLINE REDOLOG con status "CURRENT", por lo que se necesita realizar el cambio de grupo.
Ejecutamos la siguiente sentencia:
SQL> ALTER SYSTEM SWITCH LOGFILE;
System altered.
Con la anterior instrucción realizamos el cambio de grupo, y es posible que el estado aun permanezca con
status "ACTIVE", es preferible esperar un lapso de tiempo para que pase al estado de "INACTIVE", de tal
manera queda en lo siguiente:
SQL> select GROUP#, STATUS, members, BYTES/1024/1024 MB, THREAD# from v$log;
GROUP# STATUS MEMBERS MB THREAD#
---------- ---------- ---------- ---------- ----------
6 INACTIVE 1 50 1
11 CURRENT 2 1024 1
12 UNUSED 2 1024 1
13 UNUSED 2 1024 1
Ejecutamos nuevamente la instrucción para eliminar el grupo ONLINE REDOLOG
SQL> ALTER DATABASE DROP LOGFILE GROUP 6;
Database altered.
Con los pasos mencionados se concluye la eliminación y creación de GRUPOS ONLINE REDOLOG, el resultado final es el siguiente:
SQL> select GROUP#, STATUS, members, BYTES/1024/1024 MB, THREAD# from v$log;
GROUP# STATUS MEMBERS MB THREAD#
---------- ---------- ---------- ---------- ----------
11 CURRENT 2 1024 1
12 UNUSED 2 1024 1
13 UNUSED 2 1024 1
SQL> select group#, status, type, member from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ---------- ------- --------------------------------------------------
11 ONLINE +REDO/sin/onlinelog/group_11.263.855075567
11 ONLINE +FRA/sin/onlinelog/group_11.263.855075583
12 ONLINE +REDO/sin/onlinelog/group_12.264.855075605
12 ONLINE +FRA/sin/onlinelog/group_12.264.855075623
13 ONLINE +REDO/sin/onlinelog/group_13.265.855075747
13 INVALID ONLINE +FRA/sin/onlinelog/group_13.265.855075835
6 rows selected.