分类目录归档:FAQ

根据一个给定的rowid手工推算他的file#,block#,obj#,row#

从Oracle 8i开始使用扩展rowid标识行物理地址,扩展rowid使用base64编码行的物理地址,编码字符包含A-Z, a-z, 0-9, +, 和/。 扩展rowid由四部分组成:OOOOOOOFFFBBBBBBRRR。其中: OOOOOO:数据对象编号(6位显示) FFF:相关数据文件编号(3位显示) BBBBBB:数据块编号(6位显示) RRR:数据块中行编号(3位显示) 8i以后,rowid采用base64编码(基于64位的编码)的扩展rowid. . 关于64bit编码表,可以搜索Google或者Baidu,关键字“Base64编码表”。 将64位编码转换为十进制: file#: AAB —–> 0 0 1 —–>0*64^2+0*64^1+1*64^0 =1 block#: AAAAMh —–> 0 0 0 0 12 33 —–>0*64^5+0*64^4+0*64^3+0*64^2+12*64^1+33*64^0 =801 obj#: AAAABi —–> 0 0 0 … 继续阅读

发表在 FAQ | 标签为 | 留下评论

insert 的enq: TM – contention的情况-2 —–只有主键约束无子表的情况

insert 的enq: TM – contention的情况-1 —–对有主外键关系的表的操作 insert 的enq: TM – contention的情况-2 —–只有主键约束无子表的情况 #################################################################################### 总结2 : 1,当存在pk时,无论有没有子表,对存在pk的表来说,无论有没有子表,update pk的操作会同时阻塞对该表做insert操作中那些pk跟update语句更改前、后两个值相关的会话。 2,当子表无事务时,我下面的简单的测试情况下(其他复杂情况没有测试)跟上述第一点结果相同 #################################################################################### 测试6: 在测试5的基础上,测试一下子表无事务的情况下,对父表的update是如何影响父表的delete和insert的 首先,我们在Session 4(SID 116)对做commit,此时session 2(SID 220)会自动解锁,并报出来应有的违反约束的错误ORA-02292: Session 4: 现在,我们把所有的会话都做commit或者rollback,然后观察对父表的updae会不会对父表的其他DML操作有影响: Session 2(SID 220): 这里看见session 4对父表的delete不受session 2在父表的update的影响,而session 5对父表的insert 会被session 2在父表的update阻塞 被阻塞的对父表的insert操作等待事件为:enq: TX … 继续阅读

发表在 FAQ | 标签为 | 留下评论

使用ASM的数据库和使用文件系统的数据库在AIO上哪里不同?

昨天客户的一个重要应用切换到新的系统环境上,今天观察,发现部分异常等待: 从OS的CPU负载来看,定期会出现一个峰值,从ASH中可以看出,这个峰值对应的等待事件跟AWR的完全吻合。 因此,主要怀疑两个东西: 1,应用的SQL和对象的属性(比如table或者index的统计信息,并行度等等……) 2,系统的AIO设置 上面的第一条,已经提交给开发相应的SQL和其他信息 第二条,因为系统以前是11.2 RAC,使用了ASM,而现在是单机文件系统. 因此对比了这两种环境下AIO的异同,结论如下: 1,Linux下,ASM数据库和文件系统数据库的AIO设置差别: (1). ASM的AIO属性是不受 FILESYSTEMIO_OPTIONS 参数的影响(因为ASM会绕过文件系统buffer),只跟DISK_ASYNCH_IO有关系 (2). 文件系统的AIO属性跟 FILESYSTEMIO_OPTIONS 和 DISK_ASYNCH_IO 都有关系 2,FILESYSTEMIO_OPTIONS=NONE : Bug 6733627 – Unaccounted Wait Time on “Direct Path” operations with FILESYSTEM_IO_OPTIONS=NONE (Doc ID 6733627.8) 3, db file … 继续阅读

发表在 ASM, FAQ | 标签为 , , , , | 留下评论

Linux上,使用screen在后台执行scp(或者其他长时间的操作)

如果有些操作需要长时间执行,没有vnc的时候(也不通过写脚本的方式,比如scp命令),那么可以通过screen放到后台操作: 在OEL 5.8上缺省就安装了screen,但是在OEL 5.10上,需要自己单独安装。 下面,我使用Oracle的yum源安装screen: 下面的例子就是使用screen在后台创建窗口,执行scp传输rman备份集: 首先可以创建一个窗口,起名字为lunar(可以开多个窗口): 接着,你会看到一个全新的shell: 按Ctrl+a+d,就可以讲这个窗口detached。 然后使用screen -ls可以看到刚才的窗口的进程号等信息: [root@lunar ~]# screen -ls There is a screen on: 11012.lunar (Detached) 1 Socket in /var/run/screen/S-root. [root@lunar ~]# ps -ef|grep 11012 root 11012 1 0 08:10 ? 00:00:00 SCREEN -S … 继续阅读

