【翻譯自mos文章】 在錯誤的從os層級remove掉 trace file 之後,怎麼找到該trace file的內容?,mostrace
在錯誤的從os層級remove掉 trace file 之後,怎麼找到該trace file的內容?
參考原文:
How to Find the Content of Trace File Generated for an Oracle Process after Removing the Trace File by Mistake at OS Level (Doc ID 805083.1)
適用於:
Oracle Database - Enterprise Edition - Version 8.1.7.4 to 11.2.0.1.0 [Release 8.1.7 to 11.2]
Generic UNIX
Generic Linux
目標:
當錯誤的從從os層級remove(這個remove是指rm)掉 trace file 之後,oracle進程的trace file 是不會被重新建立的。
那怎麼看到這些trace file的內容?
解決方案:
這種行為的解釋 和解決方案在
Bug 8367394: A NEW TRACE FILE IS NOT BEING CREATED IF THE INITIAL ONE WAS REMOVED
給出了。--->注意:我看了一下該bug的workground,是restart instance。
在下面的例子中,請注意從11g開始,trace file的位置不在bdump 下,而是在{ADR_HOME}/trace/下。
當進程是alive的時候,進程不會在 trace file上執行close()函數。
進程依然持有 指向trace file 的 file descriptor。
trace file 的名字包括進程的pid,
因此,除非進程被重啟,否則我們不能關閉 file descriptor,也不能建立一個用新檔案名稱或者老檔案名稱的新檔案
這並不意味著,在緊急情況下,你不能訪問該trace file。
當該trace file 被delete掉後,只要file descriptor依然open,你就可以獲得該檔案的內容,該內容依然被正常寫。
通過如下方法經過file descriptor 來訪問 file
ps -ef|grep v10204|grep dbw0
oracle 11283 1 0 16:23 ? 00:00:00 ora_dbw0_v10204
lsof -p 11283|grep dbw0
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
oracle 11283 oracle 2 REG 3,1 767 20728692 /bdump/v10204_dbw0_11283.trc
從上面的結果中,我們可以看到fd 為2,如下也能驗證fd 為2
ls -lA /proc/11283/fd | grep dbw0
l-wx------ 1 oracle dba-64 Mar 25 16:24 2 -> /bdump/v10204_dbw0_11283.trc
從os層級 remove掉trace file ,fd 依然存在,只是file 被delete掉了。
ls -lA /proc/11283/fd | grep dbw0
l-wx------ 1 oracle dba-64 Mar 25 16:24 2 -> /bdump/v10204_dbw0_11283.trc (deleted)
這個fd (file descriptor)在它被關閉 或者 進程被重啟之前 是存在的。
你可以訪問它的內容:
cat /proc/11283/fd/2 > /tmp/v10204_dbw0_11283.trc