9i升级中的orapls9.dll
今天接到朋友电话,关于从9.2.0.1升级到9.2.0.8出现的问题,在windows平台,报的错误如下:写入文件'D:oracleora92BINorapls9.dll'时出错,[D:oracleora92BINorapls9.dll(另一个程序正在使用此文件,进程无法访问.)][@more@]从错误上来看,这个文件orapls9.dll肯定是被其它的进程调用了。到得所有的服务都关闭的确认之后,有点迷惑了,会是哪个进程还在使用? 我的思路是这样,把相应的进程杀了,就可以继续升级.找进程可以用命令:tasklist /m orapls9.dll杀进程可以用命令:orakill或者taskkill后来朋友反馈说,杀了线程,接着又有线程调
ORA-600 [kpotcgah-9]
环境:DB: 10.2.0.4OS: SunOS HOSTNAME 5.10 Generic_120011-14 sun4u sparc SUNW,Sun-Fire-V490碰到这个错误的情形:用expdp导一张表,除了参数directory,dumpfile,logfile,tables之外,加上了parallel=4参数,得到的具体错误如下:[@more@]Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSORA-31693: Table data object "BASELDWH"."AUX_FACT_EREC_DETL" failed to load/unload and is being skipped due to error:ORA-29913: error in executing ODCIEXTTABLEOPEN calloutORA-00600:
ORA-00600 [kqludp2]
环境: OS Solaris 10. DB version: 9.2.0.8一直跑得好好的程序,开发人员报执行SP有错误:ORA-04068: existing state of package has been discardedORA-04063: package body "..." has errorsORA-06508: PL/SQL: could not fine program unit being calledORA-06512: at line 1[@more@]最近也没对数据做什么变动,怎么会报包无效。 查下DBA_OBJECTS,发出这个包目前的状态是INVALID,执行utl_recomp.recomp_serial()重新编译一下,再看一下DBA_OBJECTS里的status,竟然还是invalid!查看一下DBA_ERRORS,得到这样的错误信息:350 P
CLOB的一个问题
今天一开发员提交了这样的问题,他的代码执行时,碰到如下的错误:...32767:3276732768:32768declare*ERROR at line 1:ORA-06502: PL/SQL: numeric or value errorORA-06512: at line 9SQL> l1 declare2 v_doc CLOB;3 c char(1);4 i NUMBER;5 begin6 i := 0;7 c :='1';8 for i in 1..100000 loop9 v_doc := v_doc || '' || 1;10 dbms_output.put_line('' || i || ':' || dbms_lob.getlength(v_doc));11 end loop;12* end;SQL>从上面的执行结果来看,错误执行到32769轮回时出错,出错的时候,CLOB的长度32768.CLOB不可能只存储这么点
DB2查找阻塞的session
下面是一个测试:session 1:db2 +c --登陆数据库,这里要加上选项+c,也就是不会做隐式提交事务。否则每执行一条SQL就提交了。db2 => create table test00(a int, b varchar(10));DB20000I The SQL command completed successfully.db2 => commit;DB20000I The SQL command completed successfully.db2 => insert into test00 values(1,'AA');DB20000I The SQL command completed successfully.接着session 2执行:db2 => select * from test00;这时,这个session是hang在那里的。这点与oracle不同的,oracle不阻塞读的,但
9.2.0.8上打最新的CPU碰到的问题
公司规定的每年至少要打一次CPU(Critical Patch Update)补丁,而Oracle则每个季度更新一次CPU。现在数据库基本都跑在10G上了,对了9i的数据库来说,算是古董了。之前10G上打CPU,也不存在什么大的问题,但这次在Solaris 10/AIX都碰到了问题。[@more@]在Solaris 10打补丁的时,前期准备(关数据库,listener,修改oraInst.loc)之后,然后opatch apply ,跳过Y|N之后,备分文件,编译之后,貌似一切都顺利了,但到了verifying patch...,就没任何进展了,半小时过后,没任何屏幕输出,后来,问一下同事,同事说是java版本的问题,版本要1.4以上。
Logmnr分析SQL长度大于8000的潜在问题.
问题的起因是被同事问起当SQL_UNDO长度大于4000是怎么组装SQL。我们都知道通过LOGMINER可以找出相应的REDO SQL和UNDO SQL,经过DBMS_LOGMNR分析后,相应的REDO SQL和UNDO SQL存在视图V$LOGMNR_CONTENTS,从这张视图的结构里可以看出,字段sql_redo,sql_undo的类型为varchar2(4000),从这里可以看出v$logmnr_contents里的一行记录里,存储的SQL长度至多为4000,但有时SQL的长度超过4000怎么办?[@more@]从reference文档里可以看到这张视图还有几个字段:RS_ID,SSN,CSF.他们的作用是:RS_ID: Record set ID. The tuple (RS_ID, SSN) together u
DB2 DDL不是一个自冶事务
在Oracle里一个DDL操作是一个原子操作,当执行一个DDL命令时,之前的所有操作都会commit,永久生效,而DB2不是这样的,DB2的DDL不是一个自冶原子事务,下面的测试:Linux 1: db2 connect to cmdbDatabase Connection InformationDatabase server = DB2/LINUXX8664 9.5.2SQL authorization ID = User001Local database alias = testdbLinux 2: db2 +c " create table test00(a int)"DB20000I The SQL command completed successfully.Linux 3: db2 +c "insert into test00 values(1),(2)"DB20000I The SQL command comple
创建spfile时碰到600
创建spfile时碰到600, 今天碰到的情况,在Solaris 10上,先把软件升级到10.2.0.4,然后手工建库,手工写pfile(只写了几个参数),前面一切进展顺得,当准备建spfile替换当前的pfile时,碰到如下的错误:SQL> create spfile from pfile='path/pfile.ora'; create spfile from pfile='path/pfile.ora' * ERROR at line 1: ORA-00600: internal error code, arguments: [kspsetpao1], [180], [160], [*], [db_name], [9], [], [] 从上面的错误上,可看到一个参数db_name,第一反映是,难道是参数db_name有问题,从v$database确认的数据名跟
总结上次碰到的ORA-04030错误
先更正一下,上次碰到的SQL,不是in里有9500多个值,是开发人员把9500多个值拆成了10个in,然后用or连接起来,太长了,没仔细看。所以不会报ORA-01795。通常情况下4030错误,是由于PGA内存分配出现了问题,那么具体是PGA的哪一块出了问题呢?这就得理清楚PGA有些component,有四块组成:1, User Session Memory,存储session涉及到的一些变量,及session相关的信息,比如登录信息。如果在MTS模式下,这块内存是共用的。2,Private SQL Areas,存储邦定变量相关信息以及跑SQL时用到的一些临时内存,数据结构。根据执行SQL(cursor)的生命周期,一
ORA-04030
环境 OS AIX 5.3DB Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi今天一开发人员提交一个错误过来,情形是这样:在Oracle SQL developer里跑一条SQL报的:SQL Error: ORA-04030: out of process memory when trying to allocate 2992 bytes (kxs-heap-c,temporary memory)04030. 00000 - "out of process memory when trying to allocate %s bytes (%s,%s)"*Cause: Operating system process private memory has been exhausted看到Ora-04030,难道是PGA不足?难道是sort,hash等操作过多?叫开发人员发那条S
Perl画图
从目标所掌握的资料来看,perl调用GD作图还是比较方便的,下面贴一下代码作图的一段代码。use GD::Graph::lines;my ($title,$legend1,$legend2);my (@text,@y1,@y2);sub drawimage{ my @data = (@text,@y1,@y2 ); my $graph = new GD::Graph::lines(1200, 400); $graph->set( two_axes => 1, zero_axis => 1, title => $title, transparent => 0, x_label_skip => 2, x_labels_vertical =>1,
Expdp指定导出带有匹配符的对象
在SQL中,字符'_'和'%'是有特定含意的:‘_’匹配任何一个字符,'%'则匹配任何数量的字符,包括0个字符。如果要在SQL中,要让这两个字符表示字符本身,则要做相应的处理,加有escape关键字,如:SQL> select table_name from user_tables where table_name like 'A_%' escape '';TABLE_NAME------------------------------A_A_1A_2在expdp时,如果也期望导出如上的表,即导出经字符A_开头的表,在expdp里的include里是不能识别escape,这样的话,就会导出多余的表出来的:执行命令:expdp directory=expdp_dir dumpfile=test.dump INCLUD
EXP-00090: cannot pin type "SCHEMA"."TYPE_NAME"
EXP-00056: ORACLE error 22303 encounteredEXP-00090: cannot pin type "UserName"."KU$_CLUSTER_T"环境: OS Solaris 10, DB 10.2.0.4数据库升级之后(从10.2.0.3到10.2.0.4),这个升级也不知是谁做的,不知期间是怎么做升级。也太不负责了,一升级就整出了这么多无效的对象,也不查一下原因.目前的问题是:exp导数据,日志里出现大量exp-90错误, 登陆数据库查了一下,发现无效的对象比较多,都是KU$_开头的,这些KU$_都是type类型。不知道这些type是干什么的,从查到的资料来看,XDB数据库会到,对XDB不太了解。查看
Eclipse里写perl程序。
eclipse写perl代码,要安装相应的插件EPIC,具体的操作是:从eclipse里的主菜单:[help]=>[install new software...]=>[add],输入http://e-p-i-c.sf.net/updates/testing(这个可以到e-p-i-c网站上查看最新的插件),保存,接着在当前界面选中刚才的地址,然后选择install,这样插件就安装完了。还要设置perl相应的执行路经。[windows]=>[Preferences]=>选中左边的Perl EPIC,在相应的右边输入perl.exe的全路径。至此就可以用eclipse写perl程序了。顺便说一下,写perl的图形工具很多,但貌似免费的不多,之前好不容易从网上down
Datapump的几个参数
Datapump有些参数并没有公开,但是在实际情况下,这些参数还是比较有用处的,在此总结几个参数.[@more@]1.metrics=y 这个是隐藏参数。功能是显示导出来多少个对象,这些对象花了多少时间,这些对象主要指的是定义(导入时,建index花了多少时间,有参考价值),不显示导表数据时间。如果能够把导每张表花了多少时间显示出来,还是很有参考价值的.可能以后的版本会做到这点,这也可能为什么这个是隐藏参数的原因.下面是加了此参数,显示的信息:Processing object type SCHEMA_EXPORT/USER Completed 1 USER objects in 0 secondsProcess
设置OS用户跑schedule job执行外部程序
一直不清楚Oracle Schedule是通过哪个OS用户去执行外面的程序,metalink 391820.1提到了,在这里做个记录。以备后查。相应程序执行的用户定义在externaljob.ora里,默认情况下是nobody用户,其OS权限是相当低的。可以修改这个文件,指定相应的用户跑外部程序。同时要把这个文件的属主改成root,设置权限为640. 还有$ORACLE_HOME/extjob权限设置为4750.$ tail -2 $ORACLE_HOME/rdbms/admin/externaljob.orarun_user = nobodyrun_group = nobody[@more@]
ORA-28031: maximum of 148 enabled roles exceeded
在alert_<SID>.log里报如下错误:ORA-12012: error on auto execute of job 2ORA-28031: maximum of 148 enabled roles exceeded[@more@]今天一同事提到ORA-28031错误,错误信息明显的提示了授予用户role的数量超过148个导致的。这些role的数量,包括直接授予的,也包括间接授予的。当一个用户被直接和间接授予的role超过148个时,导致的直接问题是用户不能登录数据库,布置的后台job也不能执行。有一个例外就是sys可以拥有超过148个role,它可以正常的登录数据库,但后台sys的JOB不能正常的跑。同时要注意,创建role的用户,隐含的被
DBMS_DDL加密脚本.
在10G版本, 有一个新的package DBMS_DDL,它提供脚本加密的功能。同时10G也增强了字符窜的处理方式,通常情况在字符窜里有单引号的话,要用两个单引号才能在字符窜里显示一个单引号,10G有了新的方法处理这一情形了。下面的示例结合dbms_ddl显示这个功能,感觉跟perl里的q//一样(perl里也可以q[])下面是测试示例:[@more@]SQL>declare 2 fun varchar2(200); 3 begin 4 fun:=q'[create or replace function f_test1 return date 5 is 6 begin 7 return sysdate-1; 8 end; 9 ]'; 10 dbms_ddl.create_wrapped(fun); 11
通过写规则,控制streams复制.
下面的代码是通来写代码实现RULE,然后应用到streams,这个例子比较简单,做复杂的业务转换,可通过类似示例中的function rename_schema_01来实现.Declarative Rule-Based transformation Streams能实现的功能,自己写规则都可以实现,更复杂的功能,可以通来PL/SQL来实现,然后包装成规则.[@more@]SQL> alter database add supplemental log data;Database altered.SQL> select log_mode SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI,SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DAT A_ALL from v$data