当领导要你用gdb去分析oracle数据库启动过程加载对象时怎么做?
sinye56 2024-10-10 10:40 4 浏览 0 评论
概述
分享下之前做的一个小实验,通过gdb工具来研究下oracle数据库启动过程。
1、启动数据库到mount状态并获取进程spid
startup mount; select spid from v$process where addr in (select paddr from v$session where sid=(select distinct sid from v$mystat));
这里注意窗口不要关闭。
2、通过gdb跟踪这个进程
$ gdb $ORACLE_HOME/bin/oracle 3135 #跟踪两个内部指令 (gdb) break kcrf_commit_force (gdb) break kqlobjlod
3、此时执行数据库open操作会被挂起
alter database open;
4、重开一个sqlplus进程,查询此时数据库加载的rowcache对象
SQL> select parameter,count,gets from v$rowcache where count!=0;
no rows selected
5、继续执行,在第三个步骤后,数据库加载了一个rowcache对象
(gdb) c Continuing. Breakpoint 1, 0x00000000096cf564 in kcrf_commit_force () (gdb) c Continuing. Breakpoint 1, 0x00000000096cf564 in kcrf_commit_force () (gdb) c Continuing. Breakpoint 2, 0x0000000001c4995e in kqlobjlod () SQL> select parameter,count,gets from v$rowcache where count!=0; PARAMETER COUNT GETS -------------------------------- ---------- ---------- dc_objects 1 1
6、这个rowcache对象是什么呢?
SQL> select address,cache_name,existent,lock_mode,saddr,substr(key,1,40) keystr from v$rowcache_parent;
解析其key值,正是bootstrap$,这就是数据库初始化时加载的第一个对象
SQL> select dump('BOOTSTRAP