100
Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang 1 OracleEBS-R12 DBA笔记 Author: Jarwang(王重东) Create Date: December 5, 2010 Create Location: Beijing AirChina Update Date: Control No: Current Edition: 1.0 声明:本文可以任意免费转载、复制、传播。但您务必保持其完整性! If you copy this document,you ought to keep the document completely.

[itpub.net]Oracle-EBS R12DBA维护笔记

Embed Size (px)

Citation preview

Page 1: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang1

OracleEBS-R12 DBA笔记Author: Jarwang(王重东)

Create Date: December 5, 2010

Create Location: Beijing AirChina

Update Date:

Control No:

Current Edition: 1.0

声明:本文可以任意免费转载、复制、传播。但您务必保持其完整性!

If you copy this document,you ought to keep the document completely.

Page 2: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang2

Document Control

Modify Record

日期 作者 版本 更改参考

December 5,2010 jarwang 1.0

Approved

姓名 职位 签字

Distribute

编码 姓名 地点和位置

1234

Page 3: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang3

Index

Document Control 2

Modify Record 2Approved 2

Index 3

Preface 6

Foundation Chapter 7

EBS Architecture 7EBS Installation 7Multi Note Setup 7

Prepare OS 7Prepare DB 7Regedit Cust Application 9

EBS Startup 12Database Startup 12Apllication Startup 13

APPS Maintenance Chapter 14

EBS Clone 14AutoConfig 14EBS Patch 15

Apply Chinese Patch 15Apply TS Patch 19

Password 20Acquired Pwd of Apps 20

Maintenace 21EBS CGI Login 21并发服务无效 23Export File Failure 23APP-FND-01926 25R12 Log 26

Optimize 26Adjust JVM 26

Database Maitenance Chapter 30

Setup 30Oracle10g For OEL5.5 30Oracle11g For RHEL5.5 Using Silent 39Sqlplus Unreadable Code 43Lsnrctl error 44Oracle Upgrade 45Modify Pwd of DB 45Database10g EM 46Database11g EM 47

Maintenace 51Bath Stop Jobs 51刷新共享池 51查看活动的连接数 51Is RAC 51Grant debug 52Audit 52Audit Vault 53ViewHostname 53View Tablespace 53ORA-12545 54Query Lock 54Query Row Lock 55

Tuning Chapter 57

Page 4: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang4

Performance Tools 57AWR 57ASH 58

统计信息 58系统统计信息 58对象统计信息 59Associate Statistics 61直方图 62对象扩展统计信息 62锁定对象统计信息 62

配置查询优化器 63配置查询优化器路径图 63

执行计划 63Explain Plan 64动态性能视图 64AWR 6510053事件 65解析执行计划 65

SQL优化技术 67改变访问结构 67提示(Hint) 67SQL性能概要 67存储提纲 67SQL计划基线 67

优化数据访问 67获取逻辑读 67降低高水平 68TABLE ACCESS FULL 68INDEX FULL SCAN 68INDEX FAST FULL SCAN 69INDEX UNIQUE SCAN 69INDEX RANGE SCAN 70INDEX RANG SCANDESCENDING 71TABLE ACCESS BY INDEX ROWID 72TABLE ACCESS BY USER ROWID 72聚簇 72聚簇因子 73索引与min/max函数 75函数索引 75语义索引 76位图索引 76组合索引 76索引压缩 77

解析 78共享游标 78服务器端语句缓存 78游标生命周期 79JDBC 79

优化表连接 79表连接方法 79NESTED LOOPS JOIN 80块预取 80MERGE JOIN 81HASH JOIN 81INDEX JOIN 82HASH JOIN OUTER 83PARITTION-WISE JOIN 83连接优化 83星形转换 84

高级优化技术 85Materialized View 85Result Cache 87并行处理 88直接路径插入 89行预取 90

Page 5: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang5

数组接口 91优化物理设计 92

行迁移&行链接 92

CBO Chapter 93

表扫描 93dbf_mbrc 93

Dynamic View Chapter 95

V$PROCESS 95Column 95Purpose 95

V$SESSION 95Column 95Purpose 96

V$LOCK_OBJECT 96Column 96

V$LOCK 96OTHERS 97

查询TOP SQL 97查询唯一索引冲突 98查询非唯一索引冲突 99

Other Notes 100

Page 6: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang6

Preface

Oracle EBS DBA是一个很泛的概念,基本上DB与APP两者要负责,甚至连主机、存储都给包了。按照Oracle官方所谓的DBA2.0的概念,未来的DBA将会着进一步细分。比如:偏向于主机的DBA,偏向于开发的DBA。

Page 7: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang7

Foundation Chapter

EBS Architecture

Oracle EBS R12系统架构图:

EBS Installation

EBS-R12.1.1安装包多达50G之多,较之11i的安装,R12要求在DBA组的用户下。也就是11i允许

是在root安装的,但R12要求在DBA组的用户下安装。

安装参考:http://www.itpub.net/thread-1247010-1-1.html

Multi Note Setup

将EBS R12的应用层、数据库层拆分到两个独立的机器上。

EBS环境:R12.0.4,数据库:Oracle DB10g,操作系统:OEL5.5-64bit。

Prepare OS

首先准备好一台独立的机器,用于安装EBS DB层。DB的操作系统与应用层保持一致,都是

OEL5.5-64bit。

Prepare DB

准备好Oracle Database10g for Linux 64bit的安装包。

下载:http://www.oracle.com/technetwork/database/10201linx8664soft-092456.html

注意:Oracle10g Companion包也要下载。

Oracle Database10g详细安装过程,请参考官方档。

1.DB包安装时,选择只安装DB软件即可,如下:

Page 8: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang8

2.Companion包安装时,选择第二项,如下:

注:如果

Page 9: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang9

Regedit Cust Application

在EBS-R12中注册客制化应用

1.自定义三个表空间,CUX_DATA存放数据,CUX_INDEX存入索引,CUX_TEMP临时表空间

create tablespace CUX_DATA datafile '/opt/oracle/VIS/db/apps_st/data/cux_data01.dbf'

size 200M reuse

autoextend on next 100M;

create tablespace CUX_INDEX datafile

'/opt/oracle/VIS/db/apps_st/data/cux_index01.dbf' size 200M reuse

autoextend on next 100M;

create temporary tablespace CUX_TEMP tempfile

'/opt/oracle/VIS/db/apps_st/data/cux_temp01.dbf' size 100m;

2.创建客制化应用

操作路径:Application Developer=>Application=>Register

3. 创建客制化应用目录

登录EBS应用层,在$APPL_TOP下创建客制化应用目录。其中CUX要和上面的客制化简称CUX匹配。

cd $APPL_TOP

mkdir cux

cd cux

mkdir 12.0.0

cd 12.0.0

mkdir package

mkdir sql

mkdir setup

mkdir wf

cd wf

mkdir US

mkdir ZHS

cd ..

mkdir bin

mkdir reports

cd reports

mkdir US

mkdir ZHS

Page 10: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang10

cd ..

mkdir out

mkdir mesg

mkdir log

mkdir html

cd html

mkdir US

mkdir ZHS

cd ..

mkdir lib

mkdir forms

cd forms

mkdir US

mkdir ZHS

cd ..

mkdir admin

ls

4 注册CUX_TOP目录

4.1 添加CUX_TOP目录

查看$APPL_TOP目录下的$CONTEXT_NAME.env,根据CONTEXT_FILE指向的路径来查找。如:

CONTEXT_FILE="/opt/oracle/VIS/inst/apps/VIS_ebs12/appl/admin/VIS_ebs12.xml"

export CONTEXT_FILE

修改VIS_ebs12.xml文件:

[appltest@ebs ~]$ cd $INST_TOP/appl/admin

[appltest@ebs ~]$ vi $CONTEXT_NAME.xml

在$CONTEXT_NAME.xml文件的AU_TOP后加入:

<CUX_TOP oa_var="s_cuxtop" oa_type="PROD_TOP"

oa_enabled="FALSE">/opt/oracle/VIS/apps/apps_st/appl/cux/12.0.0</CUX_TOP>

注:具体的规则语法可参考AU_TOP。

4.2配置.bash_profile,加入以下内容

CUX_TOP=/opt/oracle/VIS/apps/apps_st/appl/cux/12.0.0

export CUX_TOP

5. 注册Oracle用户

5.1.创建客制化用户并授权

create user cux identified by cux default tablespace CUX_DATA

temporary tablespace CUX_TEMP;

Page 11: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang11

grant resource to cux;

grant connect to cux;

grant create table to cux;

--grant drop any table to cux;

grant create view to cux;

--grant drop any view to cux;

grant create package to cux;

--grant DROP ANY PROCEDURE to cux;

grant create synonym to cux;

--grant drop any synonym to cux;

grant create sequence to cux;

--grant drop any sequence to cux;

5.2 注册Oracle用户

操作路径:System Administrator=>Security=>ORACLE=>Register

7. 定义数据组

操作路径:System Administrator=>Security=>ORACLE=>Datagroup

8. 定义客制化应用日志

操作路径:Alert Manager=>System=>Installations

Page 12: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang12

9.运行APPS_DDL

[appltest@ebs ~]$ sqlplus apps/apps

SQL> @$AD_TOP/admin/sql/adaaddls.pls system_pword custom_schema

custom_schema_pword

SQL> @$AD_TOP/admin/sql/adaaddlb.pls system_pword custom_schema

custom_schema_pword

10.配置完后,重启用EBS应用层服务。

[appltest@ebs ~]$ cd $INST_TOP/admin/scripts

[appltest@ebs ~]$ sh adstpall.sh apps/apps

[appltest@ebs ~]$ sh adstpall.sh apps/apps

11.注册Form、Function、Menu、Reponsibility,打开Form时出错:

解决:参考Metalink 553014.1

修改$INST_TOP/ora/10.1.2/forms/server/default.env文件

[appltest@ebs ~]$ vi $INST_TOP/ora/10.1.2/forms/server/default.env

在AU_TOP后面加入以下内容:

CUX_TOP=/opt/oracle/VIS/apps/apps_st/appl/cux/12.0.0

EBS Startup

Database Startup

EBS-R12.0.4及以前版本,绑定的数据库的Oracle Database10g。EBS-R12.1.1及以后的版本,绑

定的数据库的Oracle Database11g

一、可以使用Oracle通用命令来启动。

启动监听器:

[oratest@ebs ~]$ lsnrctl start

启动数据库:

[oratest@ebs ~]$ sqlplus ‘/as sysdba’

SQL>startup

Page 13: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang13

二、也可以使用EBS的脚本来启动。

[oratest@ebs ~]$ cd $ORACLE_HOME/appsutil/scripts/$CONTEXT_NAME

[oratest@ebs ~]$ sh addbctl.sh start

Apllication Startup

1.EBS-R12应用层的启动脚本命令与11i有些区别,并且脚本的存放目录也不同了。

11i启动脚本目录 :

$COMMON_TOP/admin/scripts/$CONTEXT_NAME

R12启动脚本目录 :

$ADMIN_SCRIPTS_HOME

错误一:数据库已正常启动,启动时应用时报错:

Database connection could not be established.Either the database is down or the APPS

credentials supplied are wrong

解决:

查看$ADMIN_SCRIPTS_HOME目录下的sqlnet.log日志文件。

如果没有异常,则有可能是数据库是通过动态监听,需要一定时间的延迟(在VM下,甚至会延

迟10多分钟)。

另外可能尝试一下远程能否连接数据库,然后先运行关闭应用脚本,再运行启动脚本。

错误二:应用启动成功后,访问时报错

500 Internal Server Error

Servlet error: An exception occurred. The current application deployment descriptors do not

allow for including it in this response. Please consult the application log for details

Page 14: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang14

APPS Maintenance Chapter

EBS Clone

EBS Clone应该算得上是DBA最经常干的活之一啦。EBS Clone可分为五个步骤:

在DB层执行预clone: perl adpreclone.pl dbTier

在APP层执行预clone:perl adpreclone.pl appsTier

关闭APP层、DB层及复制APP层、DB层目录

在DB层执行clone: perl ./adcfgclone.pl dbTier

在APP层执行clone:perl ./adcfgclone.pl appsTier

AutoConfig

修改EBS应用层的主机IP地址,导致无法正常启动。

Solution

1 - Be sure to have a valid Backup

2 - open a new shell and set your apps environment

3 - cd <ADMIN_SCRIPTS_HOME>

4 - adopmnctl.sh stop or adopmnctl.cmd stop for windows

5 - check if it is really down: ps -ef | grep <USER> grep opm for windows check if all java.exeprocesses are gone.

6 - delete the following:

