strace 使用
使用Strace跟踪oracle读取数据块
oracle是一个C语言程序,通过调用系统的io函数来实现io的过程,在linux下可以通过strace工具来
很方便查看进程对io函数的调用过程.
测试场景使用了rhel 5.8和oracle database 12C.
查看oracle对应的服务器进程号.
[root@o12c ~]# ps -eaf | grep beq
oracle 1611 1591 0 03:01 ? 00:00:00 oraclec12 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
root 1683 1650 0 03:02 pts/5 00:00:00 grep beq
使用strace 对进程进行跟踪
[root@o12c ~]# strace -p 1611 -o test1.out
首先调用open函数,读取表空间的数据文件返回句柄12,然后使用fcntl进行文件句柄复制和其他操作,原来的文件句柄12被关闭.
接下来使用pread函数来读取文件.附带也证明了一点就是oracle服务器进程负责去读取数据文件,而写数据文件是通过后台进程dbwr
来完成的.
接下来我们打开sql trace,通过sql trace文件和strace文件对应,过程更加直观.
[root@o12c ~]# ps -eaf | grep beq
oracle 1916 1915 0 03:16 ? 00:00:00 oraclec12 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
SQL> alter session set events '10046 trace name context forever,level 8';
Session altered.
[root@o12c ~]# strace -p 1916 -e write=all -e all -o test2.out
http://www.htz.pw/2014/05/11/solaris-rac%E5%B9%B3%E5%8F%B0%E6%A8%A1%E6%8B%9F%E8%8A%82%E7%82%B9crash%E8%8A%82%E7%82%B9%E7%9A%84%E5%BC%BA%E5%88%B6%E5%88%A0%E9%99%A4%E4%B8%8E%E5%A2%9E%E5%8A%A0.html