2008年12月31日星期三

再--见oracle bug

oracle的bug果然是无休无止, 今天有幸再次碰到了一个:4519934
Doc ID: 4519934.8
现象是alert log中出现如下的错误信息:
*** ACTION NAME:(AUTO_SPACE_ADVISOR_JOB) 2008-12-30 22:00:12.402
*** MODULE NAME:(DBMS_SCHEDULER) 2008-12-30 22:00:12.402
*** SERVICE NAME:(SYS$USERS) 2008-12-30 22:00:12.402
*** SESSION ID:(116.3582) 2008-12-30 22:00:12.402
*** 2008-12-30 22:00:12.402
ORA-12012: 自动执行作业 39537 出错
ORA-44003: SQL 名称无效

2008年12月30日星期二

Oracle中常用的to_Char用法详解

The following are number examples for the to_char function.
to_char(1210.73, '9999.9') would return '1210.7'
to_char(1210.73, '9,999.99') would return '1,210.73'
to_char(1210.73, '$9,999.00') would return '$1,210.73'
to_char(21, '000099') would return '000021'

The following is a list of valid parameters when the to_char function is used to convert a date to a string. These parameters can be used in many combinations.

Parameter Explanation
YEAR Year, spelled out
YYYY 4-digit year
YYY
YY
Y
Last 3, 2, or 1 digit(s) of year.
IYY
IY
I
Last 3, 2, or 1 digit(s) of ISO year.
IYYY 4-digit year based on the ISO standard
Q Quarter of year (1, 2, 3, 4; JAN-MAR = 1).
MM Month (01-12; JAN = 01).
MON Abbreviated name of month.
MONTH Name of month, padded with blanks to length of 9 characters.
RM Roman numeral month (I-XII; JAN = I).
WW Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year.
W Week of month (1-5) where week 1 starts on the first day of the month and ends on the seventh.
IW Week of year (1-52 or 1-53) based on the ISO standard.
D Day of week (1-7).
DAY Name of day.
DD Day of month (1-31).
DDD Day of year (1-366).
DY Abbreviated name of day.
J Julian day; the number of days since January 1, 4712 BC.
HH Hour of day (1-12).
HH12 Hour of day (1-12).
HH24 Hour of day (0-23).
MI Minute (0-59).
SS Second (0-59).
SSSSS Seconds past midnight (0-86399).
FF Fractional seconds.


The following are date examples for the to_char function.

to_char(sysdate, 'yyyy/mm/dd'); would return '2003/07/09'
to_char(sysdate, 'Month DD, YYYY'); would return 'July 09, 2003'
to_char(sysdate, 'FMMonth DD, YYYY'); would return 'July 9, 2003'
to_char(sysdate, 'MON DDth, YYYY'); would return 'JUL 09TH, 2003'
to_char(sysdate, 'FMMON DDth, YYYY'); would return 'JUL 9TH, 2003'
to_char(sysdate, 'FMMon ddth, YYYY'); would return 'Jul 9th, 2003'


You will notice that in some examples, the format_mask parameter begins with "FM". This means that zeros and blanks are suppressed. This can be seen in the examples below.

to_char(sysdate, 'FMMonth DD, YYYY'); would return 'July 9, 2003'
to_char(sysdate, 'FMMON DDth, YYYY'); would return 'JUL 9TH, 2003'
to_char(sysdate, 'FMMon ddth, YYYY'); would return 'Jul 9th, 2003'

The zeros have been suppressed so that the day component shows as "9" as opposed to "09".

2008年12月25日星期四

Rman的format格式中的%

%c 备份片的拷贝数
%d 数据库名称
%D 位于该月中的第几天 (DD)
%M 位于该年中的第几月 (MM)
%F 一个基于DBID唯一的名称,这个格式的形式为c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII为该数据库的DBID,YYYYMMDD为
日期,QQ是一个1-256的序列
%n 数据库名称,向右填补到最大八个字符
%u 一个八个字符的名称代表备份集与创建时间
%p 该备份集中的备份片号,从1开始到创建的文件数
%U 一个唯一的文件名,代表%u_%p_%c
%s 备份集的号
%t 备份集时间戳
%T 年月日格式(YYYYMMDD)

2008年12月22日星期一

Standby export出现ORA-00600

进来在重新整改公司DB的备份容灾方案,有一个DB跑在HP UNIX上,
并且在另外一台HP UNIX上做了standby, 但是因为两台server采用的是
共享存储,不能用来做容灾,于是希望能将其在公司现有的其它windows server上
做一个镜像,定期import production资料, 做容灾用. 因为担心export会对线上产生影响,
且在hot状态export也会影响export出文件的数据一致性,之前就经常出现sequence不一致的情况.
于是采用了从standby export.
JOB很快写好,但是运行的时候老是出现问题, 其中一个schema的数据在export的时候老是出现错误:
EXP-00008: 遇到 ORACLE 错误 600
而查看standby alert log:
-----------------
Errors in file /disk/oracle/admin/HX/udump/hishx_ora_5435.trc:
ORA-07445: exception encountered: core dump [joxuinlocal_internal()+1652] [SIGSEGV] [unknown code] [0x1000000000C] [] []
-----------------
且出现很多这样的错误消息:
-----------------
ksvcreate: Process(m000) creation failed
-----------------

查看对应的trc文件:
-----------------
ksedmp: internal or fatal error
ORA-07445: exception encountered: core dump [joxuinlocal_internal()+1652] [SIGSEGV] [unknown code] [0x1000000000C] [] []
Current SQL statement for this session:
SELECT SYNNAM, DBMS_JAVA.LONGNAME(SYNNAM), DBMS_JAVA.LONGNAME(SYNTAB), TABOWN, TABNODE, PUBLIC$, SYNOWN, SYNOWNID, TABOWNID, SYNOBJNO FROM SYS.EXU9SYN WHERE SYNOWNID = :1 ORDER BY SYNTIME
----- Call Stack Trace -----
calling call entry argument values in hex
location type point (? means dubious value)
-------------------- -------- -------------------- ----------------------------

多方寻找解决方案,最后在metalink上证实这是oracle的一个bug, 在standby数据库多次open read only后,会出现这样的现象:
Bug 5583049

不得以, 我只能改写job, 将其每次export改为重启以后再export, 而不是直接在
recover managed standby database disconnect from session

open read only
之间切换.

2008年12月4日星期四

通过RMAN备份克隆9i数据库

今天要将一个已经升级到10g的数据库克隆一个升级前的版本到另外一个server做一些测试, 因为升级, 剩下的只有一个升级前的RMAN全备份以及全备份后的一个自动备份(controlfile+spfile).
首先将备份拷贝到目标server, 因为我需要恢复到不同路径, 9i的RMAN据我所知是没有这个功能的, 好在我的目标server上还装有10g.
1.创建一个新的windows服务 ORADIM -NEW -SID HIS
2. 将oracle home注册表下新建一个ORACLE_SID的键, 并修改为HIS
3. 将默认的init.ora稍作修改,copy一份为initHIS.ora
4. rman target /登录
5. startup nomount
6. restore spfile from '***********"
7. create pfile from spfile, shutdown database
8. 创建相关路径,修改pfile中的路径(主要是dump file路径, controlfile路径)
9. 使用新的pfile启动到mount状态
10. crosscheck backup, delete expired backup
11. catalog start with '***********'
12. run {
set newname for datafile 1 to '***********';
......................
......................
......................
restore database;
switch datafile all;
}
13. recover database;
14. alter database rename file '******.redo01.dbf' to '*********.redo01.log';
15. alter database rename file '******.redo01.dbf' to '*********.redo02.log';
16. alter database rename file '******.redo01.dbf' to '*********.redo03.log';
17. alter database open resetlogs;
18. alter tablespace temp add datafile '**********.temp01.dbf' size 100M;