rm -fr $INST_TOP/ora/10.1.3/j2ee/oacore/persistence/*

rm -fr $INST_TOP/ora/10.1.3/j2ee/oafm/persistence/*

rm -fr $INST_TOP/ora/10.1.3/j2ee/forms/persistence/*

7 - execute autoconfig at the Application Tier

cd $ADMIN_SCRIPTS_HOME

sh adautocfg.sh

8 - start all Applications Services

9 - check if the issue has been resolved: adapcctl.sh status or for windows adapcctl.cmd status

Page 15: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang15

EBS Patch

Apply Chinese Patch

应用EBS中文语言补丁

1.勾选中文的License支持。以sysadmin登录系统 。

操作路径:System Administration=>Workflow=>Oracle Applications Manager=>WorkflowManager

勾选“Simple Chinese”。

设置完成,点击“Submit”。

2.关闭应用层(注:保持数据库启动状态)。

Page 16: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang16

[appltest@ebs ~]$ cd $INST_TOP/admin/scripts

[appltest@ebs ~]$ sh adstpall.sh apps/apps

3.打开EBS维护模式

[appltest@ebs ~]$ unset LANG

[appltest@ebs ~]$ adadmin

3.1.报错:

adadmin: error while loading shared libraries: libclntsh.so.10.1: cannot open shared object

file: No such file or directory

解决:在设置应用层用户的环境变量时,要注意$APPL_TOP目录下有两个环境变量文件。要加

入APPS$CONTEXT_NAME.env,而不是$CONTEXT_NAME.env

修改应用层的环境变量文件,加入

. /opt/oracle/VIS/apps/apps_st/appl/APPSVIS_ebs.env

然后更新环境变量文件:source .bash_profile

3.2再次执行adadmin,会要求输入一些参数,保持默认即可。

注:要求输入SYSTEM的口令时,请输入manager。要求输入APPS口令时,请输入apps。

4.接着会出现如下界面:

Page 17: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang17

按以下顺序选择,打开维护模式:

[5. Change Maintenance Mode] => [1. Enable Maintenance Mode]

执行完成后,返回主菜单。

5.维护多语言表。

按以下顺序,打开维护多语言表:

[4. Maintain Applications Database Entities menu] => [3. Maintain Muti-Lingual Tables]

注:期间会要求输入一些参数,保持默认即可。接着就漫长的等待啦。

维护多语言表结束后,一路回车,退出ADADMIN命令。

6.解压中文语言包,如:/opt/setup/6678700_ZHS

[appltest@ebs ~]$ cd /opt/setup/6678700_ZHS

[appltest@ebs ~]$ unset LANG

[appltest@ebs ~]$ adpatch

注:期间会要求输入一些参数,可根据情况作适当的输入。以下参数要输入,其他的默认就可。

要求你输入SYSTEM的口令时,请输入manager。

要求你输入APPS口令时,请输入apps。

要求输入patch文件(AutoPatch driver file)时,请输入u6678700.drv。

要求输入Worker个数时,请按照硬件的实际情况作输入,我输入了8。

然后adpatch将进行漫长的编译工作。花了将近12个小时。

Page 18: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang18

6.1运行到剩下22job时,出现错误:

FAILED: file XLIFFLoader.class on worker 6 for product xdo username XDO.

ATTENTION: All workers either have failed or are waiting:

FAILED: file XLIFFLoader.class on worker 6.

ATTENTION: Please fix the above failed worker(s) so the manager can continue

解决:运行补丁控制命令adctrl,查看work的工作状态。

[appltest@ebs ~]$ adctrl

注:期间会要求输入一些参数,保持默认即可。要求输入apps密码,输入apps。

按以下顺序选择,查看补丁的工作状态:

[1. Show worker status]

返回主菜单,然后按以下顺序选择,重启work6,

[1. Tell worker to restart a failed job ]

输入重启的work编号:6

6.2重启job6后,依旧报上述报错。Adctrl工具有一个隐藏选项8,可以忽略失败的job。

a.返回主菜单,输入8,然后输入6(失败的job编号)。

b.返回主菜单,查看失败的JOB状态变成了“Skip& restart”。

虽然不知道是什么问题造成的,但补丁的应用总算恢复继续进行啦。

7.修改字符集

EBS-R12.1.1及以后的版本,已经不用修改了。但R12.0.4及以前的版本,必须得修改。

8.快照更新(snap upate)

Page 19: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang19

所谓快照更新,就是维护文件最近版本的view。一般在应用Patch后,都建议更新一下。

再次运行adadmin命令

[appltest@ebs ~]$ unset LANG

[appltest@ebs ~]$ adadmin

按以下顺序选择,更新快照:

[2.Maintain Applications Files menu] => [4.Maintain snapshot information] => [2.Update

current view snapshot] => [ 1.Update Complete APPL_TOP]

然后又是漫长的等待。差不多1.5小时。更新完成后,退出adadmin。

9.关闭维护模式

应用补丁后,必须关闭维护模式,否则无法正常启动EBS应用层。

运行adadmin命令

[appltest@ebs ~]$ unset LANG

[appltest@ebs ~]$ adadmin

按以下顺序选择,关闭维护模式。

[5. Change Maintenance Mode]→ [2. Disable Maintenance Mode]

10.启动EBS应用层。

[appltest@ebs ~]$ cd $INST_TOP/admin/scripts

[appltest@ebs ~]$ sh adstrtal.sh apps/apps

终于可以看到应用中文补丁的效果啦。

Apply TS Patch

应用完成EBS中文语言补丁后,还有很多模块尚未翻译。还必应用同期翻译补丁(Translation

Synchonization Patches)

Patch Wizard Utility [Document 976188.1]Patch Wizard FAQ [Document 976688.1]Patch Wizard : Overview [Document 1077813.1

查看metalink文档:[ID 252422.1]

查找最新的TS补丁:https://updates.oracle.com/TransSync

Page 20: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang20

Password

Acquired Pwd of Apps

Oracle EBS用户加密算法是以数据库apps密码作为加密种子。

1.创建Package

CREATE OR REPLACE PACKAGE CUX_OBTAIN_PWD AUTHID CURRENT_USER

AS

FUNCTION getpwd (orauser IN VARCHAR2, appuserpwd IN VARCHAR2) RETURN

VARCHAR2;

FUNCTION encrypt (orauser IN VARCHAR2, appuserpwd IN VARCHAR2) RETURN

VARCHAR2;

END CUX_OBTAIN_PWD;

CREATE OR REPLACE PACKAGE BODY CUX_OBTAIN_PWD

AS

FUNCTION getpwd (orauser IN VARCHAR2, appuserpwd IN VARCHAR2)

RETURN VARCHAR2

AS LANGUAGE JAVA NAME

'oracle.apps.fnd.security.WebSessionManagerProc.decrypt(java.lang.String,java.lang.String)

return java.lang.String';

FUNCTION encrypt (orauser IN VARCHAR2, appuserpwd IN VARCHAR2)

RETURN VARCHAR2

AS LANGUAGE JAVA NAME

'oracle.apps.fnd.security.WebSessionManagerProc.encrypt(java.lang.String,java.lang.String)

return java.lang.String';

END CUX_OBTAIN_PWD;

2.查询fnd_user表用户加密后的密文

select fu.user_name,fu.encrypted_user_password from fnd_user fu where

fu.user_name='SYSADMIN'

3.用密文解密出明文密码

DECLARE

v_encrypted_pwd VARCHAR2 (100);

v_apps_pwd VARCHAR2 (100);

v_user_pwd VARCHAR (100);

BEGIN

Page 21: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang21

v_encrypted_pwd :

='ZGE792404355D2AE23DB96485B7D40FF5B8ADB184A5F9FAEFF006A213BD571D48FF3789

C11B141A4213DF6D7E6B06C612461';

IF v_apps_pwd IS NULL

THEN

v_apps_pwd := 'APPS';--ORACLE是用apps用户密码,用于EBS用户密码的密钥(EBS采用对称

加密)

END IF;

v_user_pwd := CUX_OBTAIN_PWD.getpwd (v_apps_pwd, v_encrypted_pwd);

DBMS_OUTPUT.put_line (v_user_pwd);

END;

4.通过EBS用户/密码获取APPS密码

DECLARE

guestUserPwd VARCHAR2(200);

guestUserName VARCHAR2(100);

guestFndPwd VARCHAR2(100);

guestEncFndPwd VARCHAR2(100);

delim NUMBER;

BEGIN

guestUserPwd := 'GUEST/ORACLE'; --You can any ebs user password

IF guestUserPwd IS NULL THEN

guestUserPwd := UPPER(fnd_profile.value('GUEST_USER_PWD'));

END IF;

delim := INSTR(guestUserPwd, '/');

guestUserName := UPPER(SUBSTR(guestUserPwd, 1, delim - 1));

SELECT encrypted_foundation_password

INTO guestEncFndPwd

FROM fnd_user_view

WHERE user_name = guestUserName

AND (start_date <= SYSDATE)

AND (end_date IS NULL OR end_date > SYSDATE);

guestFndPwd := CUX_OBTAIN_PWD.getpwd(guestUserPwd, guestEncFndPwd);

IF NOT (guestFndPwd IS NULL) THEN

DBMS_OUTPUT.put_line(guestFndPwd);

END IF;

END;

Maintenace

EBS CGI Login

EBS R12默认状态下是不允许CGI方式登陆。

Page 22: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang22

http://ebs12.jarwang.com:8000/forms/frmservlet

解决:

1)复制$APPL_TOP/fnd/12.0.0/secure目录下template.dbc文件。

[appltest@ebs ~]$ cd $APPL_TOP/fnd/12.0.0/secure

[appltest@ebs ~]$ cp template.dbc $ORACLE_SID.dbc

修改$ORACLE_SID.dbc:

DB_HOST=ebs12.jarwang.com

DB_PORT=1521

DB_NAME=VIS

2)查看当前的连接方式

[appltest@ebs ~]$ . /$APPL_TOP/$CONTEXT_NAME.env

[appltest@ebs ~]$ cd $APPL_TOP/fnd/12.0.0/secure

[appltest@ebs ~]$ java oracle.apps.fnd.security.AdminAppServer apps/apps STATUS

DBC=$ORACLE_SID.dbc

提示信息如下:

Database Server

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

DATABASE_ID: VIS

AUTHENTICATION: SECURE

Application Server

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

APPL_SERVER_STATUS: INVALID

APPL_SERVER_ID: null

3)开放CGI连接方式

Page 23: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang23

[appltest@ebs ~]$ java oracle.apps.fnd.security.AdminAppServer apps/apps

AUTHENTICATION OFF DBC=$ORACLE_SID.dbc

提示信息:

AUTHENTICATION OFF executed successfully - VIS.dbc

4)再次查看当前的连接方式

[appltest@ebs ~]$ java oracle.apps.fnd.security.AdminAppServer apps/apps STATUS

DBC=$ORACLE_SID.dbc

提示信息如下:

Database Server

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

DATABASE_ID: VIS

AUTHENTICATION: OFF

Application Server

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

APPL_SERVER_STATUS: INVALID

APPL_SERVER_ID: null

至此,如果成功的出现了AUTHENTICATION: OFF的信息,说明现在已经开放了CGI方式。

但值得注意的是,这样做并不安全,所以Oracle建议,在适当的时候通过以下命令来恢复先前的

设定:

[appltest@ebs ~]$ java oracle.apps.fnd.security.AdminAppServer apps/apps

AUTHENTICATION SECURE DBC=$ORACLE_SID.dbc

并发服务无效

EBS R12中提交请求都处于无效状态。

解决:重启并发

sh adcmctl.sh stop apps/apps

sh adcmctl.sh start apps/apps

Export File Failure

错误:任意Form的界面,执行菜单上的导出按钮,无法导出文件。长按“CTRL”键也不行。

Page 24: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang24

方法一:

System administrator=>OAM

方法二:

1.查询:

select count(*) from apps.FND_LOBS a where A.PROGRAM_NAME='export'

2.添加请求

操作路径:System Administrator=>Security=>Responsibility=>Request

添加请求:Purge Obsolete Generic File Manager Data

3.运行请求:

Page 25: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang25

运行完请求后,如仍不能导出。请查看一下表空间是否已满。

APP-FND-01926

登陆任一Form,均报错:APP-FND-01926

解决:查看MO: Set Client_Info for Debugging配置文件是否为“Y”

SELECT tl.user_profile_option_name,va.profile_option_value

FROM FND_PROFILE_OPTIONS_TL TL,

FND_PROFILE_OPTIONS OP,

FND_PROFILE_OPTION_VALUES VA

WHERE TL.PROFILE_OPTION_NAME = OP.PROFILE_OPTION_NAME

AND VA.PROFILE_OPTION_ID = OP.PROFILE_OPTION_ID

AND tl.user_profile_option_name='MO: Set Client_Info for Debugging'

如果为“Y”,修改为空。

update FND_PROFILE_OPTION_VALUES va

set va.profile_option_value = null

where va.profile_option_id =

Page 26: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang26

(select va.profile_option_id

FROM FND_PROFILE_OPTIONS_TL TL,

FND_PROFILE_OPTIONS OP,

FND_PROFILE_OPTION_VALUES VA

WHERE TL.PROFILE_OPTION_NAME = OP.PROFILE_OPTION_NAME

AND VA.PROFILE_OPTION_ID = OP.PROFILE_OPTION_ID

AND tl.user_profile_option_name =

'MO: Set Client_Info for Debugging')

R12 Log

R12日志路径:

1.启动&关闭服务之日志:$INST_TOP /logs/appl/admin/log

2.并发服务之日志:$INST_TOP/logs/appl/conc/log

3.并发服务之输出:$INST_TOP/logs/appl/conc/out

4.OC4J配置文件:$INST_TOP/ora/10.1.3/j2ee/oacore/config/oc4j.properties

5.Java类中输出内容(如:java.output.println):$INST_TOP/logs/ora/10.1.3/opmn/oacore_default_group_1/oacorestd.out

Optimize

EBS应用层调优,大部份是基于Java,所以必须具备扎实的JVM知识。

Adjust JVM

参考文件Metalink:362851 – Guidelines to setup the JVM in Apps Ebusiness Suite 11i and R12.

如:在R12上做压力测试时,报500内部错误。

1.查看日志:$INST_TOP/logs/ora/10.1.3/opmn/oacore_default_group_1/oacorestd.err

11/07/25 16:16:47 java.lang.OutOfMemoryError: GC overhead limit exceeded

11/07/25 16:16:47 [Jul 25, 2011 4:15:35 PM

EDT]:1311624935696:-1:-1:crp2.shenzhenair.com:10.10.65.109:oacore.default_group.1:1384386437:-

1:-1:ANONYMOUS(-1):-1:Thread[AJPRequestHandler-HTTPThreadGroup-52,5,HTTPThreadGr

oup]:1311624680:10.10.65.109:12732:0:24:UNEXPECTED:[fnd.framework.OAException]:Applicati

Page 27: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang27

on: FND, Message Name: FND_GENERIC_MESSAGE. Tokens: MESSAGE =

oracle.apps.fnd.common.AppsException: oracle.apps.fnd.common.PoolException: Exception

creating newPoolable object.;

2.查询OC4J JVM内存的最大设置。

[applcrp2@crp2 conf]$ uname -a

Linux crp2.shenzhenair.com 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64

x86_64 x86_64 GNU/Linux

[applcrp2@crp2 conf]$ java -mx4096m -version

Invalid maximum heap size: -Xmx4096m

The specified size exceeds the maximum representable size.

Could not create the Java virtual machine.

[applcrp2@crp2 conf]$ java -mx3072m -version

java version "1.6.0_10"

Java(TM) SE Runtime Environment (build 1.6.0_10-b33)

Java HotSpot(TM) Server VM (build 11.0-b15, mixed mode)

3. Steps to change the heap size.

修改$ORA_CONFIG_HOME/10.1.3/opmn/conf/opmn.xml文件,修改红色内容

<process-type id="oacore" module-id="OC4J" status="enabled"

working-dir="$ORACLE_HOME/j2ee/home">

<module-data>

<category id="start-parameters">

<data id="java-options" value="-server -verbose:gc –Xmx2048M –Xms512M

-XX:MaxPermSize=360M -XX:NewRatio=2 -XX:+PrintGCTimeStamps -XX:+UseTLAB

-XX:+UseParallelGC -XX:ParallelGCThreads=2 -Dcom.sun.management.jmxremote

-Djava.security.policy=$ORACLE_HOME/j2ee/oacore/config/java2.policy

-Djava.awt.headless=true -Dhttp.webdir.enable=false

-Doracle.security.jazn.config=/oracle/crp2/inst/apps/CRP2_crp2/ora/10.1.3/j2ee/oacore/c

onfig/jazn.xml -Dhttp.cookie.ignoreCommaInCookiesNamed=X_NoMatchingCookies"/>

<data id="java-bin"

value="/oracle/crp2/inst/apps/CRP2_crp2/admin/scripts/java.sh"/>

<data id="oc4j-options" value="-out

/oracle/crp2/inst/apps/CRP2_crp2/logs/ora/10.1.3/opmn/oacorestd.out -err

/oracle/crp2/inst/apps/CRP2_crp2/logs/ora/10.1.3/opmn/oacorestd.err"/>

</category>

<category id="stop-parameters">

<data id="java-options" value="-server -verbose:gc -Xmx512M -Xms128M

-XX:MaxPermSize=160M -XX:NewRatio=2 -XX:+PrintGCTimeStamps -XX:+UseTLAB

-XX:+UseParallelGC -XX:ParallelGCThreads=2

-Djava.security.policy=$ORACLE_HOME/j2ee/oacore/config/java2.policy

-Djava.awt.headless=true -Dhttp.webdir.enable=false"/>

Page 28: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang28

</category>

<category id="security-parameters">

<data id="wallet-file"

value="file:/oracle/crp2/inst/apps/CRP2_crp2/certs/Apache"/>

</category>

</module-data>

<start timeout="600" retry="2"/>

<stop timeout="120"/>

<restart timeout="720" retry="2"/>

<port id="default-web-site" range="21650-21654" protocol="ajp"/>

<port id="rmi" range="20150-20154"/>

<port id="jms" range="23150-23154"/>

<process-set id="default_group" numprocs="1"/>

</process-type>

3.1. The default value for Maximum (-Xmx) and Minimum (-Xms) heap sizes are 512M and

128M respectively.

3.2. opmn.xml also contains jvm configurations for other components – oafm & forms.

4.修改oc4j .properties

[applcrp2@crp2 conf]$ cd $INST_TOP/ora/10.1.3/j2ee/oacore/config

[applcrp2@crp2 config]$ vi oc4j.properties

加入

wrapper.bin.parameters=-Xms[Value]M -Xmx[Value]M -XX:NewSize=256M

-XX:MaxNewSize=256M

5. Edit Applications Context file

[applcrp2@crp2 config]$ cd $INST_TOP/appl/admin/

[applcrp2@crp2 config]$ vi $CONTEXT_FILE

修改以下红字部分

<oacore_jvm_start_options oa_var="s_oacore_jvm_start_options">-server -verbose:gc

-Xmx2048M -Xms512M -XX:MaxPermSize=360M -XX:NewRatio=2 -XX:+PrintGCTimeStamps

-XX:+UseTLAB -XX:+UseParallelGC -XX:ParallelGCThreads=2

-Dcom.sun.management.jmxremote

-Djava.security.policy=$ORACLE_HOME/j2ee/oacore/config/java2.policy

-Djava.awt.headless=true -Dhttp.webdir.enable=false

-Doracle.security.jazn.config=/oracle/crp2/inst/apps/CRP2_crp2/ora/10.1.3/j2ee/oacore/c

onfig/jazn.xml</oacore_jvm_start_options>

6.重启OPMN服务

cd $ADMIN_SCRIPTS_HOME

Page 29: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang29

sh adopmnctl.sh stop

sh adopmnctl.sh start

7.如果仍然报此错误,就说明机器的CPU不行啦。或者禁用-XX:-UseGCOverheadLimit

This message means that for some reason the garbage collector is taking an excessive amount

of time (by default 98% of all CPU time of the process) and recovers very little memory in

each run (by default 2% of the heap).

This effectively means that your program stops doing any progress and is busy running only

the garbage collection at all time.

You can turn this off with the command line option -XX:-UseGCOverheadLimit

Page 30: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang30

DatabaseMaitenance Chapter

Setup

Oracle10g For OEL5.5

一、操作系统:Oracle Enterprise Linux Server release5.5

操作系统下载:http://edelivery.oracle.com/linux (Oracle10g是支持rhel5,有官方文档可参考)

Oracle Linux是基于Redhat Linux。因此Oracle Linux与Redhat Linux的安装是基本是相同的。

安装时从英文界面安装,然后选择安装中文,并将开发工具勾选上。具体的安装步骤就略啦。

Linux的分区如下:分区的原则是主分区与扩展分区应按顺序排列。

/boot 100M ------主分区

/ 20G ------主分区

/swap 2G ------主分区

/tmp 3G ------扩展分区

/opt 150G------扩展分区

/backup 100G------扩展分区

二、数据库:Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise Edition for Linux x86-64

数据库下载:http://www.oracle.com/technetwork/database/10201linx8664soft-092456.html

安装文档:http://download.oracle.com/docs/cd/B19306_01/relnotes.102/b15666.pdf

说明:Oracle文档中PDF往往更新比较慢,但会比较完整。所以要将PDF、HTML结合起来参考。

2.1检查以下软件包是否安装

binutils-2.17.50.0.6-14.el5.x86_64.rpm

compat-db-4.2.52-5.1.x86_64.rpm

compat-gcc-34-3.4.6-4.x86_64.rpm

compat-gcc-34-c++-3.4.6-4.x86_64.rpm

compat-libstdc++-296-2.96-138.i386.rpm

compat-libstdc++-33-3.2.3-61.i386.rpm

compat-libstdc++-33-3.2.3-61.x86_64.rpm

gcc-4.1.2-48.el5.x86_64.rpm

gcc-c++-4.1.2-48.el5.x86_64.rpm

glibc-2.5-49.i686.rpm

glibc-2.5-49.x86_64.rpm

glibc-common-2.5-49.x86_64.rpm

glibc-devel-2.5-49.i386.rpm

glibc-devel-2.5-49.x86_64.rpm

glibc-headers-2.5-49.x86_64.rpm

Page 31: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang31

libaio-0.3.106-5.x86_64.rpm

libaio-devel-0.3.106-5.x86_64.rpm

libgcc-4.1.2-48.el5.i386.rpm

libgcc-4.1.2-48.el5.x86_64.rpm

libgomp-4.4.0-6.el5.x86_64.rpm

libstdc++-4.1.2-48.el5.x86_64.rpm

libstdc++-devel-4.1.2-48.el5.x86_64.rpm

libXp-1.0.0-8.1.el5.i386.rpm

libXt-1.0.2-3.2.el5.i386.rpm

libXtst-1.0.1-3.1.i386.rpm

make-3.81-3.el5.x86_64.rpm

numactl-devel-0.9.8-11.el5.x86_64.rpm

sysstat-7.0.2-3.el5.x86_64.rpm

批量安装上述rpm包

rpm -Uvh *.rpm --aid

2.2配置Linux网络

配置好Linux网络,然后执行

# cat /etc/hosts | grep `eval hostname`

应当返回类似信息:192.168.100.16 myhost.us.mycompany.com myhost

如不正确,请检查/etc/hosts与/etc/sysconfig/network文件的配置是否正确。注意修改hostname要重启Linux

2.3创建Oracle安装用户组

检查Oracle安装存储文件是否存在

# more /etc/oraInst.loc

如果上述文件不存在,则执行

# /usr/sbin/groupadd oinstall

创建DBA用户组

# /usr/sbin/groupadd dba

创建ORACLE用户

# /usr/sbin/useradd -g oinstall -G dba oracle

修改oracle用户密码

# passwd oracle

检查nobody用户是否存在

# id nobody

2.4配置Linux内核参数

修改/etc/sysctl.conf文件,添加入以下红色内容

kernel.shmall = 2097152

Page 32: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang32

kernel.shmmax = 2147483648

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

fs.file-max = 65536

net.ipv4.ip_local_port_range = 1024 65000

net.core.rmem_default = 262144

net.core.rmem_max = 262144

net.core.wmem_default = 262144

net.core.wmem_max = 262144

执行/sbin/sysctl –p刷新内核参数值

# /sbin/sysctl -p

2.5提高oracle用户shell权限

修改/etc/security/limits.conf文件,添加以下内容:

oracle soft nproc 2047

oracle hard nproc 16384

oracle soft nofile 1024

oracle hard nofile 65536

修改/etc/pam.d/login文件,添加以下内容:

session required pam_limits.so

修改/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

2.6创建oracle相关目录

创建ORACLE_BASE目录

# mkdir -p /opt/oasale/app/oracle

# chown -R oracle:oinstall /opt/oasale/app/oracle

# chmod -R 775 /opt/oasale/app/oracle

创建ORACLE数据库存储目录

# mkdir -p /opt/oasale/oradata

# chown oracle:oinstall /opt/oasale/oradata

# chmod 775 /opt/oasale/oradata

创建ORACLE闪回日记存储目录

Page 33: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang33

# mkdir -p /opt/oasale/flash_recovery_area

# chown oracle:oinstall /opt/oasale/flash_recovery_area

# chmod 775 /opt/oasale/flash_recovery_area

2.7配置远程安装Oracle

控制XServer的访问权限(必须以图形界面登陆)

如果是本地登陆,则执行(可以是字符界面登陆)

# xhost +

Access control disabled,client can connect from any host

如果是远程登陆,则执行

# xhost 192.168.211.232

192.168.211.232 being add to access control list

# DISPLAY=192.168.211.232:0.0;export DISPLAY

#说明:192.168.211.232为远程连接服务的客户端IP

2.8配置oracle用户环境变量

切换至oracle用户,执行

# su – oracle

$ echo $SHELL

修改.bash_profile,依次添加以下内容:

2.8.1指定tmp变量,tmpe目录至少要有400MB

TMP=/tmp; export TMP

TMPDIR=$TMP; export TMPDIR

2.8.2指定ORACLE_BASE、ORACLE_HOME、ORACLE_SID、ORACLE_DATA变量

ORACLE_BASE=/opt/oasale/app/oracle;export ORACLE_BASE

ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_2;export ORACLE_HOME

ORACLE_SID=oasale;export ORACLE_SID

ORACLE_DATA=/opt/oasale/oradata

2.8.3设置oracle用户文件和目录的文件创建缺省屏蔽值

umask 022

说明:umask设置用户文件和目录的文件创建缺省屏蔽值,若将此命令放入profile文件,就可控

制该用户后续所建文件的存取许可。它告诉系统在创建文件时不给谁存取许可。linux的umask值是022,这样就可以防止同属于该组的其它用户及别的组的用户修改该用户的文件。

2.8.4设置oracle执行环境变量

PATH=$ORACLE_HOME/bin:usr/sbin:$PATH;export PATH

CLASSPATH=$ORACLE_HOME/jre;export CLASSPATH

NLS_LANG=american_america.ZHS16GBK;export NLS_LANG

#LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH

#LD_ASSUME_KERNEL=2.4.19;export LD_ASSUME_KERNEL

Page 34: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang34

说明:LD_ASSUME_KERNEL是指设置LINUX对线程的支持。可以通过以下命令查看具体的版

本号:getconf GNU_LIBPTHREAD_VERSION

2.9解压oracle安装程序

解压.gz文件

$ gunzip 10201_database_linux_x86_64.cpio.gz

提取安装文件

$ cpio -idmv < 10201_database_linux_x86_64.cpio

3.以图形界面安装Oracle

修改操作系统的版本标识(Oracle10g刚发布时, rhel5还没出来呢。当然现在是支持rhel5的)

$su – root

修改 /etc/enterprise-release

Enterprise Release Enterprise Linux server release 4

修改/etc/redhat-release

Red Hat Enterprise Linux server release 4

以图形界面登陆Linux(偶用是基于ssh的xwinlogon,当然用vnc也是可以的)

#su – oracle

$ DISPLAY=192.168.211.232:0.0;export DISPLAY

$ ./runInstaller

选择Advanced Installation

Page 35: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang35

选择Enterprise Edition,同时选择English、Simplified Chinese两种语言

选择Install database Software only

切到root用户下执行

Page 36: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang36

4.以图形界面创建Oracle数据库

#su – oracle

$ dbca

选择Create a Database

Page 37: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang37

输入全局数据库名、SID

启用企业管理器

使用文件系统

指定闪回日志目录

Page 38: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang38

最为关键是指定数据库的字符集。

修改数据文件的存储目录

控制文件、数据文件、日志文件都要修改。

Page 39: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang39

Oracle11g For RHEL5.5 Using Silent

一.操作系统:RHEL5.5 64bit

二.数据库:Oracle Database 11g R2 64bit

下载:http://www.oracle.com/pls/db112/homepage

安装文档:http://download.oracle.com/docs/cd/E11882_01/install.112/e16763.pdf

1.安装必要的软件包

rpm -q binutils-2.17.50.0.6

rpm -q compat-libstdc++-33-3.2.3

rpm -q compat-libstdc++-33-3.2.3 (32 bit)

rpm -q elfutils-libelf-0.125

rpm -q elfutils-libelf-devel-0.125

rpm -q gcc-4.1.2

Page 40: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang40

rpm -q gcc-c++-4.1.2

rpm -q glibc-2.5-24

rpm -q glibc-2.5-24 (32 bit)

rpm -q glibc-common-2.5

rpm -q glibc-devel-2.5

rpm -q glibc-devel-2.5 (32 bit)

rpm -q glibc-headers-2.5

rpm -q ksh-20060214

rpm -q libaio-0.3.106

rpm -q libaio-0.3.106 (32 bit)

rpm -q libaio-devel-0.3.106

rpm -q libaio-devel-0.3.106 (32 bit)

rpm -q libgcc-4.1.2

rpm -q libgcc-4.1.2 (32 bit)

rpm -q libstdc++-4.1.2

rpm -q libstdc++-4.1.2 (32 bit)

rpm -q libstdc++-devel 4.1.2

rpm -q make-3.81

rpm -q numactl-devel-0.9.8.x86_64

rpm -q sysstat-7.0.2

注:红色一般情况下没有默认安装的。

批量安装上述rpm包

rpm -Uvh *.rpm --aid

2.创建用户及用户组

检查Oracle安装存储文件是否存在

# more /etc/oraInst.loc

如果上述文件不存在,则执行

# /usr/sbin/groupadd oinstall

创建DBA用户组

# /usr/sbin/groupadd dba

创建ORACLE用户

# /usr/sbin/useradd -g oinstall -G dba oracle

修改oracle用户密码

# passwd oracle

检查nobody用户是否存在

# id nobody

2.修改内核参数

# vi /etc/sysctl.conf

Page 41: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang41

如下:

fs.aio-max-nr = 1048576

fs.file-max = 6815744

kernel.shmall = 2097152

kernel.shmmax = 536870912

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

net.ipv4.ip_local_port_range = 9000 65500

net.core.rmem_default = 262144

net.core.rmem_max = 4194304

net.core.wmem_default = 262144

net.core.wmem_max = 1048586

注:红色字体的一般不用修改,因RHEL5.5默认值比这个更大。

刷新内核参数:/sbin/sysctl -p

3.修改资源限制参数文件

# vi /etc/security/limits.conf

如下:

oracle soft nproc 2047

oracle hard nproc 16384

oracle soft nofile 1024

oracle hard nofile 65536

oracle soft stack 10240

4.创建oracle安装目录

# mkdir -p /opt/oracle/

# mkdir –p /opt/oracle/product/11.2.0/db_2

# chown -R oracle:oinstall /opt/oracle/

# chmod -R 775 /opt/oracle/

5.修改.bash_profile文件

# su - oracle

[oracle@db11g ~]$ vi .bash_profile

加入以下内容

ORACLE_BASE=/opt/oracle

ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_2

ORACLE_SID=dev

PATH=$ORACLE_HOME/bin:usr/sbin:$PATH;export PATH

CLASSPATH=$ORACLE_HOME/jre;export CLASSPATH

NLS_LANG=american_america.ZHS16GBK;export NLS_LANG

export ORACLE_BASE ORACLE_SID ORACLE_HOME PATH CLASSPATH NLS_LANG

6.配置远程安装Oracle

Page 42: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang42

控制XServer的访问权限(必须以图形界面登陆)

如果是本地登陆,则执行

[oracle@db11g ~]$ xhost +

Access control disabled,client can connect from any host

如果是远程登陆,则执行(可以是字符界面登陆)

[oracle@db11g ~]$ xhost 192.168.211.232

192.168.211.232 being add to access control list

[oracle@db11g ~]$ DISPLAY=192.168.211.232:0.0;export DISPLAY

#说明:192.168.211.232为远程连接服务的客户端IP

7.运行安装程序

本文使用字符界面远程安装:

[oracle@db11g ~]$ ./runInstaller -silent -ignorePrereq -force -noconfig -responseFile

/opt/install/database/response/dev_install.rsp

注:字符安装前,要先创建一个dev_install.rsp文件。

安装成功后,会有以下提示:

切换到root用户下执行

/opt/oraInventory/orainstRoot.sh

/opt/oracle/product/11.2.0/db_2/root.sh

至此Oracle软件就安装成功啦。

8.静默建库

[oracle@db11g ~]$ export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

[oracle@db11g ~]$ dbca -silent \ -createDatabase \

-templateName General_Purpose.dbc \

-gdbName dev.jarwang.com \

-sid dev \

-SysPassword "654321" \

-SystemPassword "654321" \

Page 43: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang43

-emConfiguration LOCAL \

-dbsnmpPassword "654321" \

-sysmanPassword "654321" \

-datafileDestination /opt/oracle/oradata \

-storageType FS \

-characterSet ZHS16GBK \

-nationalCharacterSet AL16UTF16 \

-TOTALMEMORY 1024

Sqlplus Unreadable Code

无论是本地、远程登陆Sqlplus,均显示乱码。

$ sqlplus '/as sysdba'

SQL*Plus: Release 10.2.0.1.0 - Production on Mon Oct 11 15:15:11 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Page 44: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang44

???:

在sqlplus下insert数据也是乱码,但在pl/sql developer下一切正常。

查看操作系统编码

[oracle@oasaletest ~]$ echo $LANG

en_US.UTF-8

查看数据库编码

SQL> select userenv('language') from dual;

USERENV('LANGUAGE')

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

AMERICAN_AMERICA.ZHS16GBK

显然是由于操作系统与数据库的字符集不同造成的。

解决方法:

在.bash_profile中加入

NLS_LANG=american_america.ZHS16GBK;export NLS_LANG

如果仍不能解决,再尝试加入

export LANG=zh_CN.UTF-8

Lsnrctl error

1.启动监听器报错1:

[oracle@db11g ~]$ lsnrctl start

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 18-OCT-2010 17:19:28

…….

TNS-12537: TNS:connection closed

TNS-12560: TNS:protocol adapter error

TNS-00507: Connection closed

Linux Error: 29: Illegal seek

解决:检查/etc/hosts文件,应该包含类似以下信息

127.0.0.1 localhost.localdomain localhost

192.168.211.70 oasaletest2.hek.cn oasaletest2

2.启动监听器报错2:

[oracle@db11g ~]$ lsnrctl start

lsnrctl: error while loading shared libraries: /opt/oracle/product/11.2.0/db_2/lib/libclntsh.so.11.1:

cannot restore segment prot after reloc: Permission denied

解决:检查是否开户selinux,如果开启了,请关闭。

Page 45: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang45

Oracle Upgrade

从9i升级10g,方法有很多。使用exp/imp逻辑备份是比较简单可行的方法之一。

1.在9i服务器执行导出逻辑备份(本例以导出sales用户所有对象)。

授于sales用户exp/imp权限

SQL> grant EXP_FULL_DATABASE,IMP_FULL_DATABASE to sales

导出逻辑备份

$ exp sales/password owner=sales file=dbsale.dmp log=logsale.log

说明:使用逻辑备份时,应该避免使用sys、system用户。如果要在export时,保持数据库的事

务一致,可以加consistent=y参数。

2.将备份文件传至10g服务器。

$ scp dbsale.dmp 192.168.211.50:/opt/oracle_setup

3.在10g服务器执行

创建表空间

SQL>create tablespace SALES_SD datafile ' /opt/oasale/oradata/data/sales.dbf' size 2048m

创建临时表空表

SQL> create temporary tablespace HEK_TEMP tempfile

'/opt/oasale/oradata/data/hek_tmp01.dbf' size 5G

创建sales用户及授于exp/imp权限

SQL> create user sales identified by "123456" default tablespace hek_oa temporary

tablespace hek_temp;

SQL> grant connect,resource ,EXP_FULL_DATABASE,IMP_FULL_DATABASE to sales

导入逻辑备份

$ imp sales/123456 file=dbsale.dmp log=logsale.log full=Y

注:导入逻辑备份时,用户应使用前面创建的sale用户。如果第一次导入失败,要重试导入。要

先删除原来已导入的对象,或者直接将用户删除后重建。

Modify Pwd of DB

有时我们能以sys用户登陆Oracle,但想用其他用户做一些事情。直接修改此用户的密码,怕人

引起怀疑。如果能实现修改了密码不让人发现?这就好啦! ^_^

1.以下方法在10g之前是可以实现的。

# sqlplus ‘/as sysdba’

SQL> select du.username,du.password from dba_users du where du.username='APPS'

USERNAME PASSWORD

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

APPS 29A7E4D4FDCD1608

然后修改apps密码,并以修改后的密码登陆。

SQL> alter user apps identified by APPS_TEST;

Page 46: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang46

User altered.

SQL> conn apps/apps_test;

Connected.

SQL> select du.username,du.password from dba_users du where du.username='APPS'

USERNAME PASSWORD

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

APPS 85F57A8C9CCDAA40

此时的密文已和原来的不一样啦。做完你想做的事情后,再将密码改回去。

SQL> alter user apps identified by values '29A7E4D4FDCD1608';

这样就神不知,鬼不觉地盗用了别人的用户啦。DBA的权力够大的吧?

2. Oracle 10g之前,使用DES算法对口令进行加密。Oracle采用了用户名和口令串接的方式,所

以用户aaa、口令bbbccc的加密值与用户aaabbb、口令ccc完全相同。

SQL> create user aaabbb identified by ccc;

SQL> create user aaa identified by bbbccc;

SQL> select du.username,du.password from dba_users du where du.username in

('AAABBB','AAA');

USERNAME PASSWORD

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

AAA 6C6C694839B7D59D

AAABBB 6C6C694839B7D59D

或者:

select name ,password from SYS.USER$ where name in ('AAABBB','AAA')

3.在11g以后,Oracle修改了加密机制,DBA_USERS中不在存放用户的密文。真正的密码存放在

SYS.USER$表的SPARE4列中。但为了兼容10g, password仍保留原来的密文。

Database10g EM

1.配置Oracle10g数据库的企业管理器。

[oratest@ebs ~]$ emctl start -dbconsole

EM Configuration issue. /opt/oracle/VIS/db/tech_st/11.1.0/ebs.qr.com_VIS not found.

2.分析:由于安装EBS时,可以选择是否启用Enterprise Manager组件,启用的话需要在数据库

中建立一个sysman的schema,用于保存EM的一些数据。这个就是EM的资料库(repository)。

EM的资料库(repository)常用命令:

emca -repos create 建一个EM资料库

emca -repos recreate建一个EM资料库

emca -repos drop 除一个EM资料库

emca -config dbcontrol db配置数据库的 Database Control

Page 47: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang47

emca -deconfig dbcontrol db删除数据库的 Database Control配置

emca -reconfig ports重新配置db control和agent的端口

3.解决:重建EM资料库

[oratest@ebs ~]$ emca -config dbcontrol db -repos create

然后会提示输入一些参数。其他参数保持默认即可。

数据库SID:输入Oracle SID

数据库监听端口:输入1521

SYS用户的密码:apps

DBSNMP的密码:DBSNMP

SYSMAN用户的密码:apps

报错:ORA-01658: unable to create INITIAL extent for segment in tablespace SYSAUX

3.1解决:加大sysaux表空间

alter tablespace sysaux add datafile'/d01/oracle/DEVE/db/apps_st/data/sysaux03.dbf' size

50M;

然后再次运行:

[oratest@ebs ~]$ emca -config dbcontrol db -repos create

报错:ORA-20001: SYSMAN already exists..

3.2解决:

alter user sysman account unlock;

alter user mgmt_view account unlock;

drop user sysman cascade;

drop role MGMT_USER;

drop user MGMT_VIEW cascade;

drop public synonym MGMT_TARGET_BLACKOUTS;

drop public synonym SETEMVIEWUSERCONTEXT;

再次运行

[oratest@ebs ~]$ emca -config dbcontrol db -repos create

接下来就是漫长的等待,至少花了40分钟才将oracle em配置好。不过,也总算明白ORACLEEBS安装时不默认启用EM。

Database11g EM

配置Oracle11g数据库的企业管理器。

1.执行以下命令

Page 48: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang48

[oratest@ebs ~]$ emca -config dbcontrol db -repos create

报错:

Could not connect to

SYS/(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=******)(POR

T=1521)))(CONNECT_DATA=(SERVICE_NAME=***))): ORA-01031: insufficient privileges

(DBD ERROR: OCISessionBegin)

解决:创建Oracle密码文件

[oratest@ebs~]$ orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=apps

entries=16

2.如果第一次执行失败,要先drop信息库

[oratest@ebs ~]$ emca -repos drop

如果不行,则手工清除以下对象

drop user SYSMAN cascade;

drop user MGMT_VIEW cascade;

drop role MGMT_USER;

drop public synonym MGMT_TARGET_BLACKOUTS;

drop public synonym SETEMVIEWUSERCONTEXT;

drop user sysman cascade;

drop public synonym MGMT_ADMIN;

drop public synonym MGMT_AS_ECM_UTIL;

drop public synonym MGMT_AVAILABILITY;

drop public synonym MGMT_COLLECTION_PROPERTIES;

drop public synonym MGMT_CREDENTIAL;

drop public synonym MGMT_CURRENT_AVAILABILITY;

drop public synonym MGMT_CURRENT_METRICS;

drop public synonym MGMT_CURRENT_METRIC_ERRORS;

drop public synonym MGMT_CURRENT_SEVERITY;

drop public synonym MGMT_DELTA;

drop public synonym MGMT_DELTA_ENTRY;

drop public synonym MGMT_DELTA_ENTRY_VALUES;

drop public synonym MGMT_DELTA_IDS;

drop public synonym MGMT_DELTA_ID_VALUES;

drop public synonym MGMT_DELTA_VALUE;

drop public synonym MGMT_DELTA_VALUES;

drop public synonym MGMT_GLOBAL;

drop public synonym MGMT_GUID_ARRAY;

drop public synonym MGMT_GUID_OBJ;

drop public synonym MGMT_IP_TGT_GUID_ARRAY;

drop public synonym MGMT_JOB;

Page 49: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang49

drop public synonym MGMT_JOBS;

drop public synonym MGMT_JOB_EXECPLAN;

drop public synonym MGMT_JOB_EXECUTION;

drop public synonym MGMT_JOB_EXEC_SUMMARY;

drop public synonym MGMT_JOB_OUTPUT;

drop public synonym MGMT_JOB_PARAMETER;

drop public synonym MGMT_JOB_SCHEDULE;

drop public synonym MGMT_JOB_TARGET;

drop public synonym MGMT_LOG;

drop public synonym MGMT_LONG_TEXT;

drop public synonym MGMT_MESSAGES;

drop public synonym MGMT_METRICS;drop public synonym MGMT_METRICS_1DAY;

drop public synonym MGMT_METRICS_1HOUR;

drop public synonym MGMT_METRICS_COMPOSITE_KEYS;

drop public synonym MGMT_METRICS_RAW;

drop public synonym MGMT_METRIC_COLLECTIONS;

drop public synonym MGMT_METRIC_ERRORS;

drop public synonym MGMT_METRIC_THRESHOLDS;

drop public synonym MGMT_NAME_VALUE;

drop public synonym MGMT_NAME_VALUES;

drop public synonym MGMT_PREFERENCES;

drop public synonym MGMT_SEVERITY;

drop public synonym MGMT_SEVERITY_ARRAY;

drop public synonym MGMT_SEVERITY_OBJ;

drop public synonym MGMT_STRING_METRIC_HISTORY;

drop public synonym MGMT_TARGET;

drop public synonym MGMT_TARGETS;

drop public synonym MGMT_TARGET_BLACKOUTS;

drop public synonym MGMT_TARGET_MEMBERSHIPS;

drop public synonym MGMT_TARGET_PROPERTIES;

drop public synonym MGMT_TYPE_PROPERTIES;

drop public synonym MGMT_USER;

drop public synonym MGMT_VIEW_UTIL;

drop public synonym MGMT$DELTA_ORACLE_HOME;

drop public synonym MGMT$DELTA_OS_COMPONENTS;

drop public synonym MGMT$DELTA_OS_COMP_DETAILS;

drop public synonym MGMT$DELTA_OS_KERNEL_PARAMS;

drop public synonym MGMT$DELTA_PATCHSETS;

drop public synonym MGMT$DELTA_PATCHSET_DETAILS;

drop public synonym MGMT$DELTA_TABLESPACES;

drop public synonym MGMT$DELTA_VENDOR_SW;

drop public synonym MGMT$DELTA_VIEW;

Page 50: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang50

drop public synonym MGMT$DELTA_VIEW_DETAILS;

drop public synonym MGMT$ECM_CURRENT_SNAPSHOTS;

drop public synonym MGMT$ECM_VISIBLE_SNAPSHOTS;

drop public synonym MGMT$GROUP_DERIVED_MEMBERSHIPS;

drop public synonym MGMT$GROUP_FLAT_MEMBERSHIPS;

drop public synonym MGMT$GROUP_MEMBERS;

drop public synonym MGMT$HA_BACKUP;

drop public synonym MGMT$HA_FILES;

drop public synonym MGMT$HA_INFO;

drop public synonym MGMT$HA_INIT_PARAMS;

drop public synonym MGMT$HA_MTTR;

drop public synonym MGMT$HA_RMAN_CONFIG;

drop public synonym MGMT$HW_NIC;

drop public synonym MGMT$METRIC_COLLECTION;

drop public synonym MGMT$METRIC_CURRENT;

drop public synonym MGMT$METRIC_DAILY;

drop public synonym MGMT$METRIC_DETAILS;

drop public synonym MGMT$METRIC_HOURLY;

drop public synonym MGMT$MISSING_TARGETS;

drop public synonym MGMT$MISSING_TARGETS_IN_GROUPS;

drop public synonym MGMT$OS_COMPONENTS;

drop public synonym MGMT$OS_FS_MOUNT;

drop public synonym MGMT$OS_HW_SUMMARY;

drop public synonym MGMT$OS_KERNEL_PARAMS;

drop public synonym MGMT$OS_PATCHES;

drop public synonym MGMT$OS_SUMMARY;

drop public synonym MGMT$SOFTWARE_COMPONENTS;

drop public synonym MGMT$SOFTWARE_COMPONENT_ONEOFF;

drop public synonym MGMT$SOFTWARE_COMP_PATCHSET;

drop public synonym MGMT$SOFTWARE_DEPENDENCIES;

drop public synonym MGMT$SOFTWARE_HOMES;

drop public synonym MGMT$SOFTWARE_ONEOFF_PATCHES;

drop public synonym MGMT$SOFTWARE_OTHERS;

drop public synonym MGMT$SOFTWARE_PATCHES_IN_HOMES;

drop public synonym MGMT$SOFTWARE_PATCHSETS;

drop public synonym MGMT$TARGET;

drop public synonym MGMT$TARGET_COMPONENTS;

drop public synonym MGMT$TARGET_COMPOSITE;

drop public synonym MGMT$TARGET_PROPERTIES;

drop public synonym MGMT$TARGET_TYPE;

drop PUBLIC SYNONYM SMP_EMD_AVAIL_OBJ;

drop public synonym EMD_MNTR;

Page 51: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang51

drop public synonym SMP_EMD_AVAIL_OBJ;

drop public synonym SMP_EMD_DELETE_REC_ARRAY;

drop public synonym SMP_EMD_INTEGER_ARRAY;

drop public synonym SMP_EMD_INTEGER_ARRAY_ARRAY;

drop public synonym SMP_EMD_NVPAIR;

drop public synonym SMP_EMD_NVPAIR_ARRAY;

drop public synonym SMP_EMD_STRING_ARRAY;

drop public synonym SMP_EMD_STRING_ARRAY_ARRAY;

drop public synonym SMP_EMD_TARGET_OBJ;

drop public synonym SMP_EMD_TARGET_OBJ_ARRAY;

drop public synonym ECM_UTIL;

drop role mgmt_user;

3.访问Oracle11g企业管理器,11g的EM链接修改为https协议。

https://***.***.***:1158/em

Maintenace

Bath Stop Jobs

批量停止数据库的Jobs。

查询周期运行Jobs:

Sql>select dj.JOB,dj.SCHEMA_USER,dj.NEXT_DATE,dj.BROKEN from dba_jobs dj

刷新共享池

有时想得到优化之后的实际结果,就必须先刷新共享池,以确保不会有共享游标等。

Alter system flush shared_pool

查看活动的连接数

SELECT SID, SERIAL#, STATUS, SERVER

FROM V$SESSION

WHERE STATUS='ACTIVE' ;

Is RAC

查询当前的数据库是否为RAC

SQL> show parameter cluster

Page 52: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang52

NAME TYPE VALUE

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

cluster_database boolean FALSE

cluster_database_instances integer 1

cluster_interconnects string

如果是RAC环境,就类似如下:

SQL> show parameters cluster

NAME TYPE VALUE

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

cluster_database boolean TRUE

cluster_database_instances integer 2

cluster_interconnects string

注:cluster_database_instances表示集群的数量。

也可通过如下代码:

declare

isRAC boolean;

begin

isRAC:=dbms_utility.is_cluster_database;

if isRAC then

DBMS_OUTPUT.put_line('YES');

else

DBMS_OUTPUT.put_line('NO');

end if;

end;

Grant debug

授予开发debug pl/sql的权限

SQL> grant debug any procedure to user;

SQL> grant debug connect session to user;

Audit

11g增强数据库审计功能。

1.开启DB审计功能:

SQL>ALTER SYSTEM SET AUDIT_TRAIL=DB SCOPE=SPFILE;

SQL> startup force

例1:.针对表开启审批功能:

SQL> AUDIT select,insert,update,delete ON SZA.SZA_AP_INVOICES_ALL

Page 53: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang53

查询审批结果:

SQL> select * from sys.aud$

注:只能审计到谁对该表进行何种操作。查询不到具体的SQL语句

例2:.针对表开启审批功能,带有SQL语句。

SQL> alter system set audit_trail=db,extended scope=spfile;

SQL> startup force

查询审批结果:

select sad.userid who,sad.userhost,sad.obj$name,aa.name operation,sad.sqltext from

sys.aud$ sad,audit_actions aa where aa.action=sad.action#

Audit Vault

Oracle audit valut是Oracle推出针对数据库进行审计的独立产品。

下载:http://www.oracle.com/technetwork/database/options/database-vault/index-090593.html

查询Audit Valut组件:

select * from v$option where parameter='Oracle Database Vault';

ViewHostname

通过SQL语句查看Oracle主机名

SET serveroutput on

BEGIN

DBMS_OUTPUT.PUT_LINE(UTL_INADDR.GET_HOST_NAME); -- get local host name

DBMS_OUTPUT.PUT_LINE(UTL_INADDR.GET_HOST_ADDRESS); -- get local IP addr

END;

或:

select SYS_CONTEXT('USERENV', 'IP_ADDRESS', 15) ipaddr from dual;

View Tablespace

查看表空间的使用率

select a.tablespace_name,

a.bytes / 1024 / 1024 "Sum MB",

(a.bytes - b.bytes) / 1024 / 1024 "used MB",

b.bytes / 1024 / 1024 "free MB",

Page 54: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang54

round(((a.bytes - b.bytes) / a.bytes) * 100, 2) "percent_used"

from (select tablespace_name, sum(bytes) bytes

from dba_data_files

group by tablespace_name) a,

(select tablespace_name, sum(bytes) bytes, max(bytes) largest

from dba_free_space

group by tablespace_name) b

where a.tablespace_name = b.tablespace_name

order by ((a.bytes - b.bytes) / a.bytes) desc

ORA-12545

客户端连接RAC时报错:ORA-12545

反复连接后,又可以正常连接。

解决:

方法1:

查看LOCAL_LISTERNER

SQL> show parameters LOCAL_LISTENER;

NAME TYPE VALUE

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

local_listener string LISTENER_EBSRAC2

在各节点分别执行:

alter system set

LOCAL_LISTENER="(ADDRESS=(PROTOCOL=TCP)(HOST=<VIP_address>)(PORT=1521))

" scope=both sid='instance_name';

方法2:

在客户端的hosts文件中,加入IP与域名的定义。如:

10.12.67.42 ebsdb1

10.12.67.44 ebsdb2

Query Lock

查询锁的信息

SELECT c.owner

Page 55: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang55

,c.object_name

,c.object_type

,fu.user_name locking_fnd_user_name

,fl.start_time locking_fnd_user_login_time

,vs.module

,vs.machine

,vs.osuser

,vlocked.oracle_username

,vs.SID

,vp.pid

,vp.spid AS os_process

,vs.serial#

,vs.status

,vs.saddr

,vs.audsid

,vs.process

FROM apps.fnd_logins fl,apps.fnd_user fu,v$locked_object vlocked,v$process vp ,v$session

vs,dba_objects c

WHERE vs.SID = vlocked.session_id AND vlocked.object_id = c.object_id AND vs.paddr =

vp.addr

AND vp.spid = fl.process_spid(+) AND vp.pid = fl.pid(+)

AND fl.user_id = fu.user_id(+)

强行杀死锁

alter system kill session 'SID,serial#';

Query RowLock

查询某表哪一行被锁的信息.

1.在会话一执行:

select * from apps.fnd_user fu where rownum=1 for update

2.在会话二执行:

select * from apps.fnd_user fu where rownum=1 for update

3.在会话三查询锁的信息

select row_wait_obj#,

row_wait_file#,

row_wait_block#,

row_wait_row#,

do.OBJECT_NAME

from v$session vs,dba_objects do,v$locked_object vl

where vs.sid =vl.SESSION_ID and do.OBJECT_ID=vl.OBJECT_ID

Page 56: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang56

and do.OBJECT_NAME='FND_USER'

查询结果:

4.获取ROWID

select DBMS_ROWID.ROWID_CREATE(rowid_type => 1,

object_number => 78197,--OBJECT_ID

relative_fno => 20, --row_wait_file#

block_number => 70719,--ROW_WAIT_BLOCK#

row_number => 8 --row_wait_row#

)

from dual;

5.通过ROWID查询对应的行

select * FROM FND_USER where rowid = chartorowid('AAATF1AAUAAARQ/AAI')

Page 57: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang57

Tuning Chapter

Performance Tools

AWR

Oracle10g以后,性能分析工具推荐使用AWR(Automaic Workload Repository),来代替

statspack.

1.AWR配置:Oracle默认已经启用了AWR,缺省是每一小时收集一次统计信息。

SQL> show parameters statistics_level;

2.修改AWR配置:单位为分钟

begin

dbms_workload_repository.modify_snapshot_settings(retention=>21600,interval=>30);

end;

表示修改AWR为每半个小时收集一次,收集到的数据保留15天。

3.产生AWR报告

[oracle@db10g ~]$ cd $ORACLE_HOME/rdbms/admin

[oracle@db10g ~]$ sqlplus '/as sysdba'

SQL> @awrrpt

Current Instance

~~~~~~~~~~~~~~~~

DB Id DB Name Inst Num Instance

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

297509400 VIS 1 VIS

Specify the Report Type

~~~~~~~~~~~~~~~~~~~~~~~

Would you like an HTML report, or a plain text report?

Enter 'html' for an HTML report, or 'text' for plain text

Defaults to 'html'

Enter value for report_type: html

Report_type参数:产生AWR报告的格式.

Specify the number of days of snapshots to choose from

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Entering the number of days (n) will result in the most recent

(n) days of snapshots being listed. Pressing <return> without

specifying a number lists all completed snapshots.

Enter value for num_days:2

Page 58: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang58

输入要用最近几天的数据。

Specify the Begin and End Snapshot Ids

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Enter value for begin_snap: 147

输入开始snap id:前面会有显示

Enter value for end_snap: 148

输入终止snap id:前面会有显示

Enter value for report_name: awr_vis_2011.html

输入AWR报告的名称。完成。

ASH

AWR是每隔一小时收集一次统计信息。如果要实时性能分析,就必须使用ASH(AutomaticSession History)。ASH与AWR是相辅相成的,ASH收集到的信息都放在内存中,当内存满了

时,ASH就会将数据提交给AWR,写入相应的AWR视图中。

1.在生成产生ASH报告之前,得先查询出几个采样时间作为参数。

Select to_char(min(sample_time),'yyyy-mm-dd hh24:mi:ss') from v$active_session_history;

Select to_char(min(sample_time),'yyyy-mm-dd hh24:mi:ss') from

dba_hist_active_sess_history;

2.生成ASH报告。

[oracle@db10g ~]$ cd $ORACLE_HOME/rdbms/admin

[oracle@db10g ~]$ sqlplus '/as sysdba'

SQL> @ashrpt.sql

Enter value for report_type: html

统计信息

系统统计信息

Oracle的CBO统计信息分为系统统计信息、对象统计信息。

1.查看系统统计信息的状态:

select pname, pval1, pval2

from sys.aux_stats$

where sname = 'SYSSTATS_INFO'

2.系统统计信息可分为:非工作量统计信息、工作量统计信息。

2.1收集非工作量统计信息:应在数据库空闲时进行。

Page 59: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang59

begin

dbms_stats.gather_system_stats(gathering_mode=>'noworkload');

end;

运行完成后,查看统计信息:

SQL> select pname, pval1 from sys.aux_stats$ where sname = 'SYSSTATS_MAIN';

名称 描述 说明

CPUSPEEDNW 一个CPU一秒能处理的操作数。百万次/秒

IOSEEKIM 平均磁盘寻道时间,毫秒。默认为10

IOTFRSPEED 平均每毫秒从磁盘传输的字节数,默认为4096

2.2收集工作量统计信息:不应在数据库空闲时进行。

begin

dbms_stats.gather_system_stats(gathering_mode=>'interval',interval=>30);

end;

对象统计信息

有三种对象统计信息:表统计、列统计、索引统计。

1.收集数据库对象的统计信息:

收集数据库对象的统计信息,以9i开始Oracle就推荐使用dbms_stats,而不是analyze。

SQL> exec dbms_STATS.gather_database_stats

Oracle 10g在安装时,就会自动创建一个scheduler,来完成统计信息的收集。

查询此scheduler:

SQL> select * from DBA_SCHEDULER_JOBS dsj where

dsj.JOB_NAME='GATHER_STATS_JOB'

激活此scheduler:

SQL> exec dbms_scheduler.enable(name=>’sys.gather_stats_job’);

SQL> exec dbms_scheduler.disable(name=>’sys.gather_stats_job’);

Oracle11g改用自动维护任务来收集统计信息。

查询此任务:

SQL> select * from dba_autotask_task where client_name=’auto optimizer stats collection’

Page 60: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang60

激活此task:

SQL>exec dbms_auto_task_admin.enable(client_name=>’auto optimizer stats collection’,

Opteration=>null,

Window_name=>null);

2.收集某一特定表的统计信息:

2.1创建一个新表,并准备测试数据。

create table cux_test(id int primary key,cdate date,ctxt varchar2(100));

insert into cux_test values(1,sysdate,'test1');

insert into cux_test values(2,sysdate,'test2');

insert into cux_test values(3,sysdate,'test3');

insert into cux_test values(4,sysdate,'test4');

insert into cux_test values(5,sysdate+1,'test5');

insert into cux_test values(6,sysdate+2,'test7');

commit;

2.2此时表的统计信息为空。

select num_rows,blocks,empty_blocks,avg_space,chain_cnt,avg_row_len from

user_tab_statistics uts where uts.TABLE_NAME='CUX_TEST'

各列含义说明如下:

num_rows:表中数据的行数。

Blocks:高水位以下的数据块个数。

empty_blocks:高水位以上的数据块个数。DBMS_STATS不计算此值。

avg_space:表中数据块的平均空闲空间。DBMS_STATS不计算此值。

chain_cnt:涉及行链接和行迁移的总行数。DBMS_STATS不计算此值。

avg_row_len:表中平均每个记录的长度。

2.3收集表的统计信息。

begin

dbms_stats.gather_table_stats(ownname => 'apps',

tabname => 'CUX_TEST',

estimate_percent => 100,

method_opt => 'for all columns size skewonly',

cascade => TRUE);

end;

运行完上述语句后,统计信息就出来了。一般而言,当表中的记录变化超过10%时,就应该重新

收集统计信息,以便优化器做出正确的选择。

3.列统计信息。

select column_name,

num_distinct,

Page 61: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang61

low_value,

high_value,

density,

num_nulls,

avg_col_len,

histogram,

num_buckets

from user_tab_col_statistics utcs

where utcs.table_name = 'CUX_TEST'

各列含义说明如下:

num_distinct:该列唯一值的数量。

density:0到1之间的一个小数。接近0表示对于列的过滤能去掉大多数行。接近1表示对该列的

过虑起不了多少作用。如果没有直方图,density=1/num_distinct

num_nulls:表示该列中存储NULL的总数。

Avg_col_len:平均列大小。用字节表示。

Histogram:表明是否有直方图统计信息。NONE表示没有;FREQUENCY表示频率类型;

HEIGHT BALANCED表示平均分布类型。

Num_buckets:直方图里的桶数

4索引的统计信息:

select index_name as name,

blevel,

leaf_blocks as leaf_blks,

distinct_keys as dst_keys,

num_rows,

clustering_factor as clust_fact,

avg_leaf_blocks_per_key as leaf_per_key,

avg_data_blocks_per_key as data_per_key

from user_ind_statistics

where table_name = 'CUX_TEST'

Associate Statistics

Associate Statistics可以针对列、函数、包、类型、索引等进行自定义收集统计信息。

Page 62: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang62

直方图

对于主键、唯一键等列,数据分布是均匀的。Oracle查询优化器只要知道最小值、最大值、唯一

值即可。然后更多的数据的分布是不均匀的,因此Oracle查询优化器就需要借助直方图来完成分

析了。

直方图:频度直方图(frenquency histogram)、等高直方图(height-balance histogram)。

select endpoint_value,

endpoint_number

, endpoint_number - lag(endpoint_number, 1, 0)

over(order by endpoint_number) as frenquency

from user_tab_histograms uth

where uth.TABLE_NAME = 'CUX_TEST' and uth.COLUMN_NAME='CDATE'

order by endpoint_value;

对象扩展统计信息

从Oracle11g开始,引用对象扩展统计信息。主要解决以下问题:

Ø where中出现函数表达式。如:upper(country)=’SWITZERLAND’,会导致查询优化器无

法使用。

Ø 查询优化器是假定存储在不同列的数据是不相关的。如:country=’China’ and language=’Chinese’。由于中国人大部分都讲汉语,因此查询优化器无法直接应用这两个查询条件。

生成扩展统计信息:

select dbms_stats.create_extended_stats(ownname => user,

tabname => 'T',

extension => '(upper(pad))'),

dbms_stats.create_extended_stats(ownname => user,

tabname => 'T',

extension => '(val2,val3)')

from dual;

查询扩展统计信息:

select extension_name, extension

from user_stat_extensions

where table_name = 'T'

锁定对象统计信息

锁定对象统计信息,就是指不收集此对象的统计信息。

begin

dbms_stats.lock_table_stats(ownname=>'APPS',tabname => 'CUX_TEST');

end;

Page 63: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang63

配置查询优化器

配置查询优化器路径图

Oracle配置查询优化器路径图

执行计划

获取Oracle执行计划有四种方法:

1.通过Explain Plan获取。

optimizer_modedb_file_multiblock_read_count

optimizer_dynamic_samplingoptimizer_feature_enable

optimizer_secure_view_mergingquery_rewrite_enabledquery_rewrite_integrity

start_transformation_enabled

收集系统统计信息

收集对象统计信息

Pga_aggregate_targetBitmap_merge_area_size

Hash_area_sizeSort_area_size

Sort_area_retained_size

Optimizer_index_cachingOptimizer_index_cost_adj

调整直方图

收集扩展统计信息

是否高效

Workarea_size_policy=auto Workarea_size_policy=manual

Page 64: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang64

2.查看动态性能视图:v$sql_plan、v$sql_plan_statistics_all

3.AWR或Statspack。

4.启动执行计划的跟踪功能。

Explain Plan

1.安装Explain Plan:

SQL> @$ORACLE_HOME/rdbms/admin/utlxplan.sql

2.获取执行计划:

SQL> explain plan for select * from ap.ap_expense_report_headers_all h where

h.report_header_id=111;

注:如果SQL语句中有绑定变量,那么得到的执行计划就可能不准确。

自Oracle9iR2起,可能通过以下方式查询执行计划:

SQL> select * from table(dbms_xplan.display);

3.display_cursor函数。

执行计划语句:/*+ gather_plan_statistics*/

