あのファイルは誰が見てるんだろう? を調べてみた

 それは先日試験環境でUNDO表領域の再作成をしていたときのこと。
 手順は簡単で
1.代替のUNDO表領域を作成
create undo tablespace HOGE datafile '/HOGA/HUGA.dbf' size 100M ;
2.作成したUNDO表領域をonlineにする
alter tablespace HOGE online;
3.UNDO表領域を切り替える
alter system set undo_tablespace=HOGE scope=both;
4.旧UNDO表領域を使用するセッションがなくなるのを確認
select drs.tablespace_name, drs.segment_name, vr.status
from dba_rollback_segs drs, v$rollstat vr
where drs.segment_id=vr.usn;
=> TABLESOACE_NAMEが旧UNDO表領域、STATUS列がPENDING OFFLINEの列がなくなるまで待つ
5.旧UNDO表領域削除
drop tablespace <現行UNDO表領域名> including contents and datafiles;
6.1〜7の手順を繰り替えしてUNDO表領域作り直し
 と、いうもの。

 その手順6でトラブりました。調べてみると、UNDO表領域を削除した筈が、UNDO表領域が使用していたファイルシステムの空き容量が増えてない……。記憶を手繰ると「プロセスが掴んでいるファイルをrmすると類似の事象(プロセスがファイルを話すまでファイルシステムの空きが増えない)が発生する」というものにぶつかりました。
 えーっ! Oracleプロセスが何かつかんでたのーっ! とはいえファイル消しちゃった今となっては追えないし……。仕方ないのでOracleを一旦停止してみたところ、無事空き領域が確保されたのでしたとさ。止められる環境で良かった……。

 で、改めて、Oracleのプロセスってどんなファイルをつかんでるのか知らん? ということで調べてみました。方法は単純で、各表領域のdbfファイル、制御ファイル、REDOログファイル、アラートログファイルにfuserをかけて、そのPIDを元にpsからプロセス名を特定するってもの。
 結果は以下のとおり。
・system表領域dbf:lgwr, ckpt, smon, dbw0, cjq0, q000, q001, dbrm, mmon, reco
sysaux表領域dbf:lgwr, ckpt, smon, dbw0, cjq0, q000, mmon
・UNDO表領域dbf:lgwr, ckpt, smon, dbw0, cjq0, q000, mmon
・temp表領域dbf:smon, dbw0
・表用表領域dbf:lgwr, ckpt, smon, dbw0
・索引用表領域dbf:lgwr, ckpt, smon, dbw0
・制御ファイル:lgwr, ckpt, cjq0, mmon, dbw0
・オンラインredoログファイル:lgwr
・アラートログ:なし

 ふむ、制御ファイルとデータファイルの整合性を保つckptがほぼ全てのファイルにいるのは至極納得。systemは全プロセスが触りっぱなしなのかと思ったらpmon, vktm, mman, diag, qmnc, w000, mmnlあたりが触ってないなぁ。
 アラートを誰も触ってないのはちょっと意外かも。あ、でも触りっぱなしじゃログローテートできないか。

 今回はそんな「ただ試してみた」だけの話でした。観察日記の類ですね。