"sqlplus / as sysdba"登录ORACLE

平时, 我们经常会使用SQLPLUS / AS SYSDBA登录数据库, 但在有些环境下, 会发现不能正常登录,报出各种错误.
其实要成功使用操作系统认证, 需要有以下条件:
1. 要让oracle知道登录哪个数据库, 在LINUX/UNIX环境下, 必须设置环境变量ORACLE_SID, 而在windows下, 则必须设置ORACLE_HOME下的注册表项ORACLE_SID
2. 在windows下面需要使用oradim -new -sid **** 创建一个oracle服务
3. 对应ORACLE_HOME的sqlnet.ora需要添加参数设置:
SQLNET.AUTHENTICATION_SERVICES = (NTS)
4. 相应用户必须在ORA_DBA组中

2008年12月2日星期二

数据库升级后莫名崩溃

星期六晚上成功将一个生产环境数据库从9.2.0.6升级到10.2.0.1.
操作系统为windows 2003 enterprise edition sp1.
今天早上就出现数据库连接不上的状况, 登到server一看, listener挂掉, 起不来, 也不能以DBA登录到db, 报tns无监听程序,协议适配器错误.
查看sqlnet.log:
***********************************************************************
Fatal NI connect error 12505, connecting to: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=HIS01)(PORT=1521))(CONNECT_DATA=(SID=HIS)(CID=(PROGRAM=D:\oracle\product\10.2.0\HIS\bin\emagent.exe)(HOST=HIS)(USER=SYSTEM))))

VERSION INFORMATION:
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
Windows NT TCP/IP NT Protocol Adapter for 32-bit Windows: Version 10.2.0.1.0 - Production
Time: 01-12月-2008 11:38:42
Tracing not turned on.
Tns error struct:
ns main err code: 12564
TNS-12564: TNS: 拒绝连接
ns secondary err code: 0
nt main err code: 0
nt secondary err code: 0
nt OS err code: 0
***********************************************************************

查看db alert log:
Mon Dec 01 11:36:55 2008
Errors in file d:\oracle\admin\his\udump\his_ora_3868.trc:
ORA-07445: exception encountered: core dump [] [] [] [] [] []
ORA-07445: exception encountered: core dump [] [] [] [] [] []
ORA-07445: exception encountered: core dump [] [] [] [] [] []
ORA-07445: exception encountered: core dump [] [] [] [] [] []
ORA-07445: exception encountered: core dump [] [] [] [] [] []
ORA-07445: exception encountered: core dump [] [] [] [] [] []
ORA-07445: exception encountered: core dump [] [] [] [] [] []
ORA-07445: exception encountered: core dump [] [] [] [] [] []
ORA-07445: exception encountered: core dump [] [] [] [] [] []
ORA-07445: exception encountered: core dump [] [] [] [] [] []
ORA-07445: exception encountered: core dump [] [] [] [] [] []
ORA-07445: exception encountered: core dump [] [] [] [] [] []
ORA-07445: exception encountered: core dump [ACCESS_VIOLATION] [unable_to_trans_pc] [PC:0x7C8224B2] [ADDR:0x2D484D4E] [UNABLE_TO_READ] []
ORA-07445: exception encountered: core dump [ACCESS_VIOLATION] [unable_to_trans_pc] [PC:0x7C8224B2] [ADDR:0x2D484D4E] [UNABLE_TO_READ] []

查看对应trace文件:
ORA-07445: exception encountered: core dump [ACCESS_VIOLATION] [unable_to_trans_pc] [PC:0x7C8224B2] [ADDR:0x2D484D4E] [UNABLE_TO_READ] []
OR
Current SQL information unavailable - no session.
----- Call Stack Trace -----
calling call entry argument values in hex
location type point (? means dubious value)
-------------------- -------- -------------------- ----------------------------

重启server以后,数据库以及listener均正常工作, 但过一段时间,大概是30分钟左右, 问题依旧.

为了production环境AP能够正常使用, 只能再次重启, 并且等待下一次crash.

最终查到Metalink Note:405904.1, note中描述状况与我们遇到的基本一致.

Solution:
修改SQLNET.ORA, 添加:
SQLNET.INBOUND_CONNECT_TIMEOUT = 0
修改LISTENER.ORA, 添加:
INBOUND_CONNECT_TIMEOUT_LISTENER = 0

另, 发现该instance PGA设的很小:24M, 改为128M.
再次重启server之后, 恢复正常.

但是这次正常也只不过持续了4个小时, 又挂掉了, 问题依旧.

于是开始怀疑是内存问题, 因为将PGA修改之后, 能够持续得更长时间.
到晚上,对比该环境与另外一生产环境(同样也是跑在10g上)的pfile, 终于发现了问题所在.

虽然我们升级了DB, 但是相关parameter依旧采用9i的模式, 例如SGA为采用自动管理(未设定sga_target), 而是手动设定了里面相关模块的固定大小.
pga也存在同样问题.
不光如此, sga中设置的个内存模块大小比例也感觉很不恰当, 且还有一些其它的奇怪设定.
对照修改pfile之后, 第二天上班, 一切正常.

看来升级数据库的时候还是有不少陷阱的, 一定要注意参数的修改.

2008年11月20日星期四

数据库环境克隆

操作系统环境为
HP-UX BHGHIS01 B.11.11 U 9000/800 883605913 unlimited-user license
数据库环境为
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit

Production环境:
alter database begin backup;
host cp *.dbf ./back
host cp *.ctl ./back
host cp *.log ./back
alter database end backup;
这里主要是克隆数据文件,控制文件,以及重做日志.
另外,copy SPFILE文件以及密码文件.

将以上文件拷贝到克隆环境的对应目录下, 注意要先建好相应目录, 并设置好owner.
然后在新环境中:
startup mount;
alter database open resetlogs;

以上步骤也可以用来建立production环境的standby:
拷贝相关文件后
startup mount;
同步更新:
copy production的归档日志到克隆环境相应路径
recover database using backup controlfile until cancel;
然后应用相应归档
最后如果需要切换, 同样先应用完所有归档, 然后应用在线归档,最后
alter database resetlogs;
则standy环境与production环境数据已经完全同步了.

以上克隆仅针对production环境与clone环境路径完全一样, 如果不一样, 则需要使用PFILE文件,修改PFILE文件路径, 还需要手动重建控制文件.

2008年11月4日星期二

Oracle sessions,processes参数

ORACLE的连接数(sessions)与其参数文件中的进程数(process)有关,它们的关系如下:

sessions=(1.1*process+5)

但是我们增加process数时,往往数据库不能启动了。这因为我们还漏调了一个unix系统参数:它是/etc/proc/kernel 中semmns,这是unix系统的信号量参数。每个process会占用一个信号量。semmns调整后,需要重新启动unix操作系统,参数才能生 效。不过它的大小会受制于硬件的内存或ORACLE SGA。范围可从200——2000不等。

semmns的计算公式为: SEMMNS>processes+instance_processes+system

processes=数据库参数processes的值 instance_processes=5(smon,pmon,dbwr,lgwr,arch)

system=系统所占用信号量。系统所占用信号量可用下列命令查出:
#ipcs -s
其中列NSEMS显示系统已占用信号量。

背景:
One of the most common reasons for the TNS-12516 and/or TNS-12519 errors being reported is the configured maximum number of PROCESSES and/or SESSIONS limitation being reached. When this occurs, the service handlers for the TNS listener become "Blocked" and no new connections can be made. Once the TNS Listener receives an update from the PMON process associated with the Database instance telling the TNS Listener the thresholds are below the configured limit, and the database is now accepting connections connectivity resumes.