select /*+ gather_plan_statistics*/ * from ap.ap_expense_report_headers_all h where

h.report_header_id=10004

获取查询计划

select * from table(dbms_xplan.display_cursor(null,null,'iostats last'));

动态性能视图

通过查看动态视图,来获取执行计划。

1.通过模糊查询,来获取sql_id、child_number.

SQL> select sql_id,child_number,sql_text from v$sql where sql_text like

'%ap_expense_report_lines_all%'

2.通过dbms_xplain.display_cursor获取执行计划

SQL> select * from table(dbms_xplan.display_cursor('42jypbz800st3',0))

Page 65: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang65

报错:User has no SELECT privilege on V$SQL_PLAN

解决:给动态性能视图授权,注意写法为v_$

GRANT SELECT ON v_$sql_plan_statistics_all TO apps;

GRANT SELECT ON v_$sql_plan TO apps;

GRANT SELECT ON v_$sql TO apps;

AWR

通过AWR(自动工作量资料库)也可以获取到执行计划,但此法太厚重了。

1.先执行AWR。

2.通过dbms_xplan.display_awr获取执行计划。

Select * from table(dbms_xplan.display_awr(‘1hqjydsjbvmwq’));

注:传入参数为sql_id

10053事件

1.打开10053事件

Alter session set events '10053 trace name context forever'

