2008年9月27日星期六

进程过多错误

今天开发环境数据库alert log中老是报这个错误
kkjcre1p: unable to spawn jobq slave process

最后不得不重启数据库解决, 经查是我们这边一个测试程序开了太多连接没有关闭,从而导致DB需要启用太多服务器进程来处理, 而达到processes参数上限, 最后其他用户不能连入,甚至sysdba都不能连入。

最后手动kill掉一个操作系统进程, 然后sysdba登入重启。

2008年9月26日星期五

archive log文件名称

%s: Includes the log sequence number as part of the file name•
%t: Includes the thread number as part of the file name•
%r: Includes resetlogs ID to ensure that the archive log file name remains unique, evenafter certain advanced recovery techniques that reset log sequence numbers•
%d: Includes the database ID as part of the file name
The format must include %s, %t, and %r. The use of %d is optional, but it must be included ifmultiple databases share the same archive log destination.

2008年9月25日星期四

oracle constraint control

Validate确保已有数据符合约束;

Novalidate不必考虑已有数据是否符合约束。除非Novalidate被指定,Enable默认Validate;除非Validate被指定,Disable默认Novalidate;

Validate和Novalidate对Enable和Disable没有任何默认暗示。

Enable Validate与Enable相同,检查已有记录和新增记录,确保都符合约束;Enable Novalidate 允许已有记录不必满足约束条件,但新增/修改的记录必须满足;Disable Validate禁用约束,删除约束上的索引,不允许修改任何被约束的记录;Disable Novalidate与Disable相同,禁用约束,删除约束上的索引,且允许修改被约束的记录。

2008年9月24日星期三

SQLPLUS autotrace option

SET AUTOTRACE ON 同时输出执行结果以及统计信息和执行计划信息。
SET AUTOTRACE OFF 关闭执行计划和统计信息报表
SET AUTOTRACE ON EXPLAIN 只打开执行计划报销,显示命令结果,不显示统计信息。
SET AUTOTRACE ON STATISTICS 只打开统计信息报销,显示命令结果,不显示执行计划。SET AUTOTRACE TRACEONLY 如果是这种形态的话不显示命令的执行结果,同时显示执行计划和统计信息,但是在traceonly的后面仍然可以追加explain或者statistics,等同于set autotrace on [explainstatistics]但是不显示执行结果

2008年9月10日星期三

Export出现ORA-06550错误

这几天有一个环境用EXP导出schema备份老是不成功, 报以下错误:
EXP-00056: ORACLE error 6550 encountered
ORA-06550: line 1, column 26:
PLS-00201: identifier 'XDB.DBMS_XDBUTIL_INT' must be declared
ORA-06550: line 1, column 14:
EXP-00056: ORACLE error 6550 encountered
ORA-06550: line 1, column 26:
PLS-00201: identifier 'XDB.DBMS_XDBUTIL_INT' must be declared
ORA-06550: line 1, column 14:
EXP-00000: Export terminated unsuccessfully

可是我在相应schema中做全文查询, 却怎么也找不到含有'XDB.DBMS_XDBUTIL_INT'的代码,
然后在metalink上看到这个问题, 才知道原来是个common的问题.

metalink(243133.1)上提供了3个solution:
1. XDB这个schema是提供给XML用的, 如果当前数据库没有使用, 就可以考虑干掉
2. 怀疑是打patch set没有成功导致, 可以将为进行的步骤继续进行完成
3. 可能只是XDB.DBMS_XDBUTIL_INT这个package损坏了, 考虑直接重建这个package.

我最终check下来, 我们的现象应该是前任DBA打9.2.0.6patch set没有成功.
尽管也可以考虑采取第一个solution, 但是老感觉不够sense, 于是用了第二种.

我的系统是win2003, DB原来是9.2.0.1, 单环境运行(非RAC, 也没有部署DG)后来打patch到9.2.0.6, 但是打patch的时候,
只运行了patch的setup程序, 而没有运行postinstall的脚本.

最终解决步骤:
1. 关闭数据库, 关闭ORACLE相关服务
2. 冷备整个数据库
3. 继续运行patchset setup程序, 查看是否有未升级组件, 如果有则升级
3. 启动数据库, 确认SYSTEM表空间还有至少10M的剩余空间, 将SHARED_POOL_SIZE, JAVA_POOL_SIZE两个参数都调整到150M
4. 关闭数据库, 以migrate方式启动数据库
5. 以sys登录, 运行catpatch.sql, 并确保运行结果没有错误
6. 重启数据库, 以sys登录, 运行utlrp.sql

在oracle中获取文件修改时间

在oracle中获取文件修改时间:
1. 在oracle中新建一个java source

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED XX_FILE_VIEWER
AS import java.io.File;
import java.util.Date;
import java.text.SimpleDateFormat;
public class xx_file_viewer{
  static File myfile;
  static Date modifieddate;
 
  public xx_file_viewer(String path){
          myfile = new File(path);
  }       
        
  public static String get_modified_time(String path){
          myfile = new File(path);
          modifieddate = new Date(myfile.lastModified());
         
          return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(modifieddate);
  }
}

这个java source主要是调用java.io.File类的lastModified方法, 来获取文件的修改时间

然后在package或procedure(function)中调用该java方法
FUNCTION get_file_last_modified (p_file IN VARCHAR2)
      RETURN VARCHAR2
   AS
      LANGUAGE JAVA
      NAME 'xx_file_viewer.get_modified_time(java.lang.String) return java.lang.String';

RMAN-06059错误

最近有个site的RMAN备份几次都没有成功, 查看log发现都是类似如下的错误:
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of backup command at 07/09/2008 18:00:02
RMAN-06059: expected archived log not found, lost of archived log compromises recoverability
ORA-19625: error identifying file /disk/his/2008_01_13_337_6895879.dbf
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory

应该是由于误删了归档日志, 而导致全备份不能成功.
可以在RMAN下执行以下语句:
change archivelog all crosscheck;

HP Unix目录映射

windows与HP-UX之间文件共享
1. 在HIS机器上共享e:\export, 并将其权限赋予dba_check
2. 在HP-UX上启动cifsclient(cifsclient start), 建立目录映射
mount -F cifs HIS:\EXPORT /disk/dba/his/export
su - hisdb -c "cifslogin HIS dba_check -P aps123"

HP-UX与HP-UX之间文件共享
1. 在HIS01上建立共享
 1) 编辑/etc/exports, 添加/disk/dba/exp_rman/exp_rman -ro
 2) exportfs /disk/dba/exp_rman/exp_rman
2. 在HIS02上建立目录映射
 mount HIS01:/disk/dba/exp_rman/exp_rman /disk/dba/his01/exp_rman

Export出现ORA-00600[KSMASG1]

Export过程中出现
EXP-00008: ORACLE error 600 encountered
ORA-00600: internal error code, arguments: [KSMASG1], [4032], [4032], [], [], [], [], []
EXP-00000: Export terminated unsuccessfully
错误

该错误可参见metalink: Note:279529.1
https://metalink.oracle.com/metalink/plsql/f?p=130:14:10576192347353071824::::p14_database_id,p14_docid,p14_show_header,p14_show_help,p14_black_frame,p14_font:NOT,279529.1,1,1,1,helvetica

solution:
ALTER SYSTEM SET java_pool_size=100M SCOPE = SPFILE;
SHUTDOWN immediate
STARTUP

我的数据库版本是9.2.0.6, 是在Export某一个schema数据的时候出现的以上错误.