By way of instance registration, PMON is responsible for updating the listener with information about a particular instance such as load and dispatcher information. Maximum load for dedicated connections is determined by the PROCESSES parameter. The frequency at which PMON provides SERVICE_UPDATE information varies according to the workload of the instance. The maximum interval between these service updates is 10 minutes.

The listener counts the number of connections it has established to the instance but does not immediately get information about connections that have terminated. Only when PMON updates the listener via SERVICE_UPDATE is the listener informed of current load. Since this can take as long as 10 minutes, there can be a difference between the current instance load according to the listener and the actual instance load.

When the listener believes the current number of connections has reached maximum load, it may set the state of the service handler for an instance to "blocked" and begin refusing incoming client connections with either of the following errors: ora-12519 or ora-12516

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数据的时候出现的以上错误.

2008年7月26日星期六

升级Oracle 9.2.0.4到9.2.0.8

1. shutdown database
2. runInstaller
3. startup database, check system tablespace has at least 10M free space.
4. change shared_pool_size, java_pool_size to 150M
5. shutdown database
6. STARTUP MIGRATE
SPOOL patch.log
@$ORACLE_HOME/rdbms/admin/catpatch.sql
SPOOL OFF
7. restart database
8. @$ORACLE_HOME/rdbms/admin/utlrp.sql

2008年7月20日星期日

xmanager连接redhat,rhel

因为是在vmware中安装的redhat已经rhel, 但是跑到vmware那小小的窗口里面去操作是在很烦,而且反应有点迟钝.
想到公司采用xmanage的方式连接, 感觉挺方便的, 我在公司用xmanager连几个OS的方式都是采用telnet.
于是也尝试在自己机器上将telnet配起来(虽然都说不太安全, 但反正是在自己局域网内, 无所谓了, 方便就行), 配置还是瞒简单的:
首先要打上telnet-server这个包, 别忘了预先打上xinetd. 如果是redhat6或7, 直接重启就可以了.
如果是RHEL3,RHEL4, 还需要先改下一个配置文件/etc/xinetd.d/telnet
将disable=yes改为no,然后重启就OK了(如果预先已经装好rpm,只是没有改配置, 那么改了配置重启xinetd服务就OK了).

VMWARE相关

上星期硬盘挂了,临时从网上买了块硬盘回来。两三百G的东西全不丢掉,不得以重新来过。
以前是直接装RHEL4,然后在上面用虚拟机安装各种OS,但是感觉一方面我需要花很多精力去搞定RHEL4下面我的硬件驱动, 另外LINUX下的虚拟机网络互联也比较难配置,所以这次采取了安装WINXP,然后安装虚拟机,灌制各种OS, 然后之间互联。
选中的是vmware,主要是因为看公司用这个,感觉挺方便的。
但是这几天用这个却除了一些问题:
1. 首先安装的是vmware5.0 workstation, 但是安装后,明明序列号有用,却说产品已经过期,冒失还是check到了有新版本,所以不能用老版本?懒得管,重新下新版本6.5,解决.
2. 第一次使用6.5,灌了几个OS,但老是感觉速度太慢了,但是明明资源充足。特别是安装完后,用telnet登录, 半天也不能出来输入用户名密码的提示。最终,该了prority,(注意有两个地方, 一个是VMWARE preference,另外是虚拟OS的advanced option,后者会覆盖前者) 好像有点作用。 但不知道起作用的到底是改这个还是重灌OS。
3. 安装RHEL3 U9,老是出不来x的安装界面, 提示说Fatal io error, 重来几次,改了各种设置都不OK,最终解决:选操作系统的时候, 选RHEL4,实际安装的时候当然还是安装RHEL3, 估计还是跟硬件有关。

2008年7月14日星期一

Linux下ORACLE字符集怪异现象

因为以前吃过苦头, 所以自以为对ORACLE的字符集相关问题比较熟悉. 没想到今天在Linux上依然碰到了问题.
原因是这样的, 我们这边的数据库字符集一般都是UTF8, 在windows下使用sql navigator插入中文一般需要将客户端字符集改为中文或者convert插入(只有部分中文能采取第二种方法), 而查看中文也是一样.
没想到今天在安装的测试环境RHEL4下面却碰到了问题, 当我在RHEL4中sqlplus查看我在windows种插入的中文的时候, 在环境变量字符集为UTF8的时候, 能够正常看到中文, 反而是环境变量为ZHS16GBK时看到的是乱码. 起初以为是疏忽了, 结果反复尝试几次都是如此, 想了许久也没明白.

回家看到自己机器上那中文菜单, 确实UTF8编码的RHEL4才想起来, 默认LINUX编码是UTF8, 而windows是GB2312, 所以在windows下面, 看中文需要, 将UTF8转为ZHS16GBK的编码, 操作系统才认识这是中文. 反而是在LINUX下, 操作系统本身就是UTF8编码, 所以不需要转换, 直接就能够认识数据库里面UTF8编码的中文.

RHEL4下ORACLE9i DBCA不能创建数据库

前几天在家以及公司的机器上都装了oralce9i, 操作系统是RHEL4, 就是很纳闷, 正常安装的oracle, 安装过程没有出现任何错误, 为什么安装以后运行DBCA不能创建数据库....
老是点到最后一步, Finish然后就直接关掉了, 并且出现如下message:
/disk2/oracle/ora9204/bin/dbca: line 124: 5550 Segmentation fault $JRE_DIR/bin/jre -DORACLE_HOME=$OH -DJDBC_PROTOCOL=thin -mx64m -classpath $CLASSPATH oracle.sysman.assistants.dbca.Dbca $ARGUMENTS

找到的solution是, 找到dbca的124行, 添加上-native
$JRE_DIR/bin/jre -native -DORACLE_HOME=$OH -DJDBC_PROTOCOL=thin -mx64m -classpath $CLASSPATH oracle.sysman.assistants.dbca.Dbca $ARGUMENTS

其实从判断条件可以看出, 我们也可以这样做, 在/etc下新建一个rac_on的文件, 然后运行DBCA.

ORACLE9i创建数据库过程

此文无任何技术含量, 也非做研究, 仅为记录, 加深印象.

下面是在ORACLE 9i中创建一个数据库的过程:

创建相关目录

mkdir /opt/oracle/admin/EDP/bdump

mkdir /opt/oracle/admin/EDP/cdump

mkdir /opt/oracle/admin/EDP/create

mkdir /opt/oracle/admin/EDP/pfile

mkdir /opt/oracle/admin/EDP/udump

mkdir /opt/oracle/ora8i/9.2.0/dbs

mkdir /opt/oracle/oradata/EDP

设置环境变量

setenv ORACLE_SID EDP

可以设置自动启动数据库

echo Add this entry in the oratab: EDP:/opt/oracle/ora8i/9.2.0:Y

创建密码文件

/opt/oracle/ora8i/9.2.0/bin/orapwd file=/opt/oracle/ora8i/9.2.0/dbs/orapwEDP password=change_on_install

使用init.ora启动实例到nomount状态

startup nomount pfile="/opt/oracle/admin/EDP/scripts/init.ora";

创建数据库

CREATE DATABASE EDP

MAXINSTANCES 1

MAXLOGHISTORY 1

MAXLOGFILES 5

MAXLOGMEMBERS 3

MAXDATAFILES 100

DATAFILE '/opt/oracle/oradata/EDP/system01.dbf' SIZE 250M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED

EXTENT MANAGEMENT LOCAL

DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE '/opt/oracle/oradata/EDP/temp01.dbf' SIZE 40M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED

