概述

分享下之前做的一个小实验,通过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) cContinuing.Breakpoint 1, 0x00000000096cf564 in kcrf_commit_force ()(gdb) cContinuing.Breakpoint 1, 0x00000000096cf564 in kcrf_commit_force ()(gdb) cContinuing.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$',16) from dual;DUMP('BOOTSTRAP$',16)--------------------------------------------Typ=96 Len=10: 42,4f,4f,54,53,54,52,41,50,24

7、数据库递归查询bootstrap$对象中的数据,向内存加载其他对象。

(gdb) cContinuing.Breakpoint 2, 0x00000001006c78b4 in kqlobjlod ()ADDRESS CACHE_NAME E LOCK_MODE SADDR KEYSTR---------------- ----------------------- ----------------------------------------00000001942E30D8 dc_tablespaces N 0 00 000000000000000000000000000000000000000000000001942DE9B8 dc_rollback_segments Y 0 00 000000000000000000000000000000000000000000000001942E9080 dc_objects Y 0 00 000000000A00424F4F545354524150240000000000000001942DE2D0 dc_objects N 3 0000000194782EB0 000000000600435F4F424A23000000000000000000000001942E3340 dc_object_ids Y 0 00 3800000000000000000000000000000000000000

这里可以看到数据库加载了回滚段信息,首先加载的是system的回滚段,转储row cache信息之后,就可以看到这些详细内容

ALTER SESSION SET EVENTS 'immediate trace name row_cache level 10';

这里得到的bucket 37包含了回滚段信息

BUCKET 37:row cache parent object: address=0x1942de9b8 cid=3(dc_rollback_segments)hash=5fed2a24 typ=9 transaction=0x0 flags=000000a6own=0x1942dea88[0x1942dea88,0x1942dea88] wat=0x1942dea98[0x1942dea98,0x1942dea98] mode=Nstatus=VALID/INSERT/-/FIXED/-/-/-/-/-data=00000000 00000000 00000001 00000009 59530006 4d455453 00000000 0000000000000000 00000000 00000000 00000000 00000003 00000000 00000000 0000000000000000 00000000 00000000 00000000BUCKET 37 total object count=1ROW CACHE HASH TABLE: cid=4 ht=0x192b2e8a8 size=256其中 53595354454d 正是system回滚段SQL> select dump('SYSTEM',16) from dual;DUMP('SYSTEM',16)-------------------------------Typ=96 Len=6: 53,59,53,54,45,4d

另一个bucket正是bootstrap$对象

BUCKET 43170:row cache parent object: address=0x1942e9080 cid=8(dc_objects)hash=f3d1a8a1 typ=11 transaction=0x0 flags=000000a6own=0x1942e9150[0x1942e9150,0x1942e9150] wat=0x1942e9160[0x1942e9160,0x1942e9160] mode=Nstatus=VALID/INSERT/-/FIXED/-/-/-/-/-set=0, complete=TRUEdata=00000000 4f42000a 5453544f 24504152 00000000 00000000 00000000 0000000000000000 00000001 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000038 00000001 00000038 066f7802 030d141111066f78 78030d14 1411066f 0001030d 00000000 00000000 00000000 0000000000000000 00000000BUCKET 43170 total object count=1

总结:

以上是用gdb跟踪数据库启动时bootstrap$的加载与引导过程,从上面我们可以知道bootstrap$的重要性,如果bootstrap$发生损坏,数据库将无法启动。大家有空也可以测试一下。

后面会分享更多DBA方面的内容,感兴趣的朋友可以关注下!!

