分类目录归档:Database

使用ORACDEBUG 修改 数据库SCN

之前有一些简单介绍SCN的文章: 浅谈SCN_1–从oracle7至今,如何获取scn 浅谈SCN_2–_kcmgas_函数 通过修改控制文件来修改SCN 1988年Oracle发布了Oracle V6,这一版本中Oracle引入了热备的操作,同时SCN使用48位存储的算法写死在代码中,一直沿用至12c以前(12c开始使用8个bytes存储SCN)。由于ORACLE的SCN是由48位来表示的,因此最大值不能超过2的48次方 Oracle为了确保48位的SCN能够用足够长的时间(500年),于是对SCN做出了一个限制,就是每秒钟SCN最大增长不能超过16K,Oracle从1988年1月1日0点0分0秒为基准时间,到当前的秒钟数乘以16K,就是当前SCN的最大允许值这就是SCN HEADROOM。 因此SCN天花板 的计算公式就类似于: (当前时间-19880101 000000)*16384–(current_scn),其中 16384是SCN的内部增长速度16k,这是代码中的硬限制。 这个限制在11.2.0.2版本之前,scn 的最大增长频率是16k,在11.2.0.2版本开始,为32k。 此行为是受到下面参数_max_reasonable_scn_rate控制的: 在11.2中,Oracle除了将SCN 每秒最大的增长量从16K加大为32K,还引入了一个阀值,用于阻断有SCN HEADROOM问题的系统将故障传播到其他系统。 这些修复包含在下列补丁中: 如果SCN发生突增的情况,alert中就会出现类似下面的告警: 因此,打了这上面这些补丁后,就不能使用以前的参数直接修改SCN了。 然后,有时候数据库遇到一些异常错误,还是需要将SCN推进的到一个合适的值,例如,常见一些错误造成数据库的部分block跟数据库SCN不一致,或者一些有undo$数据库启动时引导失败: ORA-600 [2256] ORA-600 [2662] ORA-600 [4000] ORA-600 [kcsadjn1] 在以前我们使用参数来修改SCN,例如: event=”10015 trace name adjust_scn level x” 或者使用 _minimum_giga_scn … 继续阅读

发表在 backup&recovery, Internal | 标签为 | 留下评论

奇怪的AWR–部分sql执行次数跟实际情况相差10倍之多

应用通知有个应用很慢,于是查原因 下面是AWR的采样时间: 从AWR可以看到该语句30分钟内,这两条应用反应慢的语句的执行次数分别在930万次和950万次,这个跟应用的反映差了一个数量级: 但是应用反映,实际上在应用中实际设置的加载量是10分钟25万次。 这就很奇怪了,首先用logminer随机抽查了10分钟的归档,并挖掘了数据: 根据Logminer的挖掘的结果,发现实际执行次数跟应用反馈的执行次数差不多,跟AWR的数据相差大概10倍: 再查一下其他语句: 检查awr发现,该语句的执行次数基本跟吻合。 这里也就是说,部分语句执行次数相差10倍,但是部分语句的执行次数又是正常的,奇葩! 检查share pool,发现大量sql异常LUNARDB 这里的sql信息感觉严重失真,貌似重复了很多,也就是应该purge的sql在V$SQL中没有被更新,而是越积越多…… 重启服务器后,恢复正常,目前还没有找到具体的bug信息。

发表在 Performence Tuning | 标签为 | 留下评论

insert 的enq: TM – contention的情况-1 —–对有主外键关系的表的操作

