miércoles, 17 de marzo de 2010

ORACLE: Error ORA-00313

Hoy amanecimos con un disco menos en el servidor, y la base de datos (un 9.2 en RAC) nos avisó que no podía acceder a un logfile de determinado thread y grupo.

Cómo los logfiles están cruzados en diferentes unidades de disco (justamente para prevenir estas fallas físicas de disco) tuve que eliminar los logfiles que figuraban como inválidos en la vista V$LOGFILE y a su vez reconstruirlos en otro FS, como se ejemplifica a continuación:

alter database drop logfile member '<ruta>/<logfile>';
alter database add logfile member '<ruta nueva>/<logfile>' reuse to group <grupo>

Cuidado, si algún drop falla, probablemente es porque ese logfile esté siendo utilizado por la base, en ese preciso momento, con lo cual podemos esperar o forzar el switch a otro redo, con alter system switch logfile; tal vez tengamos que ejecutar esta sentencia más de una vez, para que finalmente se pueda hacer el drop.

Si todo esto fué bien y consultamos la V$LOGFILE y nos figura alguno de los nuevos logfile como invalido, puede ser porque la instancia ya esté utilizando ese grupo de redo, con lo cual devuelta ejecutamos una o más veces el alter system switch logfile y con esto se debería solucionar, salvo que haya otro problema de fondo, por lo que no pueda ser utilizado el nuevo archivo, por ejemplo la nueva ubicación también tiene sectores inválidos.

ORACLE: Segmento temporal

Esta es una interesante consulta para echarle un vistazo al segmento temporal (en un 9.2.0)

SELECT ses.inst_id,
ses.sid,
ses.serial#,
ses.username,
ses.status,
ses.machine,
ses.program,
seg.blocks,
txt.piece,
txt.sql_text
FROM gv$session ses,
gv$tempseg_usage seg,
gv$sqltext txt
WHERE seg.blocks > 32
AND seg.sqladdr = txt.address
AND seg.sqlhash = txt.hash_value
AND seg.session_addr = ses.saddr
AND seg.session_num = ses.serial#
and seg.inst_id = ses.inst_id
and seg.inst_id = txt.inst_id
ORDER BY seg.blocks,
txt.piece;

Encontré este enlace que me pareció muy útil.