UNDO TABLESPACE "UNDOTBS1" DATAFILE '/opt/oracle/oradata/EDP/undotbs01.dbf' SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED

CHARACTER SET UTF8

NATIONAL CHARACTER SET UTF8

LOGFILE GROUP 1 ('/opt/oracle/oradata/EDP/redo01.log') SIZE 102400K,

GROUP 2 ('/opt/oracle/oradata/EDP/redo02.log') SIZE 102400K,

GROUP 3 ('/opt/oracle/oradata/EDP/redo03.log') SIZE 102400K;

创建一些可选的tablespace

CREATE TABLESPACE "CWMLITE" LOGGING DATAFILE '/opt/oracle/oradata/EDP/cwmlite01.dbf' SIZE 20M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ;

CREATE TABLESPACE "DRSYS" LOGGING DATAFILE '/opt/oracle/oradata/EDP/drsys01.dbf' SIZE 20M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ;

CREATE TABLESPACE "EXAMPLE" LOGGING DATAFILE '/opt/oracle/oradata/EDP/example01.dbf' SIZE 120M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ;

CREATE TABLESPACE "INDX" LOGGING DATAFILE '/opt/oracle/oradata/EDP/indx01.dbf' SIZE 25M REUSE AUTOEXTEND ON NEXT 1280K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ;

CREATE TABLESPACE "ODM" LOGGING DATAFILE '/opt/oracle/oradata/EDP/odm01.dbf' SIZE 20M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ;

CREATE TABLESPACE "TOOLS" LOGGING DATAFILE '/opt/oracle/oradata/EDP/tools01.dbf' SIZE 10M REUSE AUTOEXTEND ON NEXT 320K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ;

CREATE TABLESPACE "USERS" LOGGING DATAFILE '/opt/oracle/oradata/EDP/users01.dbf' SIZE 25M REUSE AUTOEXTEND ON NEXT 1280K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ;

CREATE TABLESPACE "XDB" LOGGING DATAFILE '/opt/oracle/oradata/EDP/xdb01.dbf' SIZE 20M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ;

创建数据字典

@/opt/oracle/ora8i/9.2.0/rdbms/admin/catalog.sql; 数据字典

@/opt/oracle/ora8i/9.2.0/rdbms/admin/catexp7.sql; exp兼容

@/opt/oracle/ora8i/9.2.0/rdbms/admin/catblock.sql; lock相关

@/opt/oracle/ora8i/9.2.0/rdbms/admin/catproc.sql; procedural相关

@/opt/oracle/ora8i/9.2.0/rdbms/admin/catoctk.sql; Cryptographic ToolKit

@/opt/oracle/ora8i/9.2.0/rdbms/admin/owminst.plb; oracle work manager

connect SYSTEM/manager

@/opt/oracle/ora8i/9.2.0/sqlplus/admin/pupbld.sql; PRODUCT_USER_PROFILE

connect SYSTEM/manager

set echo on

spool /opt/oracle/ora8i/9.2.0/assistants/dbca/logs/sqlPlusHelp.log

@/opt/oracle/ora8i/9.2.0/sqlplus/admin/help/hlpbld.sql helpus.sql;

创建一些可选组件

/opt/oracle/ora8i/9.2.0/bin/sqlplus /nolog @/opt/oracle/admin/EDP/scripts/JServer.sql

/opt/oracle/ora8i/9.2.0/bin/sqlplus /nolog @/opt/oracle/admin/EDP/scripts/ordinst.sql

/opt/oracle/ora8i/9.2.0/bin/sqlplus /nolog @/opt/oracle/admin/EDP/scripts/interMedia.sql

/opt/oracle/ora8i/9.2.0/bin/sqlplus /nolog @/opt/oracle/admin/EDP/scripts/context.sql

/opt/oracle/ora8i/9.2.0/bin/sqlplus /nolog @/opt/oracle/admin/EDP/scripts/xdb_protocol.sql

/opt/oracle/ora8i/9.2.0/bin/sqlplus /nolog @/opt/oracle/admin/EDP/scripts/spatial.sql

/opt/oracle/ora8i/9.2.0/bin/sqlplus /nolog @/opt/oracle/admin/EDP/scripts/ultraSearch.sql

/opt/oracle/ora8i/9.2.0/bin/sqlplus /nolog @/opt/oracle/admin/EDP/scripts/odm.sql

/opt/oracle/ora8i/9.2.0/bin/sqlplus /nolog @/opt/oracle/admin/EDP/scripts/cwmlite.sql

/opt/oracle/ora8i/9.2.0/bin/sqlplus /nolog @/opt/oracle/admin/EDP/scripts/demoSchemas.sql

编译invalid对象

@/opt/oracle/ora8i/9.2.0/rdbms/admin/utlrp.sql;

关闭数据库, 重新连接

创建spfile文件

create spfile='/opt/oracle/ora8i/9.2.0/dbs/spfileEDP.ora' FROM pfile='/opt/oracle/admin/EDP/scripts/init.ora';

启动数据库

在ORACLE中监控HTTPS网站

无法查看这则摘要。请 点击此处查看博文。

2008年7月7日星期一

在RHEL4上面安装oracle9.2.0.4

[yves@yves oracle8i]$ uname -a
Linux yves.ldi 2.6.9-42.ELsmp #1 SMP Wed Jul 12 23:27:17 EDT 2006 i686 athlon i386 GNU/Linux

机器上原本安装有10g的数据库, 以及ORACLE ERP R12, 所以内核配置没有问题, 软件安装也基本齐全, 用户组已经建好.

1.添加用户
/usr/sbin/useradd -g oinstall -G dba oracle
2.修改/etc/security/limits.conf
添加:
ora8i soft nproc 2047
ora8i hard nproc 16384
ora8i soft nofile 1024
ora8i hard nofile 65536
3.修改/etc/profile
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
4.从meta link上下载patch:4198954, 安装其中包含的两个rpm包. 参见metalink:169706.1
5.修改/home/ora8i/.bashrc
LD_ASSUME_KERNEL=2.4.19
export LD_ASSUME_KERNEL
如果这一项不做修改,会报如下错误:
symbol errno, version GLIBC_2.0 not defined in file libc.so.6 with link time reference (libzip.so)
Unable to initialize threads: cannot find class java/lang/Thread
Could not create Java VM
6.在环境变量中设置ORACLE_BASE环境变量, 如果此处不设置, 会报错说DBCA不能安装, 对相应目录没有写权限, 经测试, 其实它会将根目录当做ORACLE_BASE, 当然,如果安装用户对根目录有写权限, 也没有问题.
另外一种solution: (我第一次安装的时候采用, 测试通过)在根目录下创建文件夹oradata, 使安装用户对此文件夹有写权限.
7.运行Disk1下runInstaller进行安装.

2008年7月3日星期四

PL/SQL Developer的导入功能


今天有RD发过来一个PDE后缀的文件, 说是客户发过来的, 要求导入.
以前客户都是直接发DMP文件, 然后使用imp导入的, 好像是RD抱怨说表名大小写敏感, 所以他们换了种方式.
我以前也没看过这种文件, 网上查了下, 是PL/SQL Developer导出的文件,
正好机器上有装这个软件, 所以就试了下, 果然导入成功.

PL/SQL Developer --> Tools --> Import Tables
会有3个tab页, 第一个应该是正常的dmp文件, 而第二个用来处理SQL脚本, 第三个就是用来处理这种pde文件了,
不过里面那些选项倒是还搞不清楚什么意思.

2008年7月2日星期三

TOP命令on HP Unix

HP UnixTOP命令的例子:

参数:

-s time 设置屏幕刷新的延时,单位为秒,默认值5

-d count 设置屏幕刷新的次数,刷新显示完count次后退出