insert 的enq: TM – contention的情况-1 —–对有主外键关系的表的操作 insert 的enq: TM – contention的情况-2 —–只有主键约束无子表的情况 #################################################################################### 总结1 :当外键无索引时 1,对子表的insert操作所在的事务没有完成前,对于父表的DML操作(INSERT/UPDATE/DELETE)都会因为不能获得对子表的TM锁而出现enq: TM – contention。 2,在总结1的基础上,如果又有了对子表的insert(我没有测试,但是我怀疑这里如果改成对子表的update和delete,也是相同道理……). 那么这个对子表的insert同样被阻塞,等待事件也是 enq: TM – contention。 3,对父表的insert会阻塞对父表的delete。同样的道理,此时对父表的insert也阻塞对父表的update pk操作。 #################################################################################### ######################################################### 当没有索引的时候: ######################################################### 测试1, 在子表发生:Insert,然后在父表上有update操作 Session 1: 对子表进行insert,不commit时: 这是,我们看到,该回话在主表(1062788 DEPT)和子表(1062790 EMP)上都分别持有了 exclusive … 继续阅读

发表在 Performence Tuning | 标签为 | 留下评论

一次体验N种报错的Oracle数据库恢复(ORA-704 ORA-604 ORA-600[25016] ORA-376)

朋友数据库报错: 使用隐含参数拉库: 这里看到由于他之前在OS上删除了文件,又重建了控制文件,因此数据字典中的文件信息和重建的控制文件不匹配 因此,报了上面的错误。 这时候使用使用隐含参数屏蔽system表空间检查,并屏蔽只读打开状态的字典检查,并使用gdb跳过数据字典检查,再次resetlog数据库试试看: 这里是AIX系统: 这是看到,已经跳过了数据字典检查,并且报错是ORA-00604 ORA-00376 ORA-01110 这个跟我以前处理自己的一次测试很相似了,参见《艰难的修复数据库过程,却发现Oracle 11.2果然强大》 alert信息如下: 再次尝试重建控制文件,使用gdb跳过字典检查,然后使用open upgrade尝试打开库(因为此时数据文件的scn都一致了): 尝试open数据库,发现数据库又出现了ORA-00600 [25016] 这至少说明一个问题,没有使用resetlogs的时候,控制文件并没有损坏,因此,不重建控制文件,直接恢复数据库,然后open upgrade: (CDKF177:oracle)/home/oracle>sqlplus / as sysdba 数据库已经open了。

发表在 backup&recovery | 标签为 , , , | 留下评论

升级到11.2.0.4的一些发现-3-catalog.sql的主要内容

升级到11.2.0.4的一些发现-1-catupgrd.sql大致解读 升级到11.2.0.4的一些发现-2-其他发现 升级脚本catupgrd.sql中,首先调用的catupstr.sql主要用于更新数据字典(里面还调用很多重要的创建基表的语句),例如: 之后,就是调用catalog.sql来创建各种数据字典,大概看了一下,记录如下:

发表在 Installation and Deinstall | 标签为 , | 留下评论

升级到11.2.0.4的一些发现-1-catupgrd.sql大致解读

升级到11.2.0.4的一些发现-2-其他发现 升级到11.2.0.4的一些发现-3-catalog.sql的主要内容 10.1的时候写了一个blog,由于当时blog出问题,丢失了,今天无意中找到这个丢失那篇blog的备份,补充上,O(∩_∩)O哈哈~ 后续的第二篇,参见《升级到11.2.0.4的一些发现-2-其他发现》 Rem Initial checks and RDBMS upgrade scripts Rem catalog and catproc run with some multiprocess phases @@catalog.sql –CATFILE -X 该脚本主要操作如下: @@catproc.sql –CATFILE -X ——-设置 ALTER SESSION SET NLS_LENGTH_SEMANTICS=BYTE;

发表在 Installation and Deinstall | 标签为 | 留下评论

11.2定时任务引起的系统负载异常—案例1

今天同事反映,周末新切换的一个数据库CPU load定期出现高峰,图形怪异: 检查了一下系统的定时任务: 主要是resource manager的定时维护任务,因此手工关闭定是维护任务。 这里,EXFSYS是Oracle Expression Filter 组件的owner,根据mos的建议,可以卸载该组件: 然后停止相关的自动维护的job: 从zabbix上观察,11点02分操作完成后,到现在为止,系统已经平稳了,O(∩_∩)O哈哈~