关闭10053事件

Alter session set events '10053 trace name context off'

2.查看10053跟踪日记

查看当前连接会话地址

select paddr from v$session where sid=(select sid from v$mystat group by sid);

通过会话地址获取进程ID

select spid from v$process where addr='000000009F5069B0';

查看跟踪日记存放路径

show parameter user_dump_dest

切到操作路径目录,打开此文件即可得到执行计划.

解析执行计划

从解析执行计划角度可分为三类SQL:

1.单独操作:执行计划的基本原则是从内到外。

SQL> select * from ap.ap_invoices_all aia where aia.invoice_id=100 and aia.invoice_num='CA100';

Execution Plan

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

Plan hash value: 4154275576

Page 66: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang66

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

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

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

| 0 | SELECT STATEMENT | | 1 | 327 | 2(0)| 00:00:01 |

|* 1 | TABLE ACCESS BY INDEX ROWID| AP_INVOICES_ALL | 1 | 327 | 2(0)| 00:00:01 |

|* 2 | INDEX UNIQUE SCAN | AP_INVOICES_U1 | 1 | | 1(0)| 00:00:01 |

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

Predicate Information (identified by operation id):

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

1 - filter("AIA"."INVOICE_NUM"='CA100')

2 - access("AIA"."INVOICE_ID"=100)