-q 如果经过nice授权,使用-q可以使top运行的更快一些

-u 用显示User ID代替username,提高命令运行速度

-h 当系统由多个CPU时,个别CPU的状态信息被隐藏,只显示平均状态值

-n number 设置每一屏幕显示的进程数目,number值超过进程最大数目,则设置无效

-f filename 输出重定向到给定的文件名,默认为16个进程信息

System: benqora3 Mon Jun 30 20:38:40 2008 系统名和当前日期

Load averages: 0.87, 1.06, 1.02 1分钟、5分钟和15分钟内运行的负载平均数, 即单位时间内运行队列中的平均进程数, 一般不大于3OK, 如果大于5则问题比较大

1240 processes: 1161 sleeping, 78 running, 1 zombie

系统当前进程总数, zombie指僵尸进程(当父进程产生子进程,子进程运行完毕并等待父进程响应,但是父进程却没有对结束的子进程做出响应,那么这些子进程就会变成僵尸进程)

Cpu states:

CPU LOAD USER NICE SYS IDLE BLOCK SWAIT INTR SSYS

0 0.90 34.3% 0.0% 9.0% 56.7% 0.0% 0.0% 0.0% 0.0%

1 0.69 26.1% 0.0% 10.0% 63.9% 0.0% 0.0% 0.0% 0.0%

2 0.75 74.1% 0.0% 5.4% 20.6% 0.0% 0.0% 0.0% 0.0%

3 0.85 44.9% 0.0% 6.8% 48.3% 0.0% 0.0% 0.0% 0.0%

4 0.74 31.5% 0.0% 11.2% 57.3% 0.0% 0.0% 0.0% 0.0%

5 0.89 74.9% 0.0% 24.8% 0.4% 0.0% 0.0% 0.0% 0.0%

6 0.92 38.1% 0.0% 6.8% 55.1% 0.0% 0.0% 0.0% 0.0%

7 0.92 33.5% 0.0% 10.2% 56.3% 0.0% 0.0% 0.0% 0.0%

8 0.99 29.9% 0.0% 10.6% 59.5% 0.0% 0.0% 0.0% 0.0%

9 1.05 28.5% 0.0% 10.8% 60.7% 0.0% 0.0% 0.0% 0.0%

--- ---- ----- ----- ----- ----- ----- ----- ----- -----

avg 0.87 41.6% 0.0% 10.6% 47.8% 0.0% 0.0% 0.0% 0.0%

从左至右分别为: CPU序号, loading, 用户占用cpu百分比, nice命令改变优先级的任务占用的CPU时间百分比, 系统占用cpu百分比, 闲置cpu百分比, 后面几个不知道啥意思

下面一行是平均值

Memory: 12994712K (5390056K) real, 28114548K (11711360K) virtual, 2841400K free Page# 1/78

关于内存使用情况的统计, 包括实际(real)内存的使用值(活动值),虚拟(virtual)内存的使用值(活动值),剩余的内存。

CPU TTY PID USERNAME PRI NI SIZE RES STATE TIME %WCPU %CPU COMMAND

5 ? 12779 bqpdb 241 20 1373M 64888K run 374:20 95.32 95.16 oracleBQP

7 ? 21792 bqpap 241 20 139M 105M run 1250:45 44.55 44.47 FNDLIBR

6 ? 29643 bqpdb 223 20 1332M 19936K run 0:11 39.82 27.21 oracleBQP

0 ? 29687 bqpdb 235 20 1319M 11952K run 0:08 46.86 25.81 oracleBQP

5 ? 18985 bqpap 168 20 73952K 45344K sleep 156:42 25.24 25.20 FNDLIBR

1 ? 29091 bqpdb 154 20 1311M 4300K sleep 0:59 19.44 19.36 oracleBQP

0 ? 29654 bqedb 229 20 1162M 3792K run 0:07 30.40 19.22 oracleBQE

2 ? 19976 bqadb 227 20 1206M 40508K run 3:05 19.00 18.96 ora_p005_BQA

8 ? 19980 bqadb 227 20 1207M 42364K run 3:08 18.32 18.29 ora_p006_BQA

1 ? 19982 bqadb 221 20 1205M 39292K run 3:05 18.26 18.23 ora_p007_BQA

9 ? 19974 bqadb 222 20 1205M 39356K run 3:09 17.40 17.37 ora_p004_BQA

3 ? 29749 bqpdb 241 20 1315M 9648K run 0:03 92.43 16.75 oracleBQP

6 ? 29511 bqadb 149 20 1164M 5652K sleep 0:08 17.38 15.46 oracleBQA

0 ? 26592 bqpdb 149 20 1323M 14576K sleep 1:33 14.75 14.72 oracleBQP

9 ? 29696 bqedb 154 20 1166M 6728K sleep 0:03 25.85 13.64 oracleBQE

3 ? 28491 bqpdb 154 20 1373M 15864K sleep 15:39 13.19 13.17 oracleBQP

从左至右分别为: 处理器号, 终端名, 进程号, 用户名, 任务优先级, NICE(越低优先级越高), 任务的代码加上数据再加上栈空间的大小, 任务使用的物理内存的总数量, 任务的状态, 自任务开始时使用的总CPU时间,单位为秒,如153:43,对应是153 43毫秒, 进程的CPU利用率加权百分比,CPU原始利用率百分比自上一次屏幕刷新以来任务占用CPU 时间的份额(用来排序), 这两个都不太理解, 启动进程的命令名

SQL Mail

今天有PM提出了想要在SQL Server JOB跑失败的时候发邮件通知相关人员.

1. SQL Server服务用Domain账号运行

2. "Enterprise Manager""support service"的属性中设定mail profile名称, 我机器是outlook (已安装outlook, 并且已经设置好outlook帐号)

3. 然后在"SQL Server Agent"属性的Mail Profile中选outlook

4. 最后可以在jobNotification中填mail地址, 然后测试

2008年7月1日星期二

转: windows性能管理解析

查看IIS LOG:
C:\WINDOWS\system32\Logfiles\W3SVC1

查看IIS连接数:
控制面板 --> 管理工具 --> Performance --> 添加计数器

Windows性能管理解析

说到Windows环境下的性能管理,许多人首先想到的可能就是无处不在的Performance Monitor工具。早在Windows NT时代,Performance Monitor就是获取性能信息的主要工具,当然,任务管理器和Windows管理规范(Windows Management Instrumentation)也属于常用工具之列,它们不仅能够提供性能数据,而且还能提供其他与性能有关的管理信息。本文介绍了一些充分发挥这些经 典工具潜能的技巧,同时介绍了 Windows XP新增的工具,探讨如何运用它们来评估系统的性能情况。
  一、什么是性能管理?

  对于许多管理员来说,Windows的性能管理不外乎打开控制面板→管理工具中的"性能"程序,即Performance Monitor程序,然后检查一下CPU利用率、磁盘忙闲状况、内存压力,而且通常只有在出现性能问题时才会去检查,例如服务器响应突然变慢,或者用户不 能访问服务器。这种性能管理方式完全属于事后补救的方式,只起到了救火队员的作用,由于缺乏详尽、明确的事前评估、规划,算不上优秀的策略。要实现有效的 性能管理,一定要在出现问题之前掌握系统的性能情况。

  只有事先采取有效的性能管理策略,才能全面掌握系统的性能特征,在此基础上,就可以估计何时可能出现性能问题以及问题的具体表现。预先收集的性 能数据还可以用来规划未来的运算能力需求,例如,假设有一个IIS Web服务器,当并发用户数量是200时CPU的利用率是60%,据此可以推断系统负载何时达到极限,以及达到负载极限时能够支持的并发用户数量。另外, 根据网站的增长情况,还可以估计出何时需要增添硬件设备。

  系统的整体性能由许多因素决定,例如CPU利用率,CPU队列长度(即,有多少任务正在等待CPU的服务),磁盘忙闲程度(即,磁盘驱动器有多少时间用于响应请求),可用的物理内存,网络接口的利用情况,等等,表一概括了最常用的性能计数器。