发表在 Performence Tuning | 标签为 | 留下评论

Linux 环境下11.2.0.3 rac的快速卸载脚本

在Oracle 11.1和Oracle 10.1,10.2上,都是官方提供手工清理RAC环境的方法的(比如环境有问题,或者RAC安装失败,要清理后重新安装。虽然这些版本,也提供了卸载脚本,但是总是卸不干净,因此那个时候,更多的这种需求都是通过手工卸载完成的)。 从11.2开始,Oracle不推荐使用手工方式删除RAC环境,而是提供重新配置的脚本和专门的卸载包。但是我个人还是喜欢手工卸载(依据依然来源于 Oracle 的文档)。 之前写过基于AIX平台的,AIX环境下11.2 rac的快速卸载脚本 今天因为需要,写了Linux的,实测了一下,效果很好,测试环境: OEL 6.5 + Oracle 11.2.0.3 RAC 手工清理rac环境,轻松还原裸系统(准备重新安装): rm -rf /etc/oracle/ rm -f /etc/init.d/init.cssd rm -f /etc/init.d/init.crs rm -f /etc/init.d/init.crsd rm -f /etc/init.d/init.evmd rm -f /etc/rc2.d/K96init.crs rm -f /etc/rc2.d/S96init.crs rm -f /etc/rc3.d/K96init.crs … 继续阅读

发表在 Installation and Deinstall | 标签为 , | 留下评论

升级到11.2.0.4的一些发现-2-其他发现

升级到11.2.0.4的一些发现-1-catupgrd.sql大致解读 升级到11.2.0.4的一些发现-3-catalog.sql的主要内容 1,如果当前连接的用户不是SYS,那么会报ORA-01722: invalid number错误: 那么判断是否当前连接用户为LUNAR,就可以使用下面的语句: 同样道理,判断当前数据库版本是否为11.2.0.4: 然后,通过下面的命令查看sqlplus的错误日志: 这里我们看到,并没有记录下来sqlplus的操作错误,仔细看一下,原来set errorlogging on table命令必须在当前用户下执行,例如: 看,错误信息,一目了然 3, auto-bulkification by setting event 10933 4,catupgrd.sql会调用catupstr.sql, 这个脚本执行过程中中,还需要依次调用: catupses.sql i0902000.sql——重整 props$,dependency$,mon_mods$。之后,该脚本还调用i1001000.sql。i1001000调用i1002000.sql。 在i1002000.sql有有一个有意思的操作: Rem clear 0×00200000 (read-only table flag) in trigflag during upgrade update tab$ set trigflag = … 继续阅读

发表在 Installation and Deinstall | 标签为 | 留下评论

使用statspack监控Active Dataguard的性能—1-安装篇和简介

Statspack的功能早在Oracle 8.1.6就可以使用(Oracle 8.1.7正式随产品发布),这里不再赘述,baidu google上大把大把的…… 从Oracle 10.1开始,Oracle引入了AWR(Automatic Workload Repository),其功能较之statspack不是强大了一星半点(AWR,ASH,ADDM,SPA,SPM……),statspack一度在10g后被搁置了…… 随着Oracle 11.1 ADG的出现,Statspack有了新的用途……我们都知道ADG是只读打开的,其awr跟主库的是一致的,监控ADG上的查询业务的功能,又变成了使用脚本和crontab等的手工作坊式管理……Oracle为此给statspack增加了新的功能: @?/rdbms/admin/sb* 在statspack目录下($ORACLE_HOME/rdbms/admin/),有两类statsapck相关的文件: 前面的sp开头的应该都不陌生,跟9i和8i的都一样的: 后面sb开头的是ADG中在备库上使用的一套脚本(sb,也就是standby): 具体的安装过程,参加下面的附件sbcreate 如果ADG是RAC,那么需要使用sbaddins.sql将其余的节点加入到statspack中。

发表在 Dataguard, Performence Tuning | 标签为 , , , | 一条评论