oracle 启动_oracle实验--通过gdb工具研究数据库启动过程相关推荐

  1. linux下达梦数据库启动_linux 平台 达梦DM 7 数据库 启动与关闭

    在之前的博客我们了解了Linux 平台下DM7的安装,如下: 在本篇博客里我们了解一下DM7的启动和关闭. 1 背景知识说明 1.1 DM DB的启动过程 DM的启动主要按如下三个步骤进行: 1.读取 ...

  2. oracle实验六杨艳华_oracle实验报告总结

    Oracle 实验报告 姓名 学院: 年级: 班级: 指导老师: 实验一 了解 ... 学期 Oracle 数据库应用技术 实验报告 选课序号: 班级: 学号: 姓名: 指导教师: 成绩: 史金余 2 ...

  3. 验08利用gdb工具调试c语言程序,实验4_C开发工具和系统函数

    实验四C开发工具和系统函数 (一)C语言开发工具 目的 1.掌握gcc.make.gdb工具 2.熟悉c语言 内容 1.编写一个c语言程序:输出两行文字"Linux下的c也不是太难嘛!&qu ...

  4. ROS Learning-032 (提高篇-010 Launch)Launch 深入研究 --- (启动文件编程)ROS 的 XML语法简介...

    ROS 提高篇 之 Launch 深入研究 - 01 - 启动文件的编程 - ROS 的 XML语法简介 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubu ...

  5. 【Oracle RAC+DG实验】Oracle RAC+ASM+DataGuard配置实验记录+常见问题

    [Oracle RAC+DG实验]Oracle RAC+ASM+DataGuard配置实验记录+常见问题 1.环境规划: ---RAC环境介绍(primary database)            ...

  6. vm磁盘映射 不能启动_Oracle的启动与关闭-数据库(4)

    Oracle数据的库的启动与关闭,为了节约资源消耗,把我们用到的服务开启,这样对于项目开发也有好处. 1 Oracle 启动 Oracle 是通过系统的服务来启动的. 图1. 找到计算机管理 图2. ...

  7. oracle数据库启动多个监听,一台Oracle数据库服务器上两个监听同时使用

    记得之前Oracle原厂的工程师在例行检查时发现一台Oracle数据库服务器的上启动了两个监听,分别监听的是1521和1581端口,而且两个端口都在用,当时当作一个比较奇怪的现象,没有能理解原因是什么 ...

  8. Ubuntu16.04下gdb工具gef的安装 wget命令详解

    文章目录 gef安装 wget命令 gef安装 跟着CTFWiki学格式化字符串的时候,看教程用的gdb工具是gef,就准备给ubuntu换成gef. 在网上搜了gef安装教程: #via the i ...

  9. Oracle Spatial中上载GIS空间数据方法研究

    Oracle Spatial中上载GIS空间数据方法研究 作者:佚名    文章来源:博客中国    点击数:6873    更新时间:2006-8-24 摘要:采用Oracle Spatial 存储 ...

  10. ESP32程序调试 win10 使用OPENOCD及GDB工具

    ESP32程序调试 win10 使用OPENOCD及GDB工具 需求:使用OPENOCD及GDB工具调试ESP32程序,本文以ESP32-WROOM-32模块为例. 环境说明: ESP32软件开发环境 ...

最新文章

  1. 优化ASP.NET应用性能之ViewState篇
  2. 关于方程求根的解决方案
  3. js self = this的解释
  4. 计算机不属于发明保护客体,如何判断两种类型的计算机程序发明能否成为专利保护客体?...
  5. 安装python进度条不动了_TensorFlow(一):使用Anconda安装TensorFlow
  6. Python使用matplotlib进行可视化时精确控制图例位置
  7. python开发直播网站_开发直播网站源码的三种计算机语言
  8. Python对象序列化-Pickle模块
  9. frontend-tools
  10. centos挂载ntfs文件系统
  11. 再传喜讯,鸿雁中标杭州地铁3号线配电工程
  12. 蓝桥杯五4史丰收速算
  13. 如何将docx文本转换成使用微信小程序rich-text能编译的格式
  14. 51单片机 c语言 汇编,51单片机之时钟(C语言和汇编两种方式实现)
  15. 为什么我的pycharm创建不了python_[新手向视频]新版PyCharm创建项目为什么会有问题...
  16. 芯片制造全工艺流程详情,请收藏!
  17. 使用Convert命令进行显示转换
  18. 蓝的成长记——追逐DBA(10):飞刀防身,熟络而非专长:摆弄中间件Websphere
  19. 【转】PC机安装MAC虚拟机
  20. Java权限管理|基于springBoot+springSecurity+jwt实现前后端分离用户权限认证

热门文章

  1. 模型参数选择方法——GridSearch网格搜索
  2. 2018-2019-1 20165204 实验三 实时系统
  3. STM32 USART 波特率计算
  4. 判断闰年的方法以及如何获得单链表的倒数第K个元素
  5. 引擎设计跟踪(九.2) 3DS MAX 导出插件 继续
  6. PMP 与IPMP区别是什么?
  7. 原来查询语句还有这功能,累计变量值
  8. 平均分配,移动欠费催收款数据的分配应用实例
  9. HCIE-RS-TAC-01-AR29的loopback0无法访问AR28的loopback
  10. ASA REST API安装步骤