表一:重要的性能计数器

性能对象 计数器 提供的信息
Memory Available Bytes Available Bytes显示出当前空闲的物理内存总量。当这个数值变小时,Windows开始频繁地调用磁盘页面文件。如果这个数值很小,例如小于5 MB,系统会将大部分时间消耗在操作页面文件上。
Memory % Committed Bytes in Use % Committed Bytes In Use 是 Memory: Committed Bytes 与Memory: Commit Limit之间的比值。(Committed memory指如果需要写入磁盘时已在分页文件中保留空间的处于使用中的物理内存。Commit Limit是由分页文件的大小而决定的。如果扩大了分页文件,该比例就会减小)。这个计数器只显示当前百分比;而不是一个平均值。
Memory Page Faults/sec Page Faults/sec是指处理器处理错误页的综合速率。用错误页数/秒来计算。当处理器请求一个不在其工作集(在物理内存中的空间)内的代码或数据时出现 的页错误。这个计数器包括硬错误(那些需要磁盘访问的)和软错误(在物理内存的其它地方找到的错误页)。许多处理器可以在有大量软错误的情况下继续操作。 但是,硬错误可以导致明显的拖延。这个计数器显示用上两个实例中观察到的值之间的差除以实例间隔的持续时间所得的值。
Network Interface Bytes Total/sec Bytes Total/sec是发送和接收字节的速率,包括帧字符在内。
Network Interface Packets/sec Packets/sec为发送和接收数据包的速率。
Physical Disk % Busy Time % Busy Time指磁盘驱动器忙于为读或写入请求提供服务所用的时间的百分比。
Physical Disk Avg. Disk Queue Length Avg. Disk Queue Length 指读取和写入请求(为所选磁盘在实例间隔中列队的)的平均数。
Physical Disk Current Disk Queue Length Current Disk Queue Length指在收集操作数据时在磁盘上未完成的请求的数目。它包括在快照内存时正在为其提供服务中的请求。这是一个即时长度而非一定间隔时间的平均值。 多主轴磁盘设备可以一次有多个请求操作,但是其它同时发生的请求为等候服务。这个计数器可能会反映一个暂时的高或低的列队长度,但是如果在磁盘驱动器存在 持续负载,可能值会总是很高。请求等待时间与这个列队的长度减去磁盘上的主轴成正比。这个差值应小于2才能保持良好的性能。
Processor % Processor Time % Processor Time指处理器执行非闲置线程时间的百分比。这个计数器设计成用来作为处理器活动的主要指示器。它通过在每个范例间隔中衡量处理器用于执行闲置处理线程 的时间,并且用100%减去该值得出。(每个处理器有一个闲置线程,该线程在没有其它线程可以运行时消耗周期)。可将其视为范例间隔用于做有用工作的百分 比。
Processor % User Time % User Time指用于用户模式的非闲置处理器时间的百分比(用户模式是为应用程序、环境分系统和整数分系统设计的有限处理模式。另一个模式为特权模式,它是为操 作系统组件设计的并且允许直接访问硬件和所有内存。操作系统将应用程序线程转换成特权模式以访问操作系统服务)。这个计数值将平均忙时作为实例时间的一部 分显示。
Server Work Queues Queue Length Queue Length指CPU当前的服务器作业队列长度。队列长度长时间超过四可能表示处理器堵塞。此值为即时计数,不是一段时间的平均值。
System Processor Queue Length Processor Queue Length是指处理队列中的线程数。即使在有多个处理器的计算机上处理器时间也会有一个单队列。不象磁盘计数器,这个计数器仅计数就绪的线程,而不计数 运行中的线程。如果处理器队列中总是有两个以上的线程通常表示处理器堵塞。这个计数器仅显示上一次观察的值;而不是一个平均值。
TCP Segments Retransmitted/sec Segments Retransmitted/sec指程序段重新传输的速率,即传输的程序段中包含一个或多个以前传输过的字节。

二、定制性能监视器

  在Windows 2K/XP中,Performance Monitor仍是最常用的性能管理工具。当然,新版的工具不少地方已经改进,增添了不少功能。在Win 2K中,性能监视器以一个管理控制台(MMC)单元的形式实现。启动Win 2K/XP的性能监视器,可以看到类似图一的界面。

图一

  在Win XP中,性能监视器默认装入三个计数器:Pages/sec,Avg. Disk Queue Length,% Processor Time。这三个计数器无法直接删除,但一直留着又降低了监视器启动速度。如果要让监视器启动时不装入任何计数器,首先要清除\%systemroot% \system32目录下perfmon.msc文件的只读属性:进入命令窗口,转到system32目录,执行命令attrib r perfmon.msc。然后重新启动计数器,选中一个计数器,点击工具栏上黑色的"X"按钮即可删除一个计数器。选择菜单"文件"→"保存",将更改后 的管理控制台保存到磁盘。如果要将管理控制台执行标记成只读,只需在命令行上执行attrib +r perfmon.msc即可。

  在NT 4.0中,性能监视器包含一个实时图表,另外还有记录日志和报警功能,但在Win 2K和XP的中,这些功能分开了。在Win 2K/XP中,实时性能图表变成了"系统监视器",系统监视器之下是日志和警报工具。系统监视器可以看作一个纯粹的实时性能数据察看工具,只能看,不能保 存,点击工具栏上的"+"按钮可以添加新的性能计数器。性能日志和警报工具则具有操作历史数据的功能。

  如果要创建一个只有系统监视器、不带性能日志和警报工具的管理控制台,可按如下步骤操作:执行"MMC"命令,打开一个空白的MMC窗口,选择 菜单"文件"→"添加/删除管理单元",点击"添加",选择"ActiveX控件",再点击"添加",在向导中选择System Monitor Control,确认即可。

三、性能日志和警报工具

  系统监视器只能简单地查看实时性能数据,如果需要长期的、持久化的性能数据,必须使用性能日志和警报工具。性能日志工具能够在一个日志文件中集 中记录来自本地或远程的多个系统的性能数据,这些日志数据可以用系统监视器查看或用其他工具处理。扩展控制台中的"性能日志和警报"节点,可以看到它的三 个分支:计数器日志,跟踪日志,警报。警报工具的功能很简单,就是当某个计数器的性能数据达到指定的值时,执行一定的动作,例如发送Email或用Net Send命令发送消息。下面我们主要讨论的是日志工具。

  为了说明如何使用计数器日志,我们要新建一个日志会话。右击"计数器日志"节点,选择"新建日志设置",指定日志设置的名称,点击"确定",出现图二的对话框,在这里设定要在日志中记录的计数器。

图二

  日志文件的默认保存路径是C:\perflogs目录,可以在对话框的"日志文件"页修改,但首先要设置待记录的对象和计数器才能转到"日志文 件"页。点击"添加对象"按钮,将某个监视对象的所有计数器加入日志记录,或者点击"添加计数器"按钮加入单个计数器。无论选择哪种加入选项,监视目标 (对象或计数器)都可以是本地的,也可以是远程机器的。

  如果要长期收集性能数据,最好调整一下采样间隔时间――特别地,如果要监视的计数器很多,而且来自不同的机器,如果采样间隔时间设置得太小,日志文件很快会变得很大。从每隔15分钟采样一次开始,试运行一段时间,看看日志文件变得多大了,然后再作相应的调整。

  如果要连接远程机器,可以在"运行方式"输入框提供登录远程机器的用户名字。

  收集性能监视数据需要一定的权限,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib注册子键控制着对性能监视数据的访问,性能监视数据正是通过该注册子键流到系统监视器之类的工具。用 右键点击该注册子键,选择菜单"权限",如图三,调整这里的权限分配也就调整了有权访问性能数据的用户。