执行顺序说明:

通过INVOICE_ID=100执行ID2,得到符合的记录返还给ID1。

再执行ID1,并按INVOICE_NUM"='CA100'过滤ID2的记录,返还给ID0。

ID0返还给调用都。

例外的情况:count stopkey

SQL> select * from ap.ap_invoices_all aia where rownum<10;

Execution Plan

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

Plan hash value: 2363061706

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

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

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

| 0 | SELECT STATEMENT | | 9 | 2943 | 2 (0)| 00:00:01 |

|* 1 | COUNT STOPKEY | | | | | |

| 2 | TABLE ACCESS FULL| AP_INVOICES_ALL | 9 | 2943 | 2 (0)| 00:00:01 |

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

Predicate Information (identified by operation id):

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

1 - filter(ROWNUM<10)

执行顺序说明:

先执行ID2,尽管此时发生全表扫描。但当发了COUNTS STOPKEY事件时,ID1在收到最多9条记录后,便会终止ID2的执行。

2.非相关操作:执行计划的基本原则是从内到外,从上到下。

如:Union all、hash join

Page 67: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang67

3.相关操作:执行计划的基本原则是从内到外,从上到下。但并非严格地按ID大小执行,而是以

交错的方式执行。只有第一个孩子最多执行一次,其他孩子则可能要执行多次或不执行。

