oracle的版本为:10gr2,10.2.0.1.0。
利用oracle中的hsodbc连接sqlserver2005数据库。已成功连接。db link的名字为: sql2005fororacle。
执行:select count(*) from sysdatabases@sql2005fororacle; 能够成功执行。
但是,在执行: select count(*) from sysobjects@sql2005fororacle;却导致系统出现了死机症状,无法响应任务的操作,任务管理器看到cpu利用率不高。无奈,只能强制关机。
在alert_<SID>.log文件中发现有这么几句:
Memory Notification: Library Cache Object loaded into SGA
Heap size 2225K exceeds notification threshold (2048K)
KGL object name :XDB.XDbD/PLZ01TcHgNAgAIIegtw==
原来遇到oracle的bug了。上网检索,说 是oracle的一个bug在10g10.2.0.1的各个平台上都出现过。 Oracle10g中,在load较大的对象进library cache中时,会记录以上警告。在版本10.2.0.1中,这个定义大对象的阈值是2M,这是有隐含参数_kgl_large_heap_warning_threshold 指定的从10.2.0.2起,这个参数的默认值被修改为50M。
解决方法1 :升级到10.2.0.2或者以上。
解决方法2 :
SQL> alter system set "_kgl_large_heap_warning_threshold"=20388608 scope=spfile ;
SQL> shutdown immediate
SQL> startup
或者将 2038860调成更大的值。
我是通过调整隐式参数的方式解决的,重启后。下面就是在oracle中访问sqlserver2005数据库的数据的效果:
SQL> select "name" from sysobjects@sql2005fororacle where "type"='U'; name -------------------------------------------------------------------------------- spt_fallback_db spt_fallback_dev spt_fallback_usg QuestSoftwareProc pbcattbl pbcatcol pbcatfmt pbcatvld pbcatedt spt_monitor spt_values name -------------------------------------------------------------------------------- MSreplication_options 已选择12行。 SQL> desc sysusers@sql2005fororacle 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- uid NUMBER(5) status NUMBER(5) name NOT NULL VARCHAR2(128 CHAR) sid RAW(85) roles RAW(2000) createdate NOT NULL DATE updatedate NOT NULL DATE altuid NUMBER(5) password RAW(256) gid NUMBER(5) environ VARCHAR2(32512 CHAR) hasdbaccess NUMBER(10) islogin NUMBER(10) isntname NUMBER(10) isntgroup NUMBER(10) isntuser NUMBER(10) issqluser NUMBER(10) isaliased NUMBER(10) issqlrole NUMBER(10) isapprole NUMBER(10) SQL>