图三

设置好要监视的对象和计数器之后,可以在"日志文件"页调整日志文件的格式,在"计划"页设置启动、停止日志的时间。如果设置成手工启动,启动方式是在MMC窗口中右击日志会话并选择"启动"。

  在"日志文件"页中,如图四,性能计数器日志除了默认的二进制.blg格式之外,还可以保存为其他多种格式,例如逗号分隔的文本文件(即CSV 文件),甚至还可以保存到SQL Server表――这是Windows Server 2003和XP才有的功能。如果选择了SQL Server,还要指定一个SQL Server数据源和保存数据的表,虽然麻烦一点,不过如果要收集大量的性能数据并进行分析,SQL Server还是一种不错的选择。

图四

  启动日志之后,可以看到日志目录中生成了一个65 KB的日志文件。每次关闭和重新启动日志,都会生成一个新的日志文件,文件名字中的序号依次增加。Win XP和2K支持一项非常实用的功能,即使在性能监视器工具不运行的时候,也能继续将性能数据写入日志。如果是NT 4.0,则需要安装NT 4.0 Resource Kit的DataLog服务才能使用这个无人值守日志记录功能。Win 2K和XP本身就有Performance Logs and Alerts服务,该服务在日志会话启动时自动启动,日志会话结束时自动停止。

  Win 2K/XP性能日志的另一个改进之处是保存日志会话功能。在NT 4.0中,如果要为某个日志会话重新使用一组选定的性能对象和计数器,必须为每一台想要监视的服务器重新创建工作台文件,如果要将一组日志配置分别在多台 服务器上本地运行,必须重复执行繁琐的配置操作。但在Win 2K/XP中,所有配置文件(包括日志和警报)都以HTML文件的形式保存,很容易修改和重用。要保存一个日志会话配置,只要在MMC窗口中右击会话,然 后选择菜单"将设置另存为"即可。

  四、命令行工具

  XP提供了一个叫做Logman的新工具,它不仅能够在命令行上启动和停止日志会话,而且能够从命令行创建新的日志会话。

  例如,下面的第一Logman命令新建了一个iislogging会话,日志文件保存在默认c:\perflogs\ IISLogging.blg,日志中加入了本地服务器上inetinfo.exe进程的Process\% Processor Time计数器,收集性能数据的时间间隔是15分钟。第二个命令启动了iislogging日志会话。运行这些命令之后,如果启动MMC性能监视工具,可 以看到计数器日志中已经列出了刚才创建的日志会话。

logman create counter iislogging -c "\Process(inetinfo)\% Processor Time" -si 15:00logman start iislogging


用Logman的-s选项可以启动远程机器上的日志,使用形式类如"-s \\ServerName"。使用该选项时,Logman启动的日志将在远程服务器上运行,而不是执行Logman命令的本地机器。

  五、WMIC

  WMIC即Windows管理规范的命令行工具,在命令上执行执行wmic,即可启动WMIC环境。第一次执行wmic命令时,WMIC首先把 自己安装到WMI名称空间。虽然微软推出WMIC的意图是简化WMI的使用,不过WMIC的命令行语法还是显得比较复杂。WMIC依靠别名来描述经常要访 问的 WMI类,例如,WMIC的别名pagefile相当于WMI查询Select * from Win32_PageFileUsage,如果在wmic提示符下输入pagefile命令,WMIC将显示出当前的页面文件使用情况。

  遗憾的是,WMIC没有为基于WMI的性能监视数据提供别名,所以要查询性能监视器数据,必须直接调用相应的WMI类。例如,如果要查看服务器 当前的物理内存使用情况,可以在WMIC命令行上执行path win32_perfformatteddata_perfos_memory,该命令要求WMIC返回WMI类 win32_perfformatteddata_perfos_memory的数据,输出结果包含了指定WMI内存对象的每一个属性。如果只想查看 Available Bytes属性,可以将命令改为path win32_perfformatteddata_perfos_memory get AvailableBytes。

  另外,WMIC命令还可以从Windows命令行直接执行,例如,要查看Available Bytes,可以执行wmic path win32_perfformatteddata_perfos_memory get AvailableBytes命令,如果要返回多个属性值,只要依次列出各个属性,属性之间用逗号分隔,例如"AvailableBytes, AvailableMBytes,CacheBytes"。

  那么,如何获得各种性能监视器计数器的WMI类名称呢?最好的办法是使用WMI Tools。WMI Tools是微软提供的一个免费工具,可以从http://www.microsoft.com/downloads/details.aspx? displaylang=en&familyid=6430F853-1120-48DB-8CC5-F2ABDC3ED314下载,如图五所 示,它能够清楚地显示出各个类的名称、属性、方法。

图五

  总而言之,在多层应用环境中,如果要查找性能瓶颈的具体位置,性能监视数据无疑是极其宝贵的依据,只要充分运用Win 2K/XP提供的性能工具,我们可以构造出功能丰富的性能管理系统。

Timezone mismatch错误

以前装的一个Oracle 10g测试环境, 忘了改了什么设置, 最近在执行emctl start dbconsole的时候, 老是报以下错误:

Timezone mismatch: The agentTZRegion value (PRC) in

/home/tim/oracle/product/10.2.0/db_tim/localhost.localdomain_tim/sysman/config/emd.properties

does not match the current environment TZ setting(Etc/GMT+12).

The dbconsole cannot run with this mismatch.

solution: 找到错误种所说的文件, 将文件中最后一行agentTZRegions的设置去掉, 就OK了.

其实通过错误提示, 应该也可以通过执行emctl resetTZ agent来修复.

2008年6月30日星期一

IMPORT & EXPORT