如:Nested loops

SQL优化技术

SQL优化技术包括:调整访问结构、调整SQL语句、提示(hint)、调整执行环境、SQL性能概要、

存储纲要、SQL计划基线。

除了改变访问结构、调整执行环境外。其他方法都是基于这样一个事实:由于查询优化器自身的

局限导致它不能识别出一个高效的执行计划。

改变访问结构

提示(Hint)

见ORACLE R12开发笔记。

SQL性能概要

Oracle10g开始,自动调整优化器是通过SQL调优建议器(SQL Tuning Advisor)暴露给外界使用。

SQL概要是一个对象,包含了可以帮助查询优化器为一个特定的SQL语句找到高效执行计划的信

息。

存储提纲

存储提纲(Stored Outlines)被设计用来提供稳定的执行计划,以消除执行环境或对象统计信息

的改变造成的影响。从Oracle11g起,建议使用SQL计划基线。

SQL计划基线

SQL计划基线(SQL Plan Baseline)就是用来迫使查询优化器为一条给定的SQL语句产生一个特

定的、稳定的执行计划。

优化数据访问

获取逻辑读

逻辑读:在执行SQL语句的时候从高速缓存中读取的块数。

1.逻辑读决定一个SQL语句的资源开销。经验法则:

Ø 每个返回行少于5个逻辑读的访问路径=>好

Ø 每个返回行10-15个逻辑读的访问路径=>可以接受

Page 68: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang68

Ø 每个返行多于15个逻辑读的访问路径=>低效

2.通过xplain.display_cursor函数。

执行计划语句:/*+ gather_plan_statistics*/

select /*+ gather_plan_statistics*/ * from ap.ap_expense_report_headers_all h where

h.report_header_id<10004

获取查询计划

select * from table(dbms_xplan.display_cursor(null,null,'iostats last'));

注:此SQL语句每个返回行的逻辑读:Bufferers /A-Rows = 5 /3 = 1.7

降低高水平

当一个表有的删除操作比插入操作更多时,就会产生稀疏的数据块,从而导致更多的逻辑读。

SQL> alter table test enable row movement;

SQL> alter table t shrink space;

TABLE ACCESS FULL

全表扫描:当 查 询 条 件 无 法 命 中 任 何 索 引 、或 者 扫 描 索 引 的 代 价 大 于 全 表 扫 描 代

价 的 某一 比 例 时(由 参 数optimizer_index_cost_adj设定),Orac le会采用全表扫描的方式查

找数据。当发生全表扫描时,Oracle会自下向上一次读取一定数量(由参数

db_file_multiblock_read_count设定)的数据块,一直读取到高水位标志(High Water Mark)下。

SQL> explain plan for select /*+ full(h)*/ h.invoice_num from

ap.ap_expense_report_headers_all h where h.invoice_num is not null

SQL> select * from table(dbms_xplan.display);

INDEX FULL SCAN

全索引扫描(INDEX FULL SCAN):当索引包含了查询所需的全部数据时,就会发生全索引

描述。

Page 69: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang69

SQL> explain plan for select /*+ index(h AP_EXPENSE_REPORT_HEADERS_N4)*/

h.invoice_num from ap.ap_expense_report_headers_all h where h.invoice_num is not null;

SQL> select * from table(dbms_xplan.display);

注:由于SQL语句中条件为invoice_num is not null才会发生全索引扫描。由于B-Tree索引不会

存储null值,如果没有此条件,就会发生Index rang scan。全索引扫描可以避免同时访问rowid和表,但比Index fast full scan、Index rang scan更耗资源。

INDEX FAST FULL SCAN

索引快速全扫描(INDEX FAST FULL SCAN)是对全索引扫描的改进。它不会从树的根节点

开始读取,而是直接扫描所有叶子节点;也不会一次读取一个数据块,而是一次读取

db_file_multiblock_read_count个数据块。

SQL> explain plan for select /*+ index_ffs(h AP_EXPENSE_REPORT_HEADERS_N4)*/

h.invoice_num from ap.ap_expense_report_headers_all h where h.invoice_num is not null

SQL> select * from table(dbms_xplan.display);

INDEX UNIQUE SCAN

索引唯一扫描(Index unique scan):如果 Oracle能预知扫描结果只有 0或 1条记录时(即最

多只返回一个rowid),会采用 INDEX UNIQUE SCAN。例如:当对Unique Index中的所有

字段进行完全匹配时,会发生 INDEX UNIQUE SCAN。

SQL> explain plan for select h.report_header_id from ap.ap_expense_report_headers_all h

where h.report_header_id=10745;

SQL> select * from table(dbms_xplan.display);

Page 70: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang70

INDEX RANGE SCAN

索引范围扫描(Index range scan):通过索引查找数据时,如果Oracle 认为会返回数据可能会

大于1,会进行 INDEX RANGE SCAN,例如 :Unique Index中字段不完全匹配查找或非

Unique Index查找,会进行 INDEX RANGE SCAN,。INDEX RANGE SCAN分为闭包(有

前后查找边界。如:=、like)和非闭包(只有一边或者没有边界。如:<、>)。

例1:非闭包的Unique Index查找

SQL> explain plan for select h.report_header_id from ap.ap_expense_report_headers_all h

where h.report_header_id>10745;

SQL> select * from table(dbms_xplan.display);

例2:闭包的非Unique Index查找

SQL> explain plan for select h.invoice_num from ap.ap_expense_report_headers_all h where

h.invoice_num='W11750';

SQL> select * from table(dbms_xplan.display);

例3:非闭包的非Unique Index查找

SQL> explain plan for select h.invoice_num from ap.ap_expense_report_headers_all h where

h.invoice_num >= 'W11750';

SQL> select * from table(dbms_xplan.display);

例4:like %%查找会导致全索引扫描

SQL> explain plan for select h.report_header_id from ap.ap_expense_report_headers_all h

where h.report_header_id like '%750%';

SQL> select * from table(dbms_xplan.display);

Page 71: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang71

INDEX RANG SCANDESCENDING

1.默认情况下,索引扫描的顺序是升序的。也可通过index_asc、index_desc来指定索引扫描的

顺序。

SQL> explain plan for select /*+ index_desc(aia AP_INVOICES_U1)*/ * from

apps.ap_invoices_all aia where aia.invoice_id>100;

SQL> select * from table(dbms_xplan.display);

2.指定索引扫描顺序对于含有Order by的SQL语句,会更有效。

2.1没有指定索引扫描顺序:

SQL> explain plan for select /*+ index(aia AP_INVOICES_N8)*/ * from

apps.ap_invoices_all aia where aia.CREATION_DATE < trunc(sysdate-100,'dd') order by

aia.CREATION_DATE desc;

SQL> select * from table(dbms_xplan.display);

2.2有指定索引扫描顺序:性能要更高好些。

SQL> explain plan for select /*+ index_desc(aia AP_INVOICES_N8)*/ * from

apps.ap_invoices_all aia where aia.CREATION_DATE < trunc(sysdate-100,'dd');

SQL> select * from table(dbms_xplan.display);

Page 72: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang72

TABLE ACCESS BY INDEX ROWID

当发生索引扫描时,如果需要返回的字段都在索引上,则直接返回索引上的数据,而如果还需要

返回非索引上的字段的值,Oracle则需要根据从索引上查找的 ROWID到对应的数据块上取回

数据,这时就是 TABLE ACCESS BY INDEX ROWID。

SQL> explain plan for select h.report_header_id,h.description from

ap.ap_expense_report_headers_all h where h.report_header_id in (10745);

SQL> select * from table(dbms_xplan.display);

TABLE ACCESS BY USER ROWID

直接在where条件指定rowid,是最高效的访问方式。

SQL> select h.rowid from ap.ap_expense_report_headers_all h where

h.report_header_id=10745;

ROWID

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

AAGyi5AAUAAABujAAm

SQL> explain plan for select h.rowid from ap.ap_expense_report_headers_all h where

h.rowid='AAGyi5AAUAAABujAAm';

SQL> select * from table(dbms_xplan.display);

注:由于要先获取rowid,所以此方式只适用在二次访问数据才用(如第一次查询,第二次修改)。

聚簇

Oracle聚簇是指将多个表中相同的列存储在一个数据块。

Creating a Cluster: ExampleThe following statement creates a cluster named personnel with the cluster key columndepartment, a cluster size of 512 bytes, and storage parameter values:

CREATE CLUSTER personnel(department NUMBER(4))

SIZE 512STORAGE (initial 100K next 50K);

Cluster Keys: Example

Page 73: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang73

The following statement creates the cluster index on the cluster key of personnel:

CREATE INDEX idx_personnel ON CLUSTER personnel;

After creating the cluster index, you can add tables to the index and perform DML operationson those tables.

Adding Tables to a Cluster: ExampleThe following statements create some departmental tables from the sample hr.employeestable and add them to the personnel cluster created in the earlier example:

CREATE TABLE dept_10CLUSTER personnel (department_id)AS SELECT * FROM employees WHERE department_id = 10;

CREATE TABLE dept_20CLUSTER personnel (department_id)AS SELECT * FROM employees WHERE department_id = 20;

Hash Clusters: ExamplesThe following statement creates a hash cluster named language with the cluster key columncust_language, a maximum of 10 hash key values, each of which is allocated 512 bytes, andstorage parameter values:

CREATE CLUSTER language (cust_language VARCHAR2(3))SIZE 512 HASHKEYS 10STORAGE (INITIAL 100k next 50k);

Because the preceding statement omits the HASH IS clause, Oracle uses the internal hashfunction for the cluster.

The following statement creates a hash cluster named address with the cluster key made upof the columns postal_code and country_id, and uses a SQL expression containing thesecolumns for the hash function:

CREATE CLUSTER address(postal_code NUMBER, country_id CHAR(2))HASHKEYS 20HASH IS MOD(postal_code + country_id, 101);

Single-Table Hash Clusters: ExampleThe following statement creates a single-table hash cluster named cust_orders with thecluster key customer_id and a maximum of 100 hash key values, each of which is allocated512 bytes:

CREATE CLUSTER cust_orders (customer_id NUMBER(6))SIZE 512 SINGLE TABLE HASHKEYS 100;

聚簇因子

聚簇因子(Clustering Factor,仅指B-Tree索引):指有多少临近的索引条目指到不同的数据块。

如果表的排序与索引的排序是相似的,聚簇因子就小(最小值为表的非空数据块总数)。如果表

的排序与索引的排序相差很大,聚簇因子就大(最大值为索引的键数)。

例1:聚簇因子较小的情况,通过行预取,可以减少逻辑读。

1.创建测试表及主键索引

Page 74: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang74

create table cux_invoice_all(invoice_id int,invoice_num varchar2(100),invoice_date

date,amount number,constraint cux_invoice_all_ix primary key(invoice_id));

2.准备测试数据

insert into cux_invoice_all

select * from ( select aia.invoice_id,

aia.invoice_num,

aia.invoice_date,

aia.invoice_amount

from ap.ap_invoices_all aia

order by aia.invoice_id)t;

commit;

3.由于主键是按升序方式插入的,因此主键的聚簇因子与表的块数应该相近。

4.通过增加行预取,可以减少逻辑读(buffers列)

4.1行预提取为2

SQL> set arraysize 2

SQL> select /*+ index(cia CUX_INVOICE_ALL_IX) gather_plan_statistics*/ * from

apps.cux_invoice_all cia;

SQL> select * from table(dbms_xplan.display_cursor(null,null,'iostats last'))

产生的逻辑读:95764

4.2增加行预取为100

SQL> set arraysize 100

SQL> select /*+ index(cia CUX_INVOICE_ALL_IX) gather_plan_statistics*/ * from

apps.cux_invoice_all cia;

SQL> select * from table(dbms_xplan.display_cursor(null,null,'iostats last'));

Page 75: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang75

结论:在聚簇因子较小的情况,增大行预取数量后,产生的逻辑读明显减少。相反,如果在聚

簇因子较大的情况,增大行预取数量,并不会明显减少逻辑读。

索引与min/max函数

1.优化含有min或max函数SQL语句。

SQL> explain plan for select /*+ index(aia AP_INVOICES_U1)*/ max(aia.invoice_id) from

apps.ap_invoices_all aia;

SQL> select * from table(dbms_xplan.display);

INDEX FULL SCAN (MIN/MAX)要比INDEX FULL SCAN更加高效,事实上INDEX FULLSCAN (MIN/MAX)并不会全索引扫描,而只扫描最右边或最左边的索引键。

2.如果同时含有min、max函数的SQL语句,则可以使用标量查询来优化。

SQL> explain plan for select

(select /*+ index(aia AP_INVOICES_U1)*/ min(aia.invoice_id) from apps.ap_invoices_all

aia) min_id,

(select /*+ index(aia AP_INVOICES_U1)*/ max(aia.invoice_id) from apps.ap_invoices_all

aia) max_id

from dual;

SQL> select * from table(dbms_xplan.display);

函数索引

Oracle利用列的索引时,必须保证where的列子句不能含有函数,否则会导致无法使用索引。

Page 76: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang76

如:upper(c1)=’TEST’,会导致查询优化器无法使用c1列上的索引。

create index cux_invoice_all_ix2 on apps.cux_invoice_all(upper(invoice_num));

select * from apps.cux_invoice_all cia where upper(cia.invoice_num)='ERS-5322-494';

语义索引

语义索引是指对于字符串的比较,默认情况下,Oracle使用二进制进行比较。对10gR2之后版本,

Oracle提供了语义比较。

1.不区分大小写比较:generic_m_ci

2.不区分大小写且不区分重音:generic_m_ai

位图索引

位图索引(BITMAP)有以下限制:

Ø BITMAP索引不能适用于主键、唯一键。

Ø BITMAP不支持行级锁。

Ø BITMAP在10g之前的版本,会导致索引频繁重建,因此只适用于很少修改的列。