发表在 FAQ | 标签为 , | 留下评论

测试在线重定义功能

9i开始,Oracle引入了在线重定义功能,但是bug比较多,10g时,如果数据量比较大,有些特殊场景,也有bug。 因此,前几天有同事需要测试在线重定义的功能,我查了下MOS,做个demo,做一个功能测试,如果生产上在低版本数据库执行在线重定义功能时,请仔细查看MOS上相关的常见问题。 –创建测试表 –收集统计信息 –创建空的分区表 –执行Redefinition.can_redef_table,验证unpar_table表是否可以在线重定义,如果不可以会给出建议: EXEC Dbms_Redefinition.can_redef_table(USER, ‘unpar_table’); 执行这一步的时候,如果缺少如下权限,那么会报如下错误: 第 1 行出现错误: ORA-06550: 第 1 行, 第 7 列: PLS-00201: 必须声明标识符 ‘DBMS_REDEFINITION’ ORA-06550: 第 1 行, 第 7 列: 解决方法: grant execute on dbms_redefinition to lunar; 执行这一步的时候,如果缺少如下权限,那么会报如下错误: 第 1 … 继续阅读

发表在 FAQ | 标签为 , | 留下评论

研究数据字典和基表,发现处理手工删除fs$或者file$等问题的新思路

在测试环境玩什么东西忘记了,反正是忽然发现有个没用的表空间“UNDOTBS1”删除不掉,以前写过一篇,如何查找某个对象的定义(V$_X$_DBA), 这里重温一下数据字典和动态性能视图: UNDOTBS1在v$tablespace中可见,但是不能drop,在dba_tablespaces中不可见,说明数据字典和动态性能视图不匹配了(手工删除了基表导致的,忘记是删除了ts$还是file$内容了): 不得不说Oracle 11.2.0.3以后的版本,对于数据库的一致性校验进行了很人性化的改动,以前这种情况是crash的,现在还open着,带病工作,O(∩_∩)O哈哈~ 类似的带病工作的情况,还涉及到很多数据字典的不一致情况,比如以前的i_dependency1, i_dependency2等等。 从这个研究,也证实了如下结论: V$TABLESPACE的信息是来源于GV$TABLESPACE,GV$TABLESPACE来源于基表 X$KCCTS 而DBA_TABLESPACES是来源于 SYS.TS$ TS 和 SYS.X$KCFISTSA。也就是说,V$TABLESPACE的信息来源于控制文件,而DBA_TABLESPACES的信息是来源于其他基表,手工删除基表信息时,其信息不和控制文件信息同步。 下面有具体看看: 看下创建动态性能视图的语句: 通过上面建库脚本也可以清晰的看到,得到授权的普通用户仍然只能访问V$开头的视图,而不能直接访问V_$开头的视图,因为实际上V$视图是V_$视图的公有同义词(PUBLIC SYNONYM)要想访问V_$必须带上SYS.V_$,例如 而查看普通的DBA_ ALL_ USER_ 等视图,可以查看数据字典 dba_views(这个视图从8i开始引入的) 例如: X$ 是 Oracle 数据库 的核心部分,这些表用于跟踪内部数据库信息,维护数据库的正常运行。 X$ 表是加密的(除了MOS和直接看源代码以外,我不知道还有什么方法可以查看X$视图) Oracle 通过 X$和一些基表(TS$, OBJ$, SEG$等)建立起其他大量视图,提供用户查询和管理数据库。 在9i以前 另外,还可以通过X$KQFTA来查看X$表的相关信息: 类似,就是11.2中新引入的X$表: … 继续阅读

发表在 FAQ, Internal | 标签为 , , , , | 留下评论

对于已经存在的exp导出文件或者expdp的导出文件,如何获取导出文件头的信息呢?

对于已经存在的exp导出文件或者expdp的导出文件,如何获取导出文件头的信息呢? 我们来测试下,我的expdp导出文件是: 方法1:利用dbms_datapump.get_dumpfile_info我们可以得到dump文件头的信息,具体脚本参考 抽取exp/expdp导出文件头的信息 方法2: 使用string来看: 方法3: impdp lunar/lunar DIRECTORY=lunar_dir DUMPFILE=lunartest.dmp NOLOGFILE=y SQLFILE=lunartest_impdp.sql TABLES=lunar_par_test TRACE=100300 这里TRACE=100300是生成data pump进程trace信息。其他trace信息还有很多,后面陆续会介绍其他的data pump的相关trace。 我们知道data pump进程启动的时候,会有两类进程,即:Datapump Master (DM) 和 Worker (DW) processes 他们生成的trace文件产生在BACKGROUND_DUMP_DEST目录里面,命名格式如下: — Master Process trace file: _dm_.trc — Worker Process trace file: _dw_.trc 我们具体看一下3个文件的内容: … 继续阅读

发表在 expdp/impdp, FAQ, Scripts | 标签为 , | 留下评论