1. 什么是import/export? 我们为什么需要它?
oracle的import(imp)和export(exp)功能用来执行oracle数据库的逻辑备份与恢复. 导出的时候, 数据库对象被存储在一个二进制文件中, 并且能够被导入到另外一个oracle数据库中. 这个功能能够用来在不同的机器, 数据库, schema之间转移数据, 但是因为是二进制文件, 所以不能用在非oracle的数据库上面.
imp & exp 通常被用来执行以下任务:
1) 备份与恢复 (仅针对小型数据库 < 50G, 更大的, 则使用RMAN)
2) 在不同平台的oracle数据库之间转移数据
3) 重组数据, 消除数据碎片 (export, drop, re-import)
4) 从古老的oracle版本升级数据库
5) 检测数据库崩溃 (保证数据可读)
6) 在数据库之间转移tablespace
从oralce 10g开始, 用户可以选择使用新的数据泵功能(expdp & impdp)
2. 怎样使用import/export功能
在$ORACLE_HOME/bin目录下找到相应的可执行文件. 它们可以被交互运行, 使用命令行参数或者参数文件, 相应的参数可以使用exp help=yes(imp help=yes)
下面是几个使用exp/imp的例子:
exp scott/tiger file=emp.dmp log=emp.log tables=emp rows=yes indexes=no
exp scott/tiger file=emp.dmp tables=(emp,dept)
imp scott/tiger file=emp.dmp full=yes
imp scott/tiger file=emp.dmp fromuser=scott touser=scott tables=dept
使用参数文件
exp userid=scott/tiger@orcl parfile=export.txt
export.txt :
BUFFER=100000
FILE=account.dmp
FULL=n
OWNER=scott
GRANTS=y
COMPRESS=y
还可以使用OEM中的schema manager GUI工具.
3. 是否可以导出一个table的子集?
从oracle 8i开始, 就可以使用query = export来导出一个table的一部分数据, 你可能需要处理特殊字符的问题, 例如: query=\"where deptno=10\".
exp scott/tiger tables=emp query="where deptno=10"
exp scott/tiger file=abc.dmp tables=abc query=\"where sex=\'f\'\" rows=yes
4. 可以监控一个table导入的速度吗?
如果你需要监控一个正在执行的imp任务的执行速度, 有以下方法可供选择:
1)
select substr(sql_text,instr(sql_text,'INTO "'),30) table_name,
rows_processed,
round((sysdate-to_date(first_load_time,'yyyy-mm-dd hh24:mi:ss'))*24*60,1) minutes,
trunc(rows_processed/((sysdate-to_date(first_load_time,'yyyy-mm-dd hh24:mi:ss'))*24*60)) rows_per_min
from sys.v_$sqlarea
where sql_text like 'INSERT %INTO "%'
and command_type = 2
and open_versions > 0;
如果当前有多个table在导入, 这个语句不会显示正在被导入table的信息
2) 使用FEEDBACK = n参数, 这个参数会告诉imp在每导入N行以后显示一个度号.
5. 可以将table导入到一个不同的tablespace吗?
oracle没有提供参数来指定将数据导入到一个不同的tablespace, 默认情况下, 数据库对象需要在导出的tablespace中重建, 但是我们也可以使用以下方法来改变这一行为:
1) 在相应的tablespace种预先创建好table(s)
使用参数INDEXFILE=option
编辑indexfile, 移出注释, 指定正确的tablespace
在你的数据库中运行这个index文件, 这将会在相应的tablespace中创建需要的table
使用IGNORE=Y来导入文件
2) 改变user的default space
revoke user的"UNLIMITED TABLESPACE"权限
revoke user在导出tablespace上的磁盘限额, 这将强制imp功能在user默认
tablespace上创建相应的table
将相应的tablespace设为user的默认tablespace
导入文件
6. 在导入之前需要DROP/TRUNCATE对象吗?
如果在一个已经存在的table上导入数据, 我们需要truncate或者drop掉这个table, 以清除老的数据. 如果不这样做, 新的数据会附加在老的数据后面. 在导入之前, 必须drop已经存在的sequense, 否则会产生数据的冲突. 同样也建议将index drop掉以加快import速度, 在导入以后再重建index
7. 可以在不同版本之间导入导出数据吗?
oracle的import是向上兼容的, 也就是说, 老板本export产生的数据可以使用新版本的import来导入, 这在升级数据库的时候经常用到.
oracle同事还提供了一些catexpX.sql的脚本, 使用sys执行这些脚本可以使老板本的imp/exp运行在新版本的数据库上. 脚本位置$ORACLE_HOME/rdbms/admin/
8. 可以export到多个文件吗? 可以打破Unix下2G文件的限制吗?
从oracle8i开始, export功能就支持多个文件的导出, 这个功能使大的export能够被拆分为几个小的文件, 这样就不会超过操作系统的文件限制了(使用FILESIZE参数). 当导入这种导出为多文件的数据的时候, 必须使用使用FILE参数来提供使用同一个sequence的文件名.
示例:
exp SCOTT/TIGER FILE=D:F1.dmp,E:F2.dmp FILESIZE=10m LOG=scott.log
在oracle8i之前的版本, 可以通过gzip压缩文件来达到export大数据量文件的目的, 最大可以导出高10G的文件,这取决于数据的类型.
export:
# create a named pipe
mknod exp.pipe p
# read the pipe - output to zip file in the background
gzip < exp.pipe > scott.exp.gz &
# feed the pipe
exp userid=scott/tiger file=exp.pipe ...[/code]
import:
# create a name pipe
mknod imp_pipe p
# read the zip file and output to pipe
gunzip < exp_file.dmp.gz > imp_pipe &
# feed the pipe
imp system/pwd@sid file=imp_pipe log=imp_pipe.log ...
9. 怎样增进import/export的performance
export:
1) 将BUFFER参数设大(2M: 2000000)
2) 将RECORDLENGTH参数设大(64K: 64000)
3) 使用DIRECT=yes
4) 停止不必要的程序释放资源
5) 如果使用多个export session, 确保它们写的是不同的物理磁盘
6) 不要export到NFS文件系统
import:
1) 创建一个indexfile, 这样你可以在import数据以后创建index(import的时候指定
INDEXFILE参数), 这样你导入的时候不会导入人和数据, 仅仅创建index. 你必须预先编辑这个]
文件, 在connect语句中提供密码
2) 将需要导入的文件放置在与ORACLE数据不同的磁盘上
3) 增加DB_CACHE_SIZE(9i以前为DB_BLOCK_BUFFER)
4) 将LOG_BUFFER设到比较大的值, 重启oracle
5) 停止redo log archiving(ALTER DATABASE NOARCHIVELOG)
6) 创建一个拥有大回滚段的大table space. 将其他所有的回滚段offline(当然不包含SYSTEM的
回滚段), 回滚段最好与你最大的table一样大.
7) 使用COMMIT=N(如果你可以承受得起的话)
8) 使用ANALYZE=N
9) 别忘了run之前创建的index file.
10. IMP/EXP的普遍问题
ORA-00001: Unique constraint (...) violated
你在导入重复行,使用IGNORE=NO来跳过那些重复的table(如果object重复创建会报错)
ORA-01555: Snapshot too old
当你在导入数据的时候,通知你的user停止手头工作, 或者使用CONSISTENT=YES
ORA-01562: Failed to extend rollback segment
创建大的回滚段或者设置参数COMMIT=Y
IMP-00015: Statement failed ... object already exists...
使用IGNORE=Y来忽略这些错误, 但要小心产生重复的行

原文地址: http://www.orafaq.com/wiki/Import_Export_FAQ

2008年6月26日星期四

ORA-02068 & ORA-03113错误

最近公司的一台serveralert log频繁报出一个错误:

---------------------------------------------------------------------------------------------------------------------------------------

Errors in file /disk/benqdw/9.2.0/admin/BENQDW/bdump/benqdw_reco_5258.trc:
ORA-28546: connection initialization failed, probable Net8 admin error
ORA-02068: following severe error from ORAPROD
ORA-03113: end-of-file on communication channel

---------------------------------------------------------------------------------------------------------------------------------------

目前trace下来原因大致如下:

我们这台server上的Monitor Job, 就是每天我们发check mailJob是每天0:20开始, 但因为这个Job checkserver以及每个server check的信息比较多,

所以会跑的很久, 每天要将近2:00才能够完成, 实际上这个session要将近2:30才结束.

但是我们目前ERP开发环境每周一到周五2:00会进行分别进行DEVDEV5的全备, 这个全备每天1:45左右会shutdown 环境.

这个时候我们的Monitor Job还没有完成, 因为有check多个session, 尽管只是select数据,但也算一个分布式事务, 事务还没有完成, 其中一个节点已经shutdown,

于是这个事务处于in doubt状态.

而这个状态的分布式事务会引发另外一个bug, 这个情况在meta link: Note:214851.1中有描述:

通过DB Link连接到8.1.7版本的Oracle DB, 如果在logon trigger enable的情况下,

RECO进程在处理in-doubt 的分布式事务的时候, 会报我们看到的这个错误.

而我们这个事务所有节点中, 唯有ORAPROD8.1.7版本, 于是错误显示的节点也就是ORAPROD.

Solution: 将开发环境的backup时间推迟一点, 推迟半个小时就可以了.