Ø BITMAP只能在企业版Oracle使用。

位图索引更适合:组合多个索引、星型转换。

组合索引

组合索引(Composit Index)

1.准备测试数据

create table cux_composite_test (c1 int,c2 varchar2(20),c3 date,c4 number);

begin

for i in 1..100 loop

insert into cux_composite_test values(i,'test'||i,sysdate+i,3.2+i);

end loop;

commit;

end;

create index cux_composite_test_ix on cux_composite_test(c1,c2,c3);

2.查询:尽管where子句只有一个条件,但仍然使用了组合索引。这就是先导列的概念。

select /*+index(c cux_composite_test_ix) */ * from apps.cux_composite_test c where c.c1=2;

Page 77: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang77

3.创建组合索引之注意事项:

3.1组合索引:通常是这些列的唯一性比较低,创建组合索引将带来更高的效率。

SQL> select count(1) from AP.AP_INVOICES_ALL;

SQL> select dtc.COLUMN_NAME,dtc.NUM_DISTINCT from dba_tab_columns dtc where

dtc.TABLE_NAME='AP_INVOICES_ALL' and dtc.OWNER='AP' and dtc.COLUMN_NAME

in ('INVOICE_DATE', 'ORG_ID');

3.2当在一个表上创建多个组合索引时,如果index1(c1,c2,c3)、index2(c1,c2),通常index2是多余

的,可以取消。

3.3确定组合索引列的顺序。例如:一个组合索引由c1、c2、c3三列组成,通常应选择唯一值最

多的列为先导列。

4.索引跳跃扫描(INDEX SKIP SCAN):当where子句没有出现先导列时,也可以使用组合索

引,这就叫索引跳跃扫描。

SQL> select /*+index_ss(c cux_composite_test_ix) */ * from apps.cux_composite_test c where

c.c2 = 'test2' and c.c3=sysdate;

索引压缩

B-Tree索引与位图索引的一个最重要的区别:位图索引总是被压缩的,而B-Tree索引则是需要时

才压缩。这是因为压缩过的索引并不一定会变小,并且增加了块竞争可能。

SQL> analyze index ap.AP_INVOICES_N6 validate structure;

Index analyzed.

SQL> select blocks from index_stats;

BLOCKS

----------

432

SQL> alter index ap.AP_INVOICES_N6 rebuild compress;

Page 78: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang78

Index altered.

SQL> analyze index ap.AP_INVOICES_N6 validate structure;

Index analyzed.

SQL> select blocks from index_stats;

BLOCKS

----------

448

解析

共享游标

共享游标是指通过绑定变量来减少SQL的硬解析,从而提高性能。除了在编写SQL语句时,就要

用绑定变量的方式来实现外,Oracle也提供了cursor_sharing参数来自动识别绑定变量的SQL语句。

SQL> showparameter cursor_sharing

NAME TYPE VALUE

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

cursor_sharing string EXACT

EXACT:表示关闭共享游标特性。

FORCE:强制启用共享标特性。

SIMILAR:取决于执行计划是否有直方图。有直方图,等同于exact参数。没有直方图,特同于

force参数。

服务器端语句缓存

服务器端语句缓存是设计用来减少SQL的软解析。虽然软解析比硬解析所需资源要少得多,但仍

然会导致library cache latche lock。Oracle初始化参数session_cached_cursor指定每个会话可缓

存游标数的最大值。

SQL> show parameters session_cached_cursors;

NAME TYPE VALUE

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

session_cached_cursors integer 50

1.决定session_cached_cursors数量。

SQL> select sn.name,ss.value from v$statname sn,v$sesstat ss where sn.statistic#=ss.statistic#

and sn.name in('session cursor cache hits','session cursor cache count','parse count (total)')

and ss.sid=42;

Page 79: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang79

如果session cursor cache count大于session_cached_cursor,则表明session_cached_cursors数量

可以增大。但不能超过open_cursors的数量。

游标生命周期

1.游标生命周期。

打开游标:DBMS_SQL.OPEN_CURSOR。此时会在UGA中分配一块内存结构。

解析游标:DBMS_SQL.PARSE。解析游标关联的SQL语句(包括执行计划),并加载到librarycache中。同时更新UGA,以指向library cache。

定义输出变量:DBMS_SQL.DEFINE_COLUMN。如果SQL语句的返回值,必须先定义接收的

变量。

绑定输入变量:DBMS_SQL.BIND_VARIABLE。如果SQL语句有绑定变量,则必须提供输入的

值。

执行游标:DBMS_SQL.EXECUTE。执行SQL语句,Oracle大多数情况下,是推迟到fech才执行。

获取游标:DBMS_SQL.FETCH_ROWS。执行SQL语句,返回结果。

关闭游标:DBMS_SQL.CLOSE_CURSOR。释放UGA中的内存,但Library Cache中共享游标不

会被清除,是供其他游标使用。

2.DBMS_SQL既实现避免硬解析,也完全控制着游标的生命周期。因此是最高效的编程方式,

优于其他PL/SQL编程方式。但DBMS_SQL不支持客户端缓存(可以通过启用服务端缓存来转移

压力)。

JDBC

1. java.sql.Statement不支持绑定变量、游标重用、客户端缓存。

2. java.sql.PreparedStatement支持绑定变量、游标重用。

3. JDBC还可支持客户端缓存。

((oracle.jdbc.OracleConnection)connection).setImplicitCachingEnable(true);

((oracle.jdbc.OracleConnection)connection).setStatementCacheSize(50);

优化表连接

表连接方法

Oracle支持SQL86、SQL92两种写法。本文不再简述。

Page 80: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang80

NESTED LOOPS JOIN

嵌套循环连接(NESTED LOOPS JOIN):将在处理的两个数据集分为外部循环(outer loop,也

称驱动基表)、内部循环(inner loop)。驱动基表只会执行一次,但内部循环需要针对基表返回的

每条记录都要执行一次。

1.执行嵌套循环连接(此强制使用全表扫描)

select /*+leading(h) use_nl(l) full(h) full(l)*/ *

from ap.ap_invoices_all h, ap.ap_invoice_lines_all l

where h.invoice_id = l.invoice_id

and h.invoice_num = 'ERS-4400-109091';

2.如果去掉full提示,那么NESTED LOOPS还是比较高效的。

select /*+leading(h) use_nl(l) */ *

from ap.ap_invoices_all h, ap.ap_invoice_lines_all l

where h.invoice_id = l.invoice_id

and h.invoice_num = 'ERS-4400-109091';

注:因此当基表返回的记录超过1条时,并且内部循环选择怪很差时,NESTED LOOPS会导致

性能问题。

块预取

Oracle在执行NESTED LOOPS时会使用块预取的方式,来提高NESTED LOOP的效率。

所谓的块预取是指当缓冲没有命中时,为了改变单块处理导致一个物理读(如rowid访问、索引

范围访问等),Oracle会使用多个单块物理读来访问多个相邻的块。

块预取是Oracle的内部处理机制,无法通过调整参数处理。可以通过以下等待整件来判断。

Ø db file sequential read:单块物理读事件。

Ø db file scattered read:多块物理读事件。

Page 81: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang81

MERGE JOIN

合并连接(排序—合并连接,MERGE JOIN):每个数据集只会执行一次,但每个数据集必须

先按照连接条件进行排序。

select /*+ ordered use_merge(l) */ *

from ap.ap_invoices_all h, ap.ap_invoice_lines_all l

where h.invoice_id = l.invoice_id

and h.invoice_num = 'ERS-17045-109613';

注:合并连接比嵌套连接、哈希连接效率更低,所以Oracle优化器会基本不会选择此连接方式。

HASH JOIN

哈希连接(HASH JOIN):将在处理的两个数据集分为构造输入 (Build Iput)、探测输入(ProbeInput)。构造表的每行记录会被加在内存中(如果内存不够,则使用临时表空间),用以构造哈

希表。哈希表的哈希键值是根据连接条件使用的字段计算得出,然后将探测表的每行记录与哈希

表进行探测,条合条件就返回。

Ø 哈希连接的每个节点只地执行一次。

Ø 哈希表一般选择记录最小的那个节点来构造。

1.强制使用哈希连接:leading()为构造表,use_has()为探测表

select /*+leading(h) use_hash(l) */*

from ap.ap_invoices_all h, ap.ap_invoice_lines_all l

where h.invoice_id = l.invoice_id

and h.invoice_num = 'ERS-4400-109091';

执行计划:

2.对比强制使用的NESTED LOOP。

select /*+leading(h) use_nl(l)*/ *

from ap.ap_invoices_all h, ap.ap_invoice_lines_all l

where h.invoice_id = l.invoice_id

and h.invoice_num = 'ERS-4400-109091';

Page 82: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang82

结论:显然在构造表只返回1条记录时,NESTED LOOP比HASHLOOP更高效。

例2:HASH LOOP

NESTED LOOP

INDEX JOIN

索引连接只能用哈希连接。当一张表的索引很多,并且SQL语句只引用很少几个字段时,索引连

接就很有用了。

select /*+index_join(aia AP_INVOICES_U1 AP_INVOICES_N6 AP_INVOICES_N7) */

aia.invoice_id,aia.invoice_num,aia.VENDOR_SITE_ID

from ap.ap_invoices_all aia

--invoice_id列对AP_INVOICES_U1索引, INVOICE_NUM对应AP_INVOICES_N6索引 ,

VENDOR_SITE_ID对应索引AP_INVOICES_N5

where aia.invoice_id>3000 and aia.invoice_num like 'MX%' and aia.VENDOR_SITE_ID=122;

执行计划:

Page 83: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang83

注:尽管只有一张表,但仍然采用了HASH JOIN。

HASH JOIN OUTER

外哈希连接。即:LEFT JOIN或RIGHT OUT。

PARITTION-WISE JOIN

分区智能连接(Partition-Wise Join)是一种优化分区表连接技术,常用以优化合并连接、哈希

连接。前提条件:表必须是分区表。

1.完全分区智能连接。

2.部分智能分区连接。

连接优化

查询优化器依赖于转换来优化连接语句。

1.连接去除:即使在SQL语句中指定了连接子句,但优化器也会避免执行连接。

准备测试数据:主从表必须存在外键关联。

create table t1(h_id int,col2 date,constraint t1_pk primary key(h_id));

create table t2(h_id int,l_id int,col3 varchar2(20) );

alter table T2

add constraint T2_FK foreign key (H_ID)

references t1 (H_ID);

insert into t1 values(1,sysdate);

insert into t1 values(2,sysdate);

insert into t2 values(1,1,'test1');

insert into t2 values(1,2,'test2');

Page 84: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang84

insert into t2 values(2,3,'test1');

insert into t2 values(2,4,'test2');

commit;

执行查询:语句只含有的从表字段

explain plan for

select t2.h_id,t2.col3 from apps.t1,apps.t2 where t1.h_id=t2.h_id;

select * from table(dbms_xplan.display);

注:虽然查询语句中存在连接条件,但优化器自动转化单表查询。仅适用Oracle10gR2及以版本。

2.子查询非嵌套化:即将半连接、反连接的子查询转换为普通的连接。

3.星形转换:主要用于事实表、维度表关联优化。

星形转换

星形转换(start schema):由于Oracle优化器一次只能对两个数据集进行连接,另一方面对两

维度表进行连接会导致笛卡尔乘积。为了解决普通连接操作的弊端,ORACLE引入星型转换。

1.例如:事实表SALES包含具体的销售数据,而维度表Channels、Times、Promotions、Customers、Products则从各自角度描述事实表。

2.启用星型转换的条件:

2.1初始化参数star_transformation_enabled设置为temp_disable或true。

2.2事实表上必须有针对每个维度表的外键ID创建位图索引。

SALES

ChannelsTimes

Products

Customers

Promotions

Page 85: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang85

高级优化技术

高级优化技术:物化视图(Materialized view)、结果缓存(result cache)、并行处理(parallelprocess)、直接路径插入(direct-path insert)、行预取、数组接口。

注:只有在其他途径无法优化时,才选择高级优化技术。

Materialized View

物化视图相比于虚拟视图而言,物化视图是含有真实数据的,会占用存储空间。

1.无任何参数的物化视图

create materialized view cux_invoices_all_mv

as

select sup.vendor_name,

aia.org_id,

aia.invoice_id,

aia.invoice_num,

aia.invoice_date,

aia.invoice_amount

from ap.ap_invoices_all aia, ap.ap_suppliers sup

where aia.vendor_id = sup.vendor_id;

执行计划:

explain plan for select * from apps.cux_invoices_all_mv;

select * from table(dbms_xplan.display);

2.物化视图之查询重写。适用于不想修改原有的SQL,但又想利用物化视图。有点像索引的作用。

2.1启用物化视图之查询重写:

Ø 设置参数query_rewrite_enabled为true。

alter system set query_rewrite_enabled=true;

Ø 针对物化视图启用查询重写。

alter materialized view cux_invoices_all_mv enable query rewrite;

2.2一旦启用查询重写,优化器在执行SQL语句时,会先在物化视图中查找是否有查询重写。如

有,则执行物化视图。如没有,则执行SQL语句。

explain plan for

select sup.vendor_name,

Page 86: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang86

aia.org_id,

aia.invoice_id,

aia.invoice_num,

aia.invoice_date,

aia.invoice_amount

from ap.ap_invoices_all aia, ap.ap_suppliers sup

where aia.vendor_id = sup.vendor_id;

执行计划:MAT_VIEWREWRITE ACCESS FULL

3.物化视图之刷新。

3.1物化视图刷新方法:

Ø 完全刷新(Refresh Complete):物化视图的数据全部删除(会执行truncate,而不是delete),然后重新从基表加载。此方式适用基表有大量的数据被修改了。

Ø 快速刷新(Refresh Fast):快速刷新,必须在所有基表上创建日志表。

Ø 强制刷新(Refresh Force):首先执行快速刷新,如失败,则执行完全刷新。默认方法。

Ø 永不刷新(Never Refresh):物化视图数据永不刷新。

3.2物化视图刷新时间点:

Ø On Demand:通过手工提交命令,来刷新物化视图。

Ø On Commit:基础表提交事务时,即刷新物化视图。

alter materialized view cux_invoices_all_mv refresh force on demand;

手工刷新物化视图:

begin

dbms_mview.refresh(list=>'apps.cux_invoices_all_mv');

end;

4.基于物化视图日志的快速刷新

要实现物化视图之快速刷新,即物化视图与基表之间数据增量变化,必须创建物化视图日志。

create materialized view log on ap.ap_invoices_all with rowid;

create materialized view log on ap.ap_suppliers with rowid;

注:对EBS系统而,如果是在标准表上创建物化视图日志,可以先查询一下标准表是否已经创建

了物化视图日志。

Page 87: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang87

4.1检查物化视图是否具备条件执行快速刷新

begin

dbms_mview.explain_mview(mv=>'cux_invoices_all_mv',stmt_id=>'42');

end;

4.2查询检查结果

select * from mv_capabibities_table;

结论:物化视图特别适用OATP,对于OALP系统,适用于不经常修改的表。

Result Cache

结果缓存(Result Cache,Oracle11g引入的新技术)。Oracle支持三种结果缓存:

Ø 服务器结果缓存:服务器端的缓存。

Ø PL/SQL函数结果缓存:服务端缓存,用于保存PL/SQL函数的返回值。

Ø 客户端结果缓存:客户端缓存,用于保存查询结果。

1.服务器端结果缓存:存放在Share Pool中,供所有会话共享。

执行SQL语句(以两个不同会话分别执行)

select /*+ result_cache */

t1.h_id,t1.col2,t2.l_id,t2.col3

from t1,t2

where t1.h_id=t2.h_id;

查询缓存结果的引用情况:

select status,creation_timestamp,build_time,row_count,scan_count fromv$result_cache_objects

服务器端结果缓存参数设置:

SQL> show parameters result_cache;

NAME TYPE VALUE

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

client_result_cache_lag big integer 3000

client_result_cache_size big integer 0

result_cache_max_result integer 5

result_cache_max_size big integer 2336K

result_cache_mode string MANUAL

