Monitoreo del uso temporal de Oracle
Parece que el espacio de tablas temporal de Oracle sigue siendo un misterio para algunos, posiblemente porque no se administra de la misma manera que un espacio de tablas convencional. Las extensiones se asignan y reutilizan para que la administración del espacio no se parezca en nada a un espacio de tabla tradicional. Debido a que los errores de espacio se gestionan de manera diferente. Veamos cómo administrar un espacio de tablas temporal y qué herramientas están a disposición del DBA.
A partir de la versión 8.1.5 Oracle ha proporcionado un espacio de tabla temporal ‘verdadero’ donde se asignan extensiones y se asignan a las sesiones según se necesiten. Las extensiones nunca se sueltan mientras la base de datos se está ejecutando, por lo que un espacio de tabla temporal utilizado correctamente siempre tendrá 0 espacio ‘libre’. En este sentido, ‘libre’ significa no asignado, y todo en el espacio de tabla temporal se asignará, pero eso no significa que se esté utilizando. Esta es la razón por la que la gestión de espacios convencional no tiene cabida en el espacio de tablas temporal.
Entonces, ¿cómo se administra el espacio de tabla temporal? Se hace a través de varias V views vistas:
V$TEMPFILE V$TEMPSTAT V$TEMP_EXTENT_MAP V$TEMP_EXTENT_POOL V$TEMP_SPACE_HEADER V$TEMPSEG_USAGE (Oracle 9i y versiones posteriores) V$SORT_USAGE (Oracle 8.1.7, 8.1.6 y 8.1.5)
V$TEMP_EXTENT_MAP todos los informes de las extensiones asignadas en el espacio de tabla temporal:
SQL> desc v$temp_extent_map Name Null? Type ----------------------------------------- -------- ---------------------------- TABLESPACE_NAME NOT NULL VARCHAR2(30) FILE_ID NUMBER BLOCK_ID NUMBER BYTES NUMBER BLOCKS NUMBER OWNER NUMBER RELATIVE_FNO NUMBER
La más útil vistas a gestionar espacios de tablas temporales se V$TEMP_EXTENT_POOL y V$TEMPSEG_USAGE/V$SORT_USAGE. V TEMP TEMP_EXTENT_POOL no solo enumera las extensiones asignadas, sino que también informa de todas las extensiones utilizadas en un espacio de tabla temporal por archivo temporal:
SQL> desc v$temp_extent_pool Name Null? Type ----------------------------------------- -------- ---------------------------- TABLESPACE_NAME NOT NULL VARCHAR2(30) FILE_ID NUMBER EXTENTS_CACHED NUMBER EXTENTS_USED NUMBER BLOCKS_CACHED NUMBER BLOCKS_USED NUMBER BYTES_CACHED NUMBER BYTES_USED NUMBER RELATIVE_FNO NUMBER
V TEMP TEMPSEG_USAGE (o, si lo prefiere, V V SORT_USAGE) muestra el uso temporal del segmento, por usuario, para todos los espacios de tabla:
SQL> desc v$tempseg_usage Name Null? Type ----------------------------------------- -------- ---------------------------- USERNAME VARCHAR2(30) USER VARCHAR2(30) SESSION_ADDR RAW(8) SESSION_NUM NUMBER SQLADDR RAW(8) SQLHASH NUMBER SQL_ID VARCHAR2(13) TABLESPACE VARCHAR2(31) CONTENTS VARCHAR2(9) SEGTYPE VARCHAR2(9) SEGFILE# NUMBER SEGBLK# NUMBER EXTENTS NUMBER BLOCKS NUMBER SEGRFNO# NUMBER
El monitoreo temporal del uso de espacios de tablas es una tarea simple de consultar V TEMP TEMPSEG_USAGE (V V SORT_USAGE, si se prefiere) a lo largo del tiempo:
select segtype, extents, blocksfrom v$tempseg_usagewhere tablespace = 'TEMP';
Recuerde que tal monitoreo no producirá datos procesables; a menos que la base de datos informe errores al asignar espacio temporal, el DBA realmente no tiene nada que ver.
Si desea saber cuántas extensiones se asignan y se usan realmente por archivo de datos, la siguiente consulta producirá un informe bastante útil:
select tablespace_name, file_id, extents_cached extents_allocated, extents_used, bytes_cached/1024/1024 mb_allocated, bytes_used/1024/1024 mb_usedfrom v$temp_extent_pool/
Una vez más, no es necesario tomar ninguna acción basada en un informe de este tipo; es simplemente con fines informativos.
¿Quién está usando su espacio temporal, qué consultas están ejecutando y cuánto de ese espacio está consumiendo cada una? También es una tarea bastante fácil de completar:
select u.username, s.sql_fulltext, u.segtype, u.extents, u.blocksfrom v$tempseg_usage u, v$sql swhere s.sql_id = u.sql_id;
La vista V TEMP TEMP_SPACE_HEADER proporciona una vista menos granular del espacio consumido y disponible; enumera el espacio asignado y no asignado en los archivos temporales, por archivo. Tenga en cuenta que asignado no significa usado; es probable que haya grandes diferencias entre los informes de V TEMP TEMP_SPACE_HEADER y lo que proporciona V TEMP TEMPSEG_USAGE.
Me citaré a mí mismo (de algún otro lugar de la web) con respecto al tamaño adecuado de los espacios de tabla temporales: «¿Cuánto espacio necesita en su espacio de tabla temporal? Eso dependería de cuán activo esté su sistema, cuántas sesiones activas simultáneas haya, el tamaño de las transacciones y cuánto espacio en disco tenga. No es una vergüenza aumentar el tamaño de su espacio de tabla TEMPORAL con el tiempo a medida que cambian los patrones de uso, el número de usuarios y los volúmenes de datos. Oracle también le informará de que el espacio de tabla temporal debe aumentarse emitiendo errores ORA-01652 (por ejemplo, no se puede extender el segmento temporal en 128 en el espacio de tabla TEMPORAL). El número reportado en un error ORA-01652 está en bloques, no en bytes, por lo que deberá convertirlo usando el valor db_block_size para saber cuántos bytes necesitaba el espacio de tabla temporal para completar la transacción que generó el error. No hay una «regla general» para dimensionar un espacio de tabla temporal porque tales reglas generalmente crean situaciones en las que la única herramienta se convierte en un martillo y cada tarea termina como un clavo, y la mayoría de las veces, golpeas ese pulgar con la única «herramienta» que se te ha dado.»
DBA_TEMP_FILES le dirá cuán grande es el espacio de tabla temporal:
SQL> select tablespace_name, sum(bytes)/1024/1024 MB 2 from dba_temp_files 3 group by tablespace_name 4 /TABLESPACE_NAME MB------------------------------ ----------TEMP 1024SQL>
También puede informar qué archivos están asociados con su espacio de tablas temporal:
SQL> select tablespace_name, file_name, bytes 2 from dba_temp_files 3 order by tablespace_name, file_name 4 /TABLESPACE_NAME FILE_NAME BYTES--------------- ------------------------------------------------------- ----------TEMP /u2/orawiz/parlopnett/temp01.dbf 1073741824SQL>
Si desea, o necesita, disminuir el tamaño de su espacio de tabla TEMPORAL, debe cerrar la base de datos, abrirla en modo restringido, cambiar el tamaño del archivo temporal (o archivos temporales) más pequeño que apagar y arrancar la base de datos. Agregar espacio no es tan complicado, ya que un simple ‘cambiar el tamaño del archivo temporal de la base de datos ;’ aumenta el espacio.
¿Qué sucede si el espacio de tabla temporal no existe o no está disponible? Oracle mostrará esto:
SQL> select * from mybigtable order by mycoolkey;select * from mybigtable order by mycoolkey*ERROR at line 1:ORA-01129: user's default or temporary tablespace does not exist SQL>
Si ve este mensaje de error, compruebe si el espacio de tabla temporal existe y está en línea. Corrija cualquier problema que encuentre (cree el espacio de tabla que falta o vuelva a poner en línea los archivos temporales).
Si el espacio de tabla existe pero no se le asignan archivos temporales (lo que puede ocurrir después de restaurar/recuperar una base de datos desde una copia de seguridad), Oracle informa:
SQL> select * from mybigtable order by mycoolkey;select * from mybigtable order by mycoolkey*ERROR at line 1:ORA-25153: Temporary Tablespace is Empty SQL>
Por lo tanto, la tarea es simplemente emitir ‘alterar espacio de tabla temporal … añadir archivo temporal …’comandos para hacer que el espacio de tabla ya no esté vacío.
Administrar el espacio de tablas temporal no es una ciencia de cohetes, pero difiere (a veces considerablemente) de los procedimientos de administración de espacios de tablas ‘normales’ empleados para archivos de datos regulares. Saber que un espacio de tabla temporal ‘completo’ no es un problema (recuerde que los segmentos se asignan y luego se reutilizan) puede hacer que la tarea sea un poco más fácil, ya que Oracle le dirá (con errores ORA-01652) si se ha quedado sin espacio. Lo que significa que el DBA puede dedicar tiempo a tareas útiles, como el restablecimiento de contraseñas.
Ver todos los artículos de David Fitzjarrell