如何查看你的环境是否是RAC环境? 如何判断你有哪些option?如何enable或者disable他们?

前几天一个老同事问我,客户不想买RAC 的license了,怎么办? 因为当时他们有其他机器安装新环境,因此,我当时就说,直接装一个单机库,把数据库迁移过去,cluster_database改成false,再清理掉thread,undo,redo就ok了。。。 今天忽然想起来,如果客户不买partition选项了,想关闭这个怎么办?或者客户没有新机器再装一个ORACLE_HOME了,怎么办? 后面的我们就研究下: 首先我们可以使用OUI或者opatch去看已经安装了哪些选项(当然,还可以看数据库视图) 方法1: 使用OUI去review ./runInstaller 里面有一个 “Installed Products”,这个是你已经安装的产品 方法2:使用OPATCH [oracle@lunar lib]$ opatch lsinventory -detail Invoking OPatch 11.2.0.1.7 Oracle Interim Patch Installer version 11.2.0.1.7 Copyright (c) 2011, Oracle Corporation. All rights reserved. Oracle Home : /u01/app/oracle/product/11.2.0.3/dbhome_1 Central … 继续阅读

发表在 FAQ, RAC | 标签为 , , | 留下评论

今天玩vm的收获-1,LVM管理真方便-2,ip地址改完了别忘了修改listener和local_listener

今天继续整合vm,遇到两个问题,一个是,空间和一两句话说不清楚的目录问题,一个是ip地址问题,都是小蚂蚁问题,记录一下,好玩,O(∩_∩)O哈哈~ 这个是空间问题: 你可以看到,我的这个有2个盘分别存放了grid软件和oracle软件,分别用了两个盘,分别挂载到两个目录: /u01 和 /u01/app/oracle 于是,我就想到应该扩展根目录,然后把tar文件放到根目录下,在解压,应该就自动合并到/u01/app/oracle了。 我的一个11.2.0.3的vm也是/u01/app/oracle目录。 我们都知道,使用root用户tar一个目录,解tar时,直接按照原有目录解压,但是今天测试了好几个参数,都不行 我怀疑就是因为不同的盘上有了相同的目录,比如/dev/sde1 挂载到了 /u01/app/oracle,跟不够大,我把tar过来的11.2.0.3.tar放到了新建的盘/dev/sdf1上 挂载到/other上,因此解压的时候,目录就变成/other/u01/app/oracle了 这样我的这套11.2的环境就有问题,需要修改一些东西,比较麻烦。。。 弄好后,测试下两个环境,一个oracle 12.1,一个是oracle 11.2.0.3 这里启动数据库,遇到另一个小问题: 找不到spfile,检查下,果然没有spfile和init: 弄个pfile出来看看,把这个“鸡肋”LOCAL_LISTENER注释掉试试看,然后果然可以了,没有报其他错误了,说明我的vm还是好的 (最近每天折腾vm,都是从活动硬盘上copy回来的,总是有各种妖怪问题): 我这个人养成了一种习惯,不找原因,先琢磨workround,但是回过头来,还是要看看怎么弄的 怀疑ip地址有问题,检查/etc/hosts,果然,这里的ip地址不对,从活动硬盘copy来的,里面ip沿用的以前的vm的配置: 检查tnsnames.ora,发现问题了: 这里 LISTENER_LUNARBB 使用的是机器名,而 oracle在启动的时候会根据local_listener参数的设置去找检查相应的主机名和端口号,我这里有两个错误: 1,主机名,很可能这里的HOST = lunar本身就有问题,因为我以前的老ip对应着现在的新ip的主机名,都是lunar 2,端口号写成了主机名(这个错误很奇怪,这东西按说都是自动生成的。。。。。。) 今天还学习了一个,使用LVM管理,很方便的扩展一个目录,今天是扩展的根目录,感谢bbq同学O(∩_∩)O哈哈~ 逻辑卷真方便,这里顺便记录一下: 假设你新加的硬盘是sdf 在vm上新建一个盘,使用fdisk -l找出这个盘,比如我这里是 /dev/sdf(比如,大小30g),然后创建pv: pvcreate /dev/sdf … 继续阅读

发表在 FAQ | 留下评论

不同版本客户端连接服务器的问题

可以看到,从10.2开始,还支持连接oracle 817的数据库,但是已经不支持连接到oracle 816的数据库了,查了下文档,内容如下: 今天连接时遇到 TNS-12560: TNS:protocol adapter error,顺便说一下,这个问题比较常见,常见原因有几种: 1,防火墙设置问题,关闭防火墙(service iptables stop) 2,修改了/etc/hosts的ip地址后,需要重启listener 3,listener.log过大(新版本中这个问题好多了) 4,10g中有一个注明的bug,listener会启动一个子监听造成listener hang 5,tnsnames.ora中配置的ip地址等不对 。。。。。。。。。。。。。。。

发表在 FAQ | 留下评论