result_cache_remote_expiration integer 0

2.PL/SQL函数结果缓存:在服务器端缓存函数返回值。

启用函数结果缓存在创建PL/SQL函数时必须指定RESULT_CACHE子句。

CREATE OR REPLACE FUNCTION cux_func_test(p in pls_integer) RETURN VARCHAR2

Page 88: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang88

RESULT_CACHE RELIES_ON(l_temp)

IS

l_temp varchar2(30);

BEGIN

select t2.col3 into l_temp from t2 where t2.l_id=p;

RETURN l_temp;

END cux_func_test;

注:该函数不能含有OUT、INOUT参数。并且不支持PACKAGE中的函数。

3.客户端结果缓存:

客户端结果缓存是基于轮询来保证客户端的缓存与服务器是一致。

服务参数设置。

Ø client_result_cache_size指定了每个客户端进程可用来保存结果缓存的最大内存(字节)。

Ø client_result_cache_lag指定了两次数据库调用的最大时间间隔。

注:由于客户端结果缓存可以有效避免数据库调用开销,但由于存在过时数据风险,因此适用于

只读表或者是时实性要求不同的查询。

并行处理

串行处理:当Oracle在处理SQL语句时,一个SQL语句只能在一个CPU上执行。因此处理SQL的吞吐能力是由单个CPU可使用的IO带宽所限制的。

并行处理:并行处理是相对于串行处理而言。即将一个SQL语句拆分成多个子任务,然后分配给

多个CPU同时执行。

1.Oracle在进行并行处理时,可按以下两种方式进行最小粒度划分:

Ø 分区粒度(partition granule):

Ø 块范围粒度(block range granule):

2.配置并行处理之参数

Ø parallel_min_servers:实例启动时默认创建的从属进程数量。

Ø parallel_max_servers:从属进程的最大数量。一般为参数cpu_count的8至10倍。

查询从属进程的使用情况:

select pps.STATISTIC,pps.VALUE from sys.v$px_process_sysstat pps where pps.statistic like

'Servers%';

3.并行度

3.1创建表或索引时指定并行度

alter table gl.gl_je_lines parallel 4;

Page 89: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang89

注:创建表或索引后,后续的DML语句也会使用此并行度

查询表的并行度

select dt.TABLE_NAME,dt.degree from dba_tables dt where

dt.TABLE_NAME='GL_JE_LINES' and dt.owner='GL';

3.2并行查询:默认开启

select /*+ parallel_index(H,4) parallel(L,4)*/ * from gl.gl_je_headers H,gl.gl_je_lines L where

H.je_header_id=L.je_header_id and h.je_header_id=42563;

3.3并行DML:默认关闭

并行DML生效前提:

Ø 表上没有触发器。

Ø 表上没有自引用外键约束。

Ø 当对象字段修改时,并行DML会失效。

Ø 当聚簇表或临时表修改时,并行DML会失效。

Ø 并行DML必须先在会话层生效,才可以使用。单独使用hint是无法使用并行DML。

启用并行DML

alter session enable parallel dml;

查询会话是否启用DML

select ss.PDML_STATUS from v$session ss where sid =sys_context('userenv','sid');

4.并行处理适用情况:

Ø 系统有大量的闲置资源(CPU、内存、IO带宽).

Ø SQL语句需要大量时间,至少要超过10秒。

直接路径插入

对于Insert语句,Oracle提供了两种机制。

Ø 常规插入(Conventional Insert)。

Ø 直接路径插入(Direct-Path Insert):只适用于Insert into …Select语句、Mege语句、OCI接口。

1.使用直接插入方式:

Ø 在SQL语句中指定append提示:INSERT /*+ append*/ Into …Select …..

Ø 并行执行SQL语句。

Page 90: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang90

2.直接路径插入与NoLogging(在定义表时指定)

Ø 直接路径插入只是避免生成回滚段,来提高性能,但仍会正常生成重做日志。

Ø Nologging:当表处于nologgin,只会生成最少的重做日志,以提高性能。

3.直接路径插入生效前提:

Ø 表上没有INSERT触发器。

Ø 表上没有关联到其他(即关联到其他表的外键)。

Ø 表没有含有对象字段

Ø 表不是索引组织表。

行预取

行预取(Row Prefetching)即指一次读取多条记录,预存在客户端内存中,这样可以减少数据库请

求。

1.在PL/SQL中使用行预取:

declare

cursor c is select l.* from ap_checks_all l where rownum<=10 order by dbms_random.value;

TYPE t_check is table of ap_checks_all%rowtype;

l_check t_check;

k pls_integer;

begin

k:=0;

open c;

loop

fetch c bulk collect into l_check limit 2;

exit when l_check.count=0;

k:= k +1;

dbms_output.put_line('k='||k);--只会循环5次,避免游标一次只取一笔记录

for i in l_check.first..l_check.last

loop

dbms_output.put_line('BANK_ACCOUNT_NAME='||l_check(i).BANK_ACCOUNT_NAM

E);

dbms_output.put_line('CHECK_NUMBER='||l_check(i).CHECK_NUMBER);

end loop;

end loop;

close c;

end;

Page 91: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang91

2.在JAVA中使用行预取:

Statement.setFetchSize(20);

3.适用于在批量取数时,只要取数大于1.

数组接口

数据接口:应用程序向数据库批量传送数据。即用数据变量代替标量变量。

1.在PL/SQL中使用数组接口:

create table cux_t(id int,pad varchar2(200));

declare

type t_id is table of cux_t.id%type;

type t_pad is table of cux_t.pad%type;

l_id t_id :=t_id();

l_pad t_pad :=t_pad();

begin

l_id.extend(1000);

l_pad.extend(1000);

for i in 1..1000

loop

l_id(i):=i;

l_pad(i):=rpad('*',100,'*');

end loop;

--尽管forall不是循环语句,只会执行一次

forall i in l_id.first..l_id.last

insert into cux_t values(l_id(i),l_pad(i));

commit;

end;

2.在JAVA中使用数组接口(批量更新):

sql = “insert into cux_t values(?,?)”;

statement = connection.prepareStatement(sql);

for(int i=0;i<=1000;i++){

statement.setInt(1,i);

statement.setString(2,”…some text …”);

statement.addBatch();

}

statement.executeBatch();

statement.close;

Page 92: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang92

优化物理设计

行迁移&行链接

Oracle在存储数据块时,会保留一部分空白的空间(通过PCTFREE参数设置),以备将来数据

块更新使用。

1.行迁移:当更新一条记录时,如果剩余的数据块空间不够使用,则会将记录拆分为两个数据块。

原有的数据块片段只保留rowid,而更新后的数据会放在新的数据块中。通过是由update语句导

致的。

解决方法:1.增加pctfree的值。2.通过alter table move重整表。

Some methods to avoid and eliminate Chained/Migrated rows1- ALTER TABLE ... MOVE command.2- Increase PCTFREE.3- Import/Export can be taken as an approach to eliminate the migrated rows.4- Avoid to create tables with more than 255 columns.

2.行链接:当一条记录无法在一个数据块中储存时,会拆分成两个或多个片段,这些片段会存储

在多个数据块中,然后将他们构造成一个链。insert、update语句都会导致行链接。

Page 93: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang93

CBOChapter

Oracle有两种优化器:RBO、CBO

1. RBO:Rule Basic Optimizer。Oarcle 9i以后就不推荐使用了。

2.CBO:Cos Basic Optimizer。是以cpu、memeory、io等代价为统计指标的。有两种统计方法:

I/O开销模型、CPU开销模型。

Oracle为CBO优化器提供了三个变体:可以通过参数optimizer_mode设置

Ø All_rows:优化器将寻找在最短时间内完成SQL语句的执行计划(通常为返回所有行)。

Ø First_rows_N:N可以为1、10、100、1000或者通过first_rows(n)的hint来优化。优化器将

寻找能够以最小资源消耗返回整个数据片断的执行计划。9i以后可以使用此参数。

Ø First_row:在9i以后,此参数已过时。

除此之外,optimizier_mode参数还可以设置为rule、choose。Rule即代表RBO,在10g中已经

不再支持了。Choose表示为优化器提供了一种运行时选择方式,即可以rule和all_rows之间动态

选择。

在9i中默认值为choose,必须从静态参数中修改optimizer_mode参数值。

表扫描

dbf_mbrc

dbf_mbrc:db_file_multiblock_read_count参数。

测试dbf_mbrc与表扫描Cost关系:Oracle9i

重置随机数

execute dbms_random.seed(0);

创建表:

create table t1 pctfree 99 pctused 1

as select rownum id,trunc(100*dbms_random.normal) val,rpad('*',100) padding

from all_objects where rownum<=10000;

查看执行计划

explain plan for select max(val) from t1;

select * from table(dbms_xplan.display)

Page 94: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang94

不断调整db_file_multiblock_read参数的值,可以得到扫描表的成本会约等于高水位之后的数据

块除以db_file_multiblock_read

NO. db_file_multiblock_read COST Adjusted dbf_mbrc

1 8 1519 6.59

2 16 963 10.40

3 32 611 16.39

4 64 388 25.84

注:Cost值会随着不同版本,而有细微的变化。9i比8i要多1个成本,是由于_tablescan_cost_plus_one参数设置为true。

Page 95: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang95

Dynamic ViewChapter

Oracle动态性能视图

V$PROCESS

Column

V$PROCESS用于存储运行Oracle进程的列表。

NO. Colmn Description Note

1 PID Oracle ID Oracle进程ID

2 SPID OS ID 操作系统进程ID

ADDR Join v$process's addr with v$sessionpaddr.

Purpose

1.在Linux系统,经常使用TOP命令查看进程耗用资源情况。

但TOP命令只是返回信息并不全,如果要查看8431这个进程到底是哪个Oracle进程?

select * from v$process ps where ps.SPID=8431

2.查看Oracle进程对应的客户端信息

select p.USERNAME, s.OSUSER, s.SID, s.SERIAL#

from v$process p, v$session s

where p.ADDR = s.PADDR

and p.SPID = 4801

V$SESSION

Column

V$SESSION用于存储当前连接到Oracle的会话列表。

Page 96: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang96

NO. Colmn Description Note

1 SID SESSION标识 常用于连接其它表

2 SERIAL# SESSION序列号 如果某个SID又被其它的session使用的话则此数

值自增加(当一个 SESSION结束,另一个SESSION开始并使用了同一个SID)。

3 AUDSID 审计sessionID

审计session ID唯一性,确认它通常也用于当寻找

并行查询模式

4 USERNAME 连接Oracle用户 在三层架构系统中,基本没用。

5 STATUS 状态 Achtive:正执行SQL语句(waiting for/using a resource)Inactive:等待操作(即等待需要执行的SQL语句)Killed:被标注为删除

Purpose

1.在Linux系统,经常使用TOP命令查看进程耗用资源情况。

V$LOCK_OBJECT

Column

SELECT

l.oracle_username,o.owner,o.object_name,o.object_type,s.sid,s.serial#,p.spid

FROM v$locked_object l, dba_objects o, v$session s, v$process p

WHERE l.object_id = o.object_id

AND l.session_id = s.sid and s.paddr = p.addr

ORDER BY o.object_id, xidusn DESC

V$LOCK

Page 97: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang97

OTHERS

查询TOP SQL

查询TOP SQL

SELECT * FROM v$sql WHERE hash_value =

(SELECT sql_hash_value FROM v$session WHERE paddr = (SELECT addr FROM v$process

WHERE spid =TOP命令看到的PID));

查询SQL语句硬解析、软解析的次数:

select sa.VERSION_COUNT,sa.PARSE_CALLS,sa.SQL_TEXT from v$sqlarea sa order by

sa.VERSION_COUNT desc

通过EM查看TOP SQL

Page 98: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang98

滚动到后面一些.

查询唯一索引冲突

查询唯一索引导致的冲突数量

create table rlock as select object_id,object_name from dba_objects;

create UNIQUE index ind_rlock on rlock (object_id);

select statistic_name, value

from v$segment_statistics

where owner = 'MYDB'

and object_name = 'IND_RLOCK'

and statistic_name = 'row lock waits';

--一个session中

Page 99: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang99

insert into rlock values (999999,'bb');

--另一个session中

insert into rlock values (999999,'bb');

rollback;

--另一个session中

commit;

select statistic_name, value

from v$segment_statistics

where owner = 'MYDB'

and object_name = 'IND_RLOCK'

and statistic_name = 'row lock waits'

查询非唯一索引冲突

非唯一索引也会导致产生row lock waits事件,即:enq:TX - index contention。产生的原因是由

索引块分裂引起的锁等待。

session 1:执行

create table t1(x number,y char(20),z date,q varchar2(4000));

create index t1_idx1 on t1(q,z);

begin

for x in 1..50000 loop

insert into t1 values(1162,'1060000abcdefg', sysdate, rpad('x',2000,'x'));

end loop;

end;

session 2:执行

begin

for x in 1..50000 loop

insert into t1 values(1162,'1060000abcdefg', sysdate, rpad('x',2000,'x'));

end loop;

end;

session 3:分别有SESSION1、SESSION2执行前、后执行,以便比较

select object_name,STATISTIC_NAME,value from v$segment_statistics where object_name in

('T1','T1_IDX1') and STATISTIC_NAME='row lock waits' order by 1;

Page 100: [itpub.net]Oracle-EBS R12DBA维护笔记

Author:JarWang (王重东) QQ:[email protected] Copyright(R):Jarwang100

Other Notes

Oracle EBS-11i开发笔记:http://www.itpub.net/thread-1133804-1-1.html

Oracle EBS-11i表结构、API接口笔记:http://www.itpub.net/thread-1265230-1-1.html

Oracle EBS-11i OAF开发笔记:http://www.itpub.net/thread-1236269-1-1.html

Oracle EBS-11i Workflow与JBoss jBPM开发笔记:http://www.itpub.net/thread-1245869-1-1.html

Oracle EBS-11i OM-扩展开发:http://www.itpub.net/thread-1154690-1-1.html

Oracle EBS-11i WEB ADI开发笔记(抽丝拨茧篇):http://www.itpub.net/thread-1225495-1-1.html

Oracle EBS-11i多节点安装、克隆等 (32bit):http://www.itpub.net/thread-1228782-1-1.html

Oracle EBS-11i AME模块学习笔记:http://www.itpub.net/thread-1409293-1-1.html

Oracle EBS-报表开发工具之闲碎:http://www.itpub.net/thread-1439279-1-1.html

Oracle EBS-11i DBA笔记:http://www.itpub.net/thread-1256323-1-1.html

Oracle EBS-R12单节点安装、克隆等(64bit):http://www.itpub.net/thread-1129128-1-1.html

Oracle EBS-R12学习笔记(GL、INV):http://www.itpub.net/thread-1247010-1-1.html

Oracle EBS-R12 OAF开发笔记:http://www.itpub.net/thread-1412731-1-1.html

Oracle EBS-R12 DBA笔记:http://www.itpub.net/thread-1623597-1-1.html

Oracle EBS Web Service开发笔记: http://www.itpub.net/thread-1436990-1-1.html

Oracle EBS Advanced Replication10g配置:http://www.itpub.net/thread-1216295-1-1.html

Oracle EBS DataGuard10g配置:http://www.itpub.net/thread-1362805-1-1.html

Oracle10g OCP学习笔记:http://www.itpub.net/thread-1229073-1-1.html

Java开发笔记:http://www.itpub.net/thread-1511818-1-1.html

Oracle10g RAC安装:http://www.itpub.net/thread-1194959-1-1.html

Oracle11g RAC安装:http://www.itpub.net/thread-1454363-1-1.html

Oracle10g基于ASM存储的异机恢复:http://www.itpub.net/thread-1208926-1-1.html

PL/SQL操作EXCEL:http://www.itpub.net/thread-1101710-1-1.html

MySQL5开发笔记:http://www.itpub.net/thread-1158177-1-1.html

Redhat系统管理员笔记:http://www.itpub.net/thread-1353773-1-1.html

RHEL5.2内核升级:http://www.itpub.net/thread-1145199-1-1.html