一步一步在OEL5.5 64位Linux上安装Oracle 10gR2 RAC(4)

16 升级clusterware软件

升级之前,查看CRS版本:

Node1

[root@node1 ~]# su – oracle

node1-> hostname 

node1.oracleonlinux.cn

node1-> crs_stat -t

Name           Type           Target    State     Host        

————————————————————

ora.node1.gsd  application    ONLINE    ONLINE    node1       

ora.node1.ons  application    ONLINE    ONLINE    node1       

ora.node1.vip  application    ONLINE    ONLINE    node1       

ora.node2.gsd  application    ONLINE    ONLINE    node2       

ora.node2.ons  application    ONLINE    ONLINE    node2       

ora.node2.vip  application    ONLINE    ONLINE    node2       

node1-> crsctl query crs softwareversion

CRS software version on node [node1] is [10.2.0.1.0]

node1-> 

node1-> crsctl query crs activeversion

CRS active version on the cluster is [10.2.0.1.0]

node1-> 

Node2

 

执行升级:

执行安装介质中的p8202632_10205_Linux-x86-64来给集群件打patch

Oracle用户在图形界面调用/mnt/p8202632_10205_Linux-x86-64/Disk1/runInstaller 来执行:

 

进入升级操作:

 

Next

注意选择正确的cluster_name,以及clusterware软件的home

 

Next

 

Next

 

预检查未通过,根据提示,以root用户在双节点上将/etc/sysctl.conf配置文件中的

fs.file-max = 65536修改为fs.file-max = 101365

net.ipv4.ip_local_port_range=1024 – 65000.修改为net.ipv4.ip_local_port_range=9000 – 65500

并执行sysctl -p 来使之生效。

 

 

然后,单击Retry,确保预检查通过:

 

Next

 

 Install,开始安装:

 

 

Note:

Because the software consists of local identical copies distributed across each of the nodes in the cluster, it is possible to patch your CRS installation in a rolling manner, one node at a time.

 

To complete the installation of this patchset, you must perform the following tasks on each node:

 

1.Log in as the root user.

2.As the root user, perform the following tasks:

 

a.Shutdown the CRS daemons by issuing the following command:

/u01/app/oracle/product/10.2.0/crs_1/bin/crsctl stop crs

b.Run the shell script located at:

/u01/app/oracle/product/10.2.0/crs_1/install/root102.sh

This script will automatically start the CRS daemons on the

patched node upon completion.

 

3.After completing this procedure, proceed to the next node and repeat.

根据上述提示,以滚动方式来对CRS升级,即先升级其中的一个节点,然后再升级其它的节点。

Node1:

root用户执行/u01/app/oracle/product/10.2.0/crs_1/bin/crsctl stop crs

[root@node1 ~]# /u01/app/oracle/product/10.2.0/crs_1/bin/crsctl stop crs

Stopping resources.

Successfully stopped CRS resources 

Stopping CSSD.

Shutting down CSS daemon.

Shutdown request successfully issued.

[root@node1 ~]# 

root用户执行/u01/app/oracle/product/10.2.0/crs_1/install/root102.sh

[root@node1 ~]# /u01/app/oracle/product/10.2.0/crs_1/install/root102.sh

Creating pre-patch directory for saving pre-patch clusterware files

Completed patching clusterware files to /u01/app/oracle/product/10.2.0/crs_1

Relinking some shared libraries.

Relinking of patched files is complete.

WARNING: directory ‘/u01/app/oracle/product/10.2.0’ is not owned by root

WARNING: directory ‘/u01/app/oracle/product’ is not owned by root

WARNING: directory ‘/u01/app/oracle’ is not owned by root

WARNING: directory ‘/u01/app’ is not owned by root

WARNING: directory ‘/u01’ is not owned by root

Preparing to recopy patched init and RC scripts.

Recopying init and RC scripts.

Startup will be queued to init within 30 seconds.

Starting up the CRS daemons.

Waiting for the patched CRS daemons to start.

  This may take a while on some systems.

.

10205 patch successfully applied.

clscfg: EXISTING configuration version 3 detected.

clscfg: version 3 is 10G Release 2.

Successfully deleted 1 values from OCR.

Successfully deleted 1 keys from OCR.

Successfully accumulated necessary OCR keys.

Using ports: CSS=49895 CRS=49896 EVMC=49898 and EVMR=49897.

node <nodenumber>: <nodename> <private interconnect name> <hostname>

node 1: node1 node1-priv node1

Creating OCR keys for user ‘root’, privgrp ‘root’..

Operation successful.

clscfg -upgrade completed successfully

Creating ‘/u01/app/oracle/product/10.2.0/crs_1/install/paramfile.crs’ with data used for CRS configuration

Setting CRS configuration values in /u01/app/oracle/product/10.2.0/crs_1/install/paramfile.crs

[root@node1 ~]# 

同理,在节点2上执行上述操作!

升级后,双节点上的CRS都从10.2.0.1.0升级到10.2.0.5.0

 

 

 

至此,我们已经在双节点上将CRS版本已经升级至10.2.0.5.0!!!

一步一步在OEL5.5 64位Linux上安装Oracle 10gR2 RAC(3)

15 安装clusterware软件

Note

由于oracle 10g早在10年前,即2003年就发布了,而Redhat Enterprise Linux 5的发布日期要晚于oracle 10g发布,所以,默认情况下Oracle 10g 不支持在Redhat Enterprise Linux 5及以上版本上安装。所以,解决方案:

可以通过修改/etc/redhat-release 文件;

在安装的过程中,执行runInstaller 加上–ignoreSysPreReqs选项;

这里采取第一种方法。

修改前:

[root@node1 /]# cat /etc/redhat-release 

Red Hat Enterprise Linux Server release 5.5 (Tikanga)

[root@node1 /]#

修改后:

[root@node1 /]# cat /etc/redhat-release 

Red Hat Enterprise Linux Server release 4 (Tikanga)

[root@node1 /]#

 

将安装介质挂载到光驱上,然后挂载光盘到/mnt

[root@node1 /]# mount /dev/cdrom /mnt/

mount: block device /dev/cdrom is write-protected, mounting read-only

[root@node1 /]# 

Oracle用户登录图形界面:

 

根据提示,以root用户在双节点上执行rootpre.sh脚本:

[root@node1 rootpre]# pwd

/mnt/10201_clusterware_linux_x86_64/rootpre

[root@node1 rootpre]# sh rootpre.sh 

No OraCM running 

[root@node1 rootpre]# 

继续安装:

 

提示错误,缺少libXp软件包,root用户到OS安装光盘中重新安装缺少的软件包:

[root@node1 media]# rpm -ivh libXp-1.0.0-8.1.el5.i386.rpm 

warning: libXp-1.0.0-8.1.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159

Preparing…                ########################################### [100%]

   1:libXp                  ########################################### [100%]

[root@node1 media]# rpm -ivh libXp-1.0.0-8.1.el5.x86_64.rpm 

warning: libXp-1.0.0-8.1.el5.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159

Preparing…                ########################################### [100%]

   1:libXp                  ########################################### [100%]

[root@node1 media]# 

Note

node2节点上也要安装缺失的软件包!

重新执行:

node1-> sh /mnt/10201_clusterware_linux_x86_64/runInstaller 

来安装:

 

Next

 

Next

 

注意path指向ORA_CRS_HOME=/u01/app/oracle/product/10.2.0/crs_1,以及指定cluster_name=crs.  Next:

 

添加节点信息:

 

修改eth0网卡作为publicNext

 

指定OCR为外部冗余策略,并选择存放路径为/dev/raw/raw1Next

 

指定Voting disk为外部冗余策略,并选择存放路径为/dev/raw/raw2Next

 

Install开始安装:

 

Next

 

Next

 

根据提示执行以root用户分别在2个节点上执行/u01/app/oracle/oraInventory/orainstRoot.sh 

/u01/app/oracle/product/10.2.0/crs_1/root.sh脚本:

Node1:

[root@node1 ~]# /u01/app/oracle/oraInventory/orainstRoot.sh

Changing permissions of /u01/app/oracle/oraInventory to 770.

Changing groupname of /u01/app/oracle/oraInventory to oinstall.

The execution of the script is complete

[root@node1 ~]# /u01/app/oracle/product/10.2.0/crs_1/root.sh

WARNING: directory ‘/u01/app/oracle/product/10.2.0’ is not owned by root

WARNING: directory ‘/u01/app/oracle/product’ is not owned by root

WARNING: directory ‘/u01/app/oracle’ is not owned by root

WARNING: directory ‘/u01/app’ is not owned by root

WARNING: directory ‘/u01’ is not owned by root

Checking to see if Oracle CRS stack is already configured

/etc/oracle does not exist. Creating it now.

 

Setting the permissions on OCR backup directory

Setting up NS directories

Oracle Cluster Registry configuration upgraded successfully

WARNING: directory ‘/u01/app/oracle/product/10.2.0’ is not owned by root

WARNING: directory ‘/u01/app/oracle/product’ is not owned by root

WARNING: directory ‘/u01/app/oracle’ is not owned by root

WARNING: directory ‘/u01/app’ is not owned by root

WARNING: directory ‘/u01’ is not owned by root

Successfully accumulated necessary OCR keys.

Using ports: CSS=49895 CRS=49896 EVMC=49898 and EVMR=49897.

node <nodenumber>: <nodename> <private interconnect name> <hostname>

node 1: node1 node1-priv node1

node 2: node2 node2-priv node2

Creating OCR keys for user ‘root’, privgrp ‘root’..

Operation successful.

Now formatting voting device: /dev/raw/raw2

Format of 1 voting devices complete.

Startup will be queued to init within 90 seconds.

Adding daemons to inittab

Expecting the CRS daemons to be up within 600 seconds.

CSS is active on these nodes.

        node1

CSS is inactive on these nodes.

        node2

Local node checking complete.

Run root.sh on remaining nodes to start CRS daemons.

[root@node1 ~]# 

Node2:

[root@node2 ~]# /u01/app/oracle/oraInventory/orainstRoot.sh

Changing permissions of /u01/app/oracle/oraInventory to 770.

Changing groupname of /u01/app/oracle/oraInventory to oinstall.

The execution of the script is complete

[root@node2 ~]#

 

[root@node2 ~]# /u01/app/oracle/product/10.2.0/crs_1/root.sh

WARNING: directory ‘/u01/app/oracle/product/10.2.0’ is not owned by root

WARNING: directory ‘/u01/app/oracle/product’ is not owned by root

WARNING: directory ‘/u01/app/oracle’ is not owned by root

WARNING: directory ‘/u01/app’ is not owned by root

WARNING: directory ‘/u01’ is not owned by root

Checking to see if Oracle CRS stack is already configured

/etc/oracle does not exist. Creating it now.

 

Setting the permissions on OCR backup directory

Setting up NS directories

Oracle Cluster Registry configuration upgraded successfully

WARNING: directory ‘/u01/app/oracle/product/10.2.0’ is not owned by root

WARNING: directory ‘/u01/app/oracle/product’ is not owned by root

WARNING: directory ‘/u01/app/oracle’ is not owned by root

WARNING: directory ‘/u01/app’ is not owned by root

WARNING: directory ‘/u01’ is not owned by root

clscfg: EXISTING configuration version 3 detected.

clscfg: version 3 is 10G Release 2.

Successfully accumulated necessary OCR keys.

Using ports: CSS=49895 CRS=49896 EVMC=49898 and EVMR=49897.

node <nodenumber>: <nodename> <private interconnect name> <hostname>

node 1: node1 node1-priv node1

node 2: node2 node2-priv node2

clscfg: Arguments check out successfully.

 

NO KEYS WERE WRITTEN. Supply -force parameter to override.

-force is destructive and will destroy any previous cluster

configuration.

Oracle Cluster Registry for cluster has already been initialized

Startup will be queued to init within 90 seconds.

Adding daemons to inittab

Expecting the CRS daemons to be up within 600 seconds.

CSS is active on these nodes.

        node1

        node2

CSS is active on all nodes.

Waiting for the Oracle CRSD and EVMD to start

Oracle CRS stack installed and running under init(1M)

Running vipca(silent) for configuring nodeapps

/u01/app/oracle/product/10.2.0/crs_1/jdk/jre//bin/java: error while loading shared libraries: libpthread.so.0: cannot open shared object file: No such file or directory

[root@node2 ~]# 

 

 

Note

解决上述错误,/u01/app/oracle/product/10.2.0/crs_1/jdk/jre//bin/java: error while loading shared libraries: libpthread.so.0: cannot open shared object file: No such file or directory

其实,这是1bug

在每个节点上,修改$ORA_CRS_HOME/bin目录下的srvctlvipca文件,

vipca文件ARGUMENTS=””165行之前和srvctl文件的export LD_ASSUME_KERNEL 174行之后增加 unset LD_ASSUME_KERNEL 语句;

修改后的$ORA_CRS_HOME/bin/vipca文件:

160       fi

161       export LD_LIBRARY_PATH

162       ;;

163 esac

164 

165 unset LD_ASSUME_KERNEL

166 ARGUMENTS=””

167 NUMBER_OF_ARGUMENTS=$#

修改后的$ORA_CRS_HOME/bin/srvctl文件:

172 #Remove this workaround when the bug 3937317 is fixed

173 LD_ASSUME_KERNEL=2.4.19

174 export LD_ASSUME_KERNEL

175 unset LD_ASSUME_KERNEL

176 

177 # Run ops control utility

178 $JRE $JRE_OPTIONS -classpath $CLASSPATH $TRACE oracle.ops.opsctl.OPSCTLDriver “$@”

179 exit $?

 

在任意一个节点上,用root用户,手动运行vipca,配置完正确的prvipvip 信息之后,crs就可以安装完成。

 

Next

 

填写对应的VIP别名:node1-vip.oracleonlinux.cnnode2-vip.oracleonlinux.cn

 

Next

 

Next

 

然后,继续进行集群软件的安装:

此时单击,Retry:

 

最后,

 

完成clusterware软件的安装!!!

如下

node1-> crs_stat -t

Name           Type           Target    State     Host        

————————————————————

ora.node1.gsd  application    ONLINE    ONLINE    node1       

ora.node1.ons  application    ONLINE    ONLINE    node1       

ora.node1.vip  application    ONLINE    ONLINE    node1       

ora.node2.gsd  application    ONLINE    ONLINE    node2       

ora.node2.ons  application    ONLINE    ONLINE    node2       

ora.node2.vip  application    ONLINE    ONLINE    node2       

node1-> 

一步一步在OEL5.5 64位Linux上安装Oracle 10gR2 RAC(2)

11 配置共享磁盘

给双节点配置6块共享磁盘。

Note

其中第1块大小为130M,用于存放Oracle 10g R2 RACOCR

其中第2块大小为130M,用于存放Oracle 10g R2 RACVoting Disk

其中第3块大小为3G,用于配置DATA磁盘组,存放数据库。

其中第4块大小为3G,用于配置FRA磁盘组,作为数据库的闪回恢复区,存放归档日志、RMAN备份等。

其中第5块大小为1G,用于将来升级到11gR2 RAC时,给Grid Infrastructure使用。

具体的配置过程,在本文档中就不再一一赘述,但是视频里会给出操作过程。具体可以通过

下述2中方式查看:

查看本人之前的系列视频之《黄伟老师Oracle RAC+DG系列视频+售后安心技术支持服务》第4RAC双节点格式化共享存储,配置ASM磁盘,配置ASM

2 或查看本人系列文章之一步一步在Linux上安装Oracle 11gR2 RAC (3)2.13 配置共享磁盘

12 在共享磁盘上创建分区

这里在每个磁盘上分别创建1个分区,且把磁盘所有空间都用于这1个主分区。

Note:

对共享磁盘分区时,只需要以root用户在任意节点上创建即可,不需要在每个节点上执行!

分区后的信息如下:

Node1:

[root@node1 ~]# fdisk -l

 

Disk /dev/sda: 42.9 GB, 42949672960 bytes

255 heads, 63 sectors/track, 5221 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *           1        4711    37841076   83  Linux

/dev/sda2            4712        5221     4096575   82  Linux swap / Solaris

 

Disk /dev/sdb: 134 MB, 134217728 bytes

64 heads, 32 sectors/track, 128 cylinders

Units = cylinders of 2048 * 512 = 1048576 bytes

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1               1         128      131056   83  Linux

 

Disk /dev/sdc: 134 MB, 134217728 bytes

64 heads, 32 sectors/track, 128 cylinders

Units = cylinders of 2048 * 512 = 1048576 bytes

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdc1               1         128      131056   83  Linux

 

Disk /dev/sdd: 3221 MB, 3221225472 bytes

255 heads, 63 sectors/track, 391 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdd1               1         391     3140676   83  Linux

 

Disk /dev/sde: 3221 MB, 3221225472 bytes

255 heads, 63 sectors/track, 391 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sde1               1         391     3140676   83  Linux

 

Disk /dev/sdf: 1073 MB, 1073741824 bytes

255 heads, 63 sectors/track, 130 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdf1               1         130     1044193+  83  Linux

[root@node1 ~]# 

Node 2

[root@node2 ~]# fdisk -l

 

Disk /dev/sda: 42.9 GB, 42949672960 bytes

255 heads, 63 sectors/track, 5221 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *           1        4463    35849016   83  Linux

/dev/sda2            4464        5221     6088635   82  Linux swap / Solaris

 

Disk /dev/sdb: 134 MB, 134217728 bytes

64 heads, 32 sectors/track, 128 cylinders

Units = cylinders of 2048 * 512 = 1048576 bytes

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1               1         128      131056   83  Linux

 

Disk /dev/sdc: 134 MB, 134217728 bytes

64 heads, 32 sectors/track, 128 cylinders

Units = cylinders of 2048 * 512 = 1048576 bytes

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdc1               1         128      131056   83  Linux

 

Disk /dev/sdd: 3221 MB, 3221225472 bytes

255 heads, 63 sectors/track, 391 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdd1               1         391     3140676   83  Linux

 

Disk /dev/sde: 3221 MB, 3221225472 bytes

255 heads, 63 sectors/track, 391 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sde1               1         391     3140676   83  Linux

 

Disk /dev/sdf: 1073 MB, 1073741824 bytes

255 heads, 63 sectors/track, 130 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdf1               1         130     1044193+  83  Linux

[root@node2 ~]# 

节点2上的磁盘分区信息除/dev/sda可能不同之外,其它共享磁盘分区信息应该完全同节点1

13 配置裸设备以存放OCRVoting Disk

由于在Oracle 10g版本里,OCRVoting Disk还不支持存放在ASM磁盘里,所以,这里

需要将/dev/sdb1/dev/sdc1这两个硬盘分区作为裸设备来分别存放OCRVoting Disk

我们将使用udev来管理/dev/sdb1/dev/sdc12个设备:

编辑/etc/udev/rules.d/60-raw.rules 文件:

在其中加入下述内容:

ACTION==”add”, KERNEL==”/dev/sdb1″, RUN+=”/bin/raw /dev/raw/raw1 %N”

ACTION==”add”, ENV{MAJOR}==”8″, ENV{MINOR}==”17″, RUN+=”/bin/raw /dev/raw/raw1 %M %m”

 

ACTION==”add”, KERNEL==”/dev/sdc1″, RUN+=”/bin/raw /dev/raw/raw2 %N”

ACTION==”add”, ENV{MAJOR}==”8″, ENV{MINOR}==”33″, RUN+=”/bin/raw /dev/raw/raw2 %M %m”

 

KERNEL ==”raw[1-2]”, OWNER =”oracle”, GROUP =”oinstall”, MODE =”640″

 

编辑后:

[root@node1 rules.d]# pwd

/etc/udev/rules.d

[root@node1 rules.d]# ll

total 152

-rw-r–r– 1 root root   515 Jul  3  2009 05-udev-early.rules

-rw-r–r– 1 root root   900 Mar 31  2010 40-multipath.rules

-rw-r–r– 1 root root 15647 Jul  3  2009 50-udev.rules

-rw-r–r– 1 root root   471 Jul  3  2009 51-hotplug.rules

-rw-r–r– 1 root root   143 Jul  4  2009 60-net.rules

-rw-r–r– 1 root root  1088 Jun  6  2007 60-pcmcia.rules

-rw-r–r– 1 root root   628 Dec 19 21:23 60-raw.rules

-rw-r–r– 1 root root  9014 Apr  1  2010 60-wacom.rules

-rw-r–r– 1 root root   129 Apr  1  2010 61-uinput-stddev.rules

-rw-r–r– 1 root root   214 Apr  1  2010 61-uinput-wacom.rules

-rw-r–r– 1 root root  1823 Nov  5  2008 85-pcscd_ccid.rules

-rw-r–r– 1 root root   114 Nov  5  2008 90-alsa.rules

-rw-r–r– 1 root root    61 Jul  3  2009 90-dm.rules

-rw-r–r– 1 root root    82 Apr  1  2010 90-hal.rules

-rw-r–r– 1 root root   107 Jul  3  2009 95-pam-console.rules

-rw-r–r– 1 root root   292 Apr  1  2010 98-kexec.rules

-rw-r–r– 1 root root  2319 Jul 15  2008 bluetooth.rules

[root@node1 rules.d]# cat 60-raw.rules 

# Enter raw device bindings here.

#

# An example would be:

#   ACTION==”add”, KERNEL==”sda”, RUN+=”/bin/raw /dev/raw/raw1 %N”

# to bind /dev/raw/raw1 to /dev/sda, or

#   ACTION==”add”, ENV{MAJOR}==”8″, ENV{MINOR}==”1″, RUN+=”/bin/raw /dev/raw/raw2 %M %m”

# to bind /dev/raw/raw2 to the device with major 8, minor 1.

 

ACTION==”add”, KERNEL==”/dev/sdb1″, RUN+=”/bin/raw /dev/raw/raw1 %N”

ACTION==”add”, ENV{MAJOR}==”8″, ENV{MINOR}==”17″, RUN+=”/bin/raw /dev/raw/raw1 %M %m”

 

ACTION==”add”, KERNEL==”/dev/sdc1″, RUN+=”/bin/raw /dev/raw/raw2 %N”

ACTION==”add”, ENV{MAJOR}==”8″, ENV{MINOR}==”33″, RUN+=”/bin/raw /dev/raw/raw2 %M %m”

 

KERNEL ==”raw[1-2]”, OWNER =”oracle”, GROUP =”oinstall”, MODE =”640″

[root@node1 rules.d]# 

关于使用udev来管理Linux下的设备文件,具体可以查看链接:

http://www.ibm.com/developerworks/cn/linux/l-cn-udev/

该部分内容,不是本课程内容,不做过多阐述。

其中的ENV{MAJOR}ENV{MINOR}可以通过下述命令确定:

[root@node1 rules.d]# ll /dev/sd*

brw-r—– 1 root disk 8,  0 Dec 19 16:33 /dev/sda

brw-r—– 1 root disk 8,  1 Dec 19 16:34 /dev/sda1

brw-r—– 1 root disk 8,  2 Dec 19 16:33 /dev/sda2

brw-r—– 1 root disk 8, 16 Dec 19 16:33 /dev/sdb

brw-r—– 1 root disk 8, 17 Dec 19 21:20 /dev/sdb1

brw-r—– 1 root disk 8, 32 Dec 19 16:33 /dev/sdc

brw-r—– 1 root disk 8, 33 Dec 19 21:20 /dev/sdc1

brw-r—– 1 root disk 8, 48 Dec 19 16:33 /dev/sdd

brw-r—– 1 root disk 8, 49 Dec 19 21:20 /dev/sdd1

brw-r—– 1 root disk 8, 64 Dec 19 16:33 /dev/sde

brw-r—– 1 root disk 8, 65 Dec 19 21:20 /dev/sde1

brw-r—– 1 root disk 8, 80 Dec 19 16:33 /dev/sdf

brw-r—– 1 root disk 8, 81 Dec 19 21:20 /dev/sdf1

[root@node1 rules.d]# 

然后,启动udev:

[root@node1 rules.d]# /sbin/udevcontrol reload_rules

[root@node1 rules.d]# /sbin/start_udev 

Starting udev: [  OK  ]

[root@node1 rules.d]# 

 

之后,可以看到/dev/raw下的裸设备文件:

[root@node1 rules.d]# ll /dev/raw/*

crw-r—– 1 oracle oinstall 162, 1 Dec 19 21:31 /dev/raw/raw1

crw-r—– 1 oracle oinstall 162, 2 Dec 19 21:31 /dev/raw/raw2

[root@node1 rules.d]# 

 

Note

上述操作需要在双节点执行!且确保在双节点均可以看到裸设备文件,以及oracle用户具有对裸设备的权限!

 

14 安装asm软件包、创建ASM磁盘

选择与OS内核对应的软件包:

[root@node1 asm]# uname -rm

2.6.18-194.el5 x86_64

[root@node1 asm]# ll

total 244

-rw-r–r– 1 root root 137486 Dec 19 13:50 oracleasm-2.6.18-194.el5-2.0.5-1.el5.x86_64.rpm

-rw-r–r– 1 root root  13929 Dec 19 13:50 oracleasmlib-2.0.4-1.el5.i386.rpm

-rw-r–r– 1 root root  85687 Dec 19 13:50 oracleasm-support-2.1.7-1.el5.i386.rpm

[root@node1 asm]#

安装:

[root@node1 asm]# rpm -ivh oracleasm-support-2.1.7-1.el5.i386.rpm 

warning: oracleasm-support-2.1.7-1.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159

Preparing…                ########################################### [100%]

   1:oracleasm-support      ########################################### [100%]

[root@node1 asm]# rpm -ivh oracleasm-2.6.18-194.el5-2.0.5-1.el5.x86_64.rpm 

warning: oracleasm-2.6.18-194.el5-2.0.5-1.el5.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159

Preparing…                ########################################### [100%]

   1:oracleasm-2.6.18-194.el########################################### [100%]

[root@node1 asm]# rpm -ivh oracleasmlib-2.0.4-1.el5.i386.rpm 

warning: oracleasmlib-2.0.4-1.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159

Preparing…                ########################################### [100%]

   1:oracleasmlib           ########################################### [100%]

[root@node1 asm]#

Note

注意安装顺序,先安装oracleasm-support-2.1.7-1.el5.i386.rpm ,然后oracleasm-2.6.18-194.el5-2.0.5-1.el5.x86_64.rpm ,最后oracleasmlib-2.0.4-1.el5.i386.rpm

2 ASM软件包一定要选择与OS内核对应的软件包。

配置ASM驱动:

[root@node1 asm]# /etc/init.d/oracleasm configure

Configuring the Oracle ASM library driver.

 

This will configure the on-boot properties of the Oracle ASM library

driver.  The following questions will determine whether the driver is

loaded on boot and what permissions it will have.  The current values

will be shown in brackets (‘[]’).  Hitting <ENTER> without typing an

answer will keep that current value.  Ctrl-C will abort.

 

Default user to own the driver interface []: oracle

Default group to own the driver interface []: oinstall

Start Oracle ASM library driver on boot (y/n) [n]: y

Scan for Oracle ASM disks on boot (y/n) [y]: y

Writing Oracle ASM library driver configuration: done

Initializing the Oracle ASMLib driver: [  OK  ]

Scanning the system for Oracle ASMLib disks: [  OK  ]

[root@node1 asm]# /etc/init.d/oracleasm status

Checking if ASM is loaded: yes

Checking if /dev/oracleasm is mounted: yes

[root@node1 asm]# 

Note

上述操作需要在双节点上完成!

在配置oracleasm时,要选择正确的用户、用户组,这里是oracleoinstall组。

创建ASM磁盘:

这里选择将/dev/sdd1/dev/sdf1分别创建为ASMDISK1ASMDISK2

[root@node1 asm]# /etc/init.d/oracleasm createdisk ASMDISK1 /dev/sdd1

Marking disk “ASMDISK1” as an ASM disk: [  OK  ]

[root@node1 asm]# /etc/init.d/oracleasm createdisk ASMDISK2 /dev/sde1

Marking disk “ASMDISK2” as an ASM disk: [  OK  ]

[root@node1 asm]# /etc/init.d/oracleasm listdisks

ASMDISK1

ASMDISK2

[root@node1 asm]# 

创建ASM磁盘操作,只需在任意节点上执行即可。然后,再另一节点上执行scandisks:

[root@node2 asm]# /etc/init.d/oracleasm scandisks

Scanning the system for Oracle ASMLib disks: [  OK  ]

[root@node2 asm]# /etc/init.d/oracleasm listdisks

ASMDISK1

ASMDISK2

[root@node2 asm]# 

一步一步在OEL5.5 64位Linux上安装Oracle 10gR2 RAC(1)

概述:

    继本人上一个系列的Oracle 11gR2 RAC+DG项目实战教程发布已一年有余,在此期间,那个系列的教程得到众多网友的喜爱与好评,更是在互联网上畅销不衰。为此,众多网友也一直希望本人推出Oracle 10gR2 RAC的系列教程,恰逢前不久,深圳某客户需要将一套Oracle 10gR2双节点RAC生产数据库升级至Oracle 11gR2 RAC,所以便有了本系列实战的教程。

为更贴切还原生产过程中的实际操作,本系列教程一个分两大部分:

第一部分从零开始一步一步搭建一套在OEL 5.5 X86_64位环境下的双节点10gR2 RAC数据库,并将数据库升级至10.2.0.5.0版本。

第二部分,一步一步将10gR2 RAC升级至Oracle 11gR2 RAC,数据库版本选择11g最新的11.2.0.4.0版本。

 

第一部分主要步骤:

一、准备软件;

二、配置虚拟机;

三、配置/etc/hosts文件;

四、建用户、改口令、修改用户配置文件;

五、建路径、改权限

六、修改/etc/security/limits.conf,配置oraclegrid用户的shell限制

七、修改/etc/pam.d/login配置文件

八、修改/etc/profile文件

九、修改内核配置文件

十、 配置oracle用户SSH对等性

十一、 配置共享磁盘

十二、 在共享磁盘上创建分区

十三、 配置裸设备以存放OCRVoting Disk

十四、 安装asm软件包、创建ASM磁盘

十五、 安装clusterware软件

十六、 升级clusterware软件

十七、 安装oracle软件

十八、 升级oracle软件

十九、 创建RAC监听

二十、 创建ASM磁盘组、RAC数据库

准备软件:

软件名称

官方下载

百度网盘

360网盘

OEL 5.5 X86_64

https://edelivery.oracle.com/linux

http://pan.baidu.com/share/link?shareid=513608932&uk=3409299182

http://yunpan.cn/QDHwHk63tepJU

VMware Server

http://www.vmware.com/download/server/

http://pan.baidu.com/share/link?shareid=765358990&uk=3409299182

http://yunpan.cn/QDHwcLuECp2Lp

10201_clusterware_linux_x86_64

N/A 

http://pan.baidu.com/share/link?shareid=1472026032&uk=3409299182

http://yunpan.cn/QDBQw49Thgjdz

10201_database_linux_x86_64

N/A

http://pan.baidu.com/share/link?shareid=1472026032&uk=3409299182

http://yunpan.cn/QDBQw49Thgjdz

p8202632_10205_Linux-x86-64

N/A

http://pan.baidu.com/share/link?shareid=1472026032&uk=3409299182

http://yunpan.cn/QDBQw49Thgjdz

p13390677_112040_Linux-x86-64_3of7  [Grid软件] 

N/A

http://pan.baidu.com/share/link?shareid=1479956116&uk=3409299182

http://yunpan.cn/QDBQaw93MzR8z

p13390677_112040_Linux-x86-64_1of7

p13390677_112040_Linux-x86-64_2of7  [Oracle软件] 

N/A

http://pan.baidu.com/share/link?shareid=1479956116&uk=3409299182

http://yunpan.cn/QDBQaw93MzR8z

Oracle ASM软件包

N/A

http://pan.baidu.com/s/1mgK6aYO

 请稍后

2 配置虚拟机,安装OEL 5.5 X86_64Linux操作系统

    这里,我们需要在VMware ESXi Version 4.0的虚拟主机上创建两台虚拟机,其中每台机器至少需要配置双网卡,一块网卡作为Public,另一块作为Private,建议IP地址均选择手动配置,而不是DHCP动态分配,且要求指定的IP在网络里是唯一的。主机名也分别要求指定为唯一,避免冲突。主机名、IP地址在前期规划要慎重,一经指定,最好不要轻易改变,避免一些不必要的麻烦。这里列出两台机器前期规划的主机名、IP地址信息:

Hostname

Hostname alias

Type   

IP Address

Interface

node1.oracleonlinux.cn

node1

Public IP

172.16.0.33

eth0

node1-vip.oracleonlinux.cn

node1-vip

Virtual IP

172.16.0.35

eth0:1

node1-priv.oracleonlinux.cn

node1-priv

Private IP

192.168.94.11

eth1

node2.oracleonlinux.cn

node2

Public IP

172.16.0.34

eth0

node2-priv.oracleonlinux.cn

node2-vip

Virtual IP

172.16.0.36

eth0:1

node2-priv.oracleonlinux.cn

node2-priv

Private IP

192.168.94.12

eth1

scan-cluster.oracleonlinux.cn

scan-cluster

SCAN IP

172.16.0.223

eth0

                              (Figure 1.1网络配置信息表)

Note

上述中配置的SCAN IP是为后期我们将10gR2 RAC 升级到11gR2 RAC预留的。

     其中,每台机器至少需要配置3IP地址,在安装操作系统的过程中,我们需要配置公网IP和私有IP即可,虚拟IP在安装集群件时自动配置。Public IPVirtual IPSCAN IP必须配置在同一网段。SCAN IPOracle 11g新推出的,在配置11g RAC时需要指定。我们的SCAN IP通过配置DNS服务器来实现。

配置/etc/hosts文件

参照上述1.1网络配置信息表来配置/etc/hosts文件。在双节点上均需执行。

节点1

[root@node1 ~]# hostname 

node1.oracleonlinux.cn

[root@node1 ~]# cat /etc/hosts

# Do not remove the following line, or various programs

# that require network functionality will fail.

127.0.0.1               localhost

::1             localhost6.localdomain6 localhost6

 

 

# public

172.16.0.33     node1.oracleonlinux.cn       node1

172.16.0.34     node2.oracleonlinux.cn       node2

 

# private

192.168.94.11   node1-priv.oracleonlinux.cn  node1-priv

192.168.94.12   node2-priv.oracleonlinux.cn  node2-priv

 

 

# virtual

172.16.0.35     node1-vip.oracleonlinux.cn   node1-vip

172.16.0.36     node2-vip.oracleonlinux.cn   node2-vip

 

# scan-ip

172.16.0.223            scan-cluster.oracleonlinux.cn        scan-cluster

[root@node1 ~]# 

节点2

[root@node2 ~]# cat /etc/hosts

# Do not remove the following line, or various programs

# that require network functionality will fail.

127.0.0.1               localhost

::1             localhost6.localdomain6 localhost6

 

 

 

# public

172.16.0.33     node1.oracleonlinux.cn       node1

172.16.0.34     node2.oracleonlinux.cn       node2

 

# private

192.168.94.11   node1-priv.oracleonlinux.cn  node1-priv

192.168.94.12   node2-priv.oracleonlinux.cn  node2-priv

 

 

# virtual

172.16.0.35     node1-vip.oracleonlinux.cn   node1-vip

172.16.0.36     node2-vip.oracleonlinux.cn   node2-vip

 

# scan-ip

172.16.0.223            scan-cluster.oracleonlinux.cn        scan-cluster

[root@node2 ~]# 

建用户、改口令、修改用户配置文件;

root用户执行事先配置的脚本1preuser_dir.sh,脚本具体内容请见附件1在双节点上均需执行。

[root@node1 shell]# pwd

/root/media/shell

[root@node1 shell]# ll

total 24

-rw-r–r– 1 root root 1625 Dec 19 14:10 1preuser_dir.sh

-rw-r–r– 1 root root  477 Dec 19 14:11 2predir.sh

-rw-r–r– 1 root root  631 Dec 19 14:11 3prelimits.sh

-rw-r–r– 1 root root  465 Dec 19 14:11 4prelogin.sh

-rw-r–r– 1 root root  632 Dec 19 14:12 5preprofile.sh

-rw-r–r– 1 root root  931 Dec 19 14:12 6presysctl.sh

[root@node1 shell]# 

[root@node1 shell]# sh 1preuser_dir.sh 

Now create two groups named ‘oinstall’ and ‘dba’, plus a user named ‘oracle’.Also setting the Environment

Now create the necessary directory for oracle user and change the authention to oracle user…

Changing password for user oracle.

passwd: all authentication tokens updated successfully.

The two groups named ‘oinstall’ and ‘dba’ plus the oracle user has been created.

The Environment variable for oracle user also has been setted sussessfully.

[root@node1 shell]# 

Note

节点2上执行该脚本时,需要将脚本中的ORACLE_SID改为devdb2,或者根据实际情况修改为自己的SID

建路径、改权限

root用户执行事先配置的脚本2predir.sh,脚本具体内容请见附件1root用户在双节点上均需执行。

执行命令:sh 2predir.sh

脚本执行具体过程及输出,不再赘述。

修改/etc/security/limits.conf,配置oraclegrid用户的shell限制

root用户执行事先配置的脚本3prelimits.sh,脚本具体内容请见附件1root用户在双节点上均需执行。

执行命令:sh 3prelimits.sh

脚本执行具体过程及输出,不再赘述。

修改/etc/pam.d/login配置文件

root用户执行事先配置的脚本4prelogin.sh,脚本具体内容请见附件1root用户在双节点上均需执行。

执行命令:sh 4prelogin.sh

脚本执行具体过程及输出,不再赘述。

修改/etc/profile文件

root用户执行事先配置的脚本5preprofile.sh,脚本具体内容请见附件1root用户在双节点上均需执行。

执行命令:sh 5preprofile.sh

脚本执行具体过程及输出,不再赘述。

修改内核配置文件

root用户执行事先配置的脚本6presysctl.sh,脚本具体内容请见附件1root用户在双节点上均需执行。

执行命令:sh 6presysctl.sh

脚本执行具体过程及输出,不再赘述。

10 配置oracle用户SSH对等性

Node1:

[root@node1 ~]# su – oracle

node1-> hostname 

node1.oracleonlinux.cn

node1-> mkdir ~/.ssh

node1-> chmod 700 ~/.ssh

node1-> ls -al

total 44

drwx—— 4 oracle oinstall 4096 Dec 19 14:28 .

drwxr-xr-x 3 root   root     4096 Dec 19 14:18 ..

-rw——- 1 oracle oinstall   18 Dec 19 14:28 .bash_history

-rw-r–r– 1 oracle oinstall   33 Dec 19 14:18 .bash_logout

-rw-r–r– 1 oracle oinstall  544 Dec 19 14:18 .bash_profile

-rw-r–r– 1 oracle oinstall  124 Dec 19 14:18 .bashrc

-rw-r–r– 1 oracle oinstall  515 Dec 19 14:18 .emacs

drwxr-xr-x 4 oracle oinstall 4096 Dec 19 14:18 .mozilla

drwx—— 2 oracle oinstall 4096 Dec 19 14:28 .ssh

-rw-r–r– 1 oracle oinstall  658 Dec 19 14:18 .zshrc

node1-> ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/home/oracle/.ssh/id_rsa): 

Enter passphrase (empty for no passphrase): 

Enter same passphrase again: 

Your identification has been saved in /home/oracle/.ssh/id_rsa.

Your public key has been saved in /home/oracle/.ssh/id_rsa.pub.

The key fingerprint is:

fe:9a:d5:0a:c6:68:4e:c9:b2:af:7f:ad:a0:f9:07:c9 oracle@node1.oracleonlinux.cn

node1-> ssh-keygen -t dsa 

Generating public/private dsa key pair.

Enter file in which to save the key (/home/oracle/.ssh/id_dsa): 

Enter passphrase (empty for no passphrase): 

Enter same passphrase again: 

Your identification has been saved in /home/oracle/.ssh/id_dsa.

Your public key has been saved in /home/oracle/.ssh/id_dsa.pub.

The key fingerprint is:

4a:e4:b0:a5:d6:74:18:0b:39:c3:0f:cc:59:b2:23:18 oracle@node1.oracleonlinux.cn

node1-> 

Node2

[root@node2 ~]# su – oracle

node2-> hostname 

node2.oracleonlinux.cn

node2-> mkdir ~/.ssh

node2-> chmod 700 ~/.ssh

node2-> ls -al

total 72

drwx—— 4 oracle oinstall 4096 Dec 19 14:30 .

drwxr-xr-x 3 root   root     4096 Dec 19 14:26 ..

-rw-r–r– 1 oracle oinstall   33 Dec 19 14:26 .bash_logout

-rw-r–r– 1 oracle oinstall  544 Dec 19 14:26 .bash_profile

-rw-r–r– 1 oracle oinstall  124 Dec 19 14:26 .bashrc

-rw-r–r– 1 oracle oinstall  515 Dec 19 14:26 .emacs

drwxr-xr-x 4 oracle oinstall 4096 Dec 19 14:26 .mozilla

drwx—— 2 oracle oinstall 4096 Dec 19 14:30 .ssh

-rw-r–r– 1 oracle oinstall  658 Dec 19 14:26 .zshrc

node2-> ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/home/oracle/.ssh/id_rsa): 

Enter passphrase (empty for no passphrase): 

Enter same passphrase again: 

Your identification has been saved in /home/oracle/.ssh/id_rsa.

Your public key has been saved in /home/oracle/.ssh/id_rsa.pub.

The key fingerprint is:

40:21:4a:ef:c7:3d:1e:48:fa:5e:45:ce:57:60:df:6c oracle@node2.oracleonlinux.cn

node2-> ssh-keygen -t dsa

Generating public/private dsa key pair.

Enter file in which to save the key (/home/oracle/.ssh/id_dsa): 

Enter passphrase (empty for no passphrase): 

Enter same passphrase again: 

Your identification has been saved in /home/oracle/.ssh/id_dsa.

Your public key has been saved in /home/oracle/.ssh/id_dsa.pub.

The key fingerprint is:

50:4d:9c:dd:d0:92:ac:e6:d0:d1:e8:1d:1a:cb:b2:08 oracle@node2.oracleonlinux.cn

node2-> 

重新回到节点1

node1-> hostname 

node1.oracleonlinux.cn

node1-> cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys

node1-> cat ~/.ssh/id_dsa.pub >>~/.ssh/authorized_keys

node1-> ssh node2 cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys

The authenticity of host ‘node2 (172.16.0.34)’ can’t be established.

RSA key fingerprint is 42:bc:46:40:87:81:b7:23:d1:6b:0a:b3:1c:04:cd:ed.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added ‘node2,172.16.0.34’ (RSA) to the list of known hosts.

oracle@node2’s password: 

node1-> ssh node2 cat ~/.ssh/id_dsa.pub >>~/.ssh/authorized_keys 

oracle@node2’s password: 

node1-> scp ~/.ssh/authorized_keys node2:~/.ssh/authorized_keys 

oracle@node2’s password: 

authorized_keys                                                    100% 2060     2.0KB/s   00:00    

node1-> 

验证oracle用户的SSH对等性:

node1-> ssh node1 date

Thu Dec 19 16:39:31 CST 2013

node1-> ssh node2 date

Thu Dec 19 16:39:35 CST 2013

node1-> ssh node1-priv date

Thu Dec 19 16:39:45 CST 2013

node1-> ssh node2-priv date

Thu Dec 19 16:39:49 CST 2013

node1-> ssh node1.oracleonlinux.cn date

Thu Dec 19 16:40:16 CST 2013

node1-> ssh node2.oracleonlinux.cn date

Thu Dec 19 16:40:20 CST 2013

node1-> ssh node1-priv.oracleonlinux.cn date

Thu Dec 19 16:40:30 CST 2013

node1-> ssh node2-priv.oracleonlinux.cn date

Thu Dec 19 16:40:35 CST 2013

node1-> 

Note

2个节点上以oracle用户可以顺利执行上述命令,而不再提示需要oracle用户的密码,则说明配置成功!

致淘宝卖家及买家的两封信

致其他各家“代售”本人视频淘宝店主的一封感谢信!

各位亲:

你们知道吗?

本系列教程中涉及所有文字、图片、视频、音频、代码、脚本皆为本人原创内容~

不过,本人偷偷小声的告诉你们,这些内容的拥有、复制和使用权,归我,也归你们各位亲啦~

因为,正是有了你们的大力推广和销售,才能得以顺利高效的将本人所学的一丁点儿Oracle数据库知识可以精准的传递给更多更多需要学习Oracle数据库知识的网友们撒~

同时,请允许我替那些已经或者将要通过本系列视频收获Oracle数据库知识网友们,向你们各位日夜坚守在电脑前的各位亲们,说声:“谢谢!”。

各 位亲,本人欢迎你们继续对本系列视频教程使用各种无上限无底限想得到的用的上的用的着的派的上用场的方式去推广和持续捧场,这样一来捏,你们各位亲或许能 挣点儿豆浆油条稀饭钱儿,二来捏更为重要的是,你们可以继续将我的知识传递给更多更多各种迫切需要学习奋斗充电、为求知为求职、为加薪为跳槽的各种日夜奋 战在IT一线的同行们!!!

好了,不跟你们诸位亲多说了,bye…..

 

致各位淘宝买家的一封信!

更亲的各位亲:

你们还不知道吧?

虽然上述的那些亲们曾经不止一次再来一次的打击我幼小的心灵,但是,我不依然活的潇洒过的自在?懒得跟那些“臭”亲们计较,哼…

而且呢,我也知道之前有诸多诸多的你们是从他们那些“臭”亲那里拍下的视频宝贝,然后通过视频内容找到我的网站[http://www.oracleonlinux.cn/]、我的QQ[155166225]、我的Rock Orcle QQ群[280889316]、我的邮箱[3dian14@gmail.com],然后各种视频疑问和问题QQ我,各种脚本需求邮件我,试问,我曾经拒绝过吗?曾经某一段时间,我每天需要回复你们的邮件就有几十封,QQ上提问的就更不必说了,苍天大地啊,偶也Hold不住呀…

    当然呢,更应该感谢的就是你们各位更亲的亲啦,有了你们一如既往的支持和鼓励,才能激发我创作更多更高质量的视频。

    好了,也不跟你们各位亲多说啦,你们要记得哦,近期本店将隆重推出多套Oracle数据库相关视频作品,包括Oracle 11gR2 OCP认证系列Oracle 10g RAC 升级至11gRACOracle性能优化等等系列;还有哦,这些视频将是我扛鼎制作,本店是全网唯一渠道,其他家没有滴哦~

    点击可查看原文链接,或者这个链接进入淘宝店铺

关于AWR报告中几个命中率指标的初步解释

            从Oracle 10g开始,Oracle给广大DBA提供了一个性能优化的利器,那便是Automatic Workload Repository性能报告。

            在拿到一份AWR性能报告后,通过分析AWR报告来定位数据库性能问题时,在AWR报告的报告头中,我们会看到类似如下的一些命中率指标:

Instance Efficiency Percentages [Target 100%]

 

Buffer Nowait %: 99.87 Redo NoWait %: 99.95
Buffer Hit %: 95.89 In-memory Sort %: 100.00
Library Hit %: 86.87 Soft Parse %: 99.26
Execute to Parse %: 91.37 Latch Hit %: 99.73
Parse CPU to Parse Elapsd %: 53.78 % Non-Parse CPU: 98.18

 

           那么,这些关于Oracle内存的几个关键指标以及Instance效率的几个指标又该如何理解呢?

           1 这几个指标重要,但是通过这些命中率指标并非就可以定位到问题的关键所在。如上,我们看到各项指标基本都很高,除Parse CPU to Parse Elapsd %:只有53.78%之外,但是,该统计数据是来自于一则生产环境下出现严重性能问题的一个小时采样数据。

           2 分别对上述表格中各项指标作一初步解释:

               ① Buffer Nowait %:表示会话向Database Buffer Cache【数据高速缓冲区】 申请1个缓存时不等待的比例;

               ② Buffer Hit %:表示数据高速缓冲区的命中率,也叫Cache Hit Ratio。该指标要分实际业务系统类型来分析,如OLAP系统,该值可能为20%就算合理,而对于OLTP系统来讲,理想值应该在90%以上。当然,并非该值达到100%就没问题了,系统中可能依然难以避免物理读等待。计算脚本:

SELECT (1 - (phys.value / (db.value + cons.value))) * 100 AS "Buffer Cache Hit Ratio"                                            
FROM   v$sysstat phys,                                    
       v$sysstat db,                                      
       v$sysstat cons                                     
WHERE  phys.name  = 'physical reads'                      
AND    db.name    = 'db block gets'                       
AND    cons.name  = 'consistent gets';                    

               ③ Library Hit %:Library Cache Hit Ration【库高速缓冲区命中率】,表示向共享池的Library Cache中申请1个Library Cache Object对象时,其已经在Library Cache中存在的比例。该指标的一个合理值应该达到95%以上。计算脚本:

SELECT (1 -(Sum(reloads)/(Sum(pins) + Sum(reloads)))) * 100 AS "Library Cache Hit Ratio"                                              
FROM   v$librarycache;                                      

               ④ Execute to Parse %:表示执行解析比,目标是希望一次解析多次执行,计算公式=[1-(parse count (total)/(execute count)]%=[1-1257816/14576118]%=91.37%,其中parse count (total)来源于V$SYSSTAT中的parse count (total)字段值,execute count则取值于execute count的字段值。同时在同一份AWR报告中,parse count (total)execute count的值可以从AWR报告的Instance Activity Stats章节中获取,如下摘录

Instance Activity Stats

  • Ordered by statistic name
Statistic Total per Second per Trans
Batched IO (bound) vector count 560,211 157.69 28.15
CPU used by this session 1,434,831 403.88 72.10
。。。。。 。。。 。。。 。。。
execute count 14,576,118 4,102.96 732.43
。。。。。 。。。 。。。 。。。
parse count (describe) 9 0.00 0.00
parse count (failures) 28 0.01 0.00
parse count (hard) 9,364 2.64 0.47
parse count (total) 1,257,816 354.06 63.20
parse time cpu 26,723 7.52 1.34
parse time elapsed 49,687 13.99 2.50
redo entries 7,072,485 1,990.80 355.38
redo log space requests 3,665 1.03 0.18
。。。。。 。。。 。。。 。。。
sorts (disk) 7 0.00 0.00
sorts (memory) 22,108,325 6,223.16 1,110.92
。。。。。 。。。 。。。 。。。
。。。。。 。。。 。。。 。。。
write clones created in foreground 2,243 0.63 0.11

               ⑤ Parse CPU to Parse Elapsd %:该指标表示解析消耗的CPU时间与解析消耗的总时间的比值,目标同样是100%。我们当然希望解析的过程中,时间都消耗在CPU上,而不希望在解析的过程中,出现其他等待事件而拉长解析消耗的总时间。如果该指标偏低的话,说明在解析的过程中,除了消耗CPU资源外,还有其它等待事件,如等待共享池对象、闩锁。计算公式=[parse time cpu/parse time elapsed]%,parse time cpu和parse time elapsed同样来自于V$SYSSTAT,也可以参照AWR报告中Instance Activity Stats章节中的数据,如:Parse CPU to Parse Elapsd %:=[26723/49687]%=53.78%。

               ⑥ Redo NoWait %:表示会话写Redo Entry时不等待的比例。计算公式=[1-redo log space requests/redo entries]%,同样该两项指标来自于V$SYSSTAT字典表,也可以参照AWR报告中Instance Activity Stats章节中的数据,如Redo NoWait %:=[1-3665/7072485]%=[1-0.0005]%=99.95%。

                ⑦ In-memory Sort %:表示在内存中排序的比例。计算公式=[1-sorts (disk)/sorts (memory)]%,同样该两项指标来自于V$SYSSTAT字典表,也可以参照AWR报告中Instance Activity Stats章节中的数据,如In-memory Sort %:=[1-7/22108325]%=99.9999%。

         

               ⑧ Soft Parse %:表示软解析比例。计算公式=【1-parse count (hard)/parse count (total)】,同样该两项指标来自于V$SYSSTAT字典表,也可以参照AWR报告中Instance Activity Stats章节中的数据,如Soft Parse %:=[1-9364/1257816]%=99.26%。         

               ⑨ Latch Hit %:表示以 willing-to-wait 方式去获取内存栓锁的命中率指标,通常这个指标要求至少在99%以上,否则,很有可能意味着大量栓锁等待,影响性能。该值来源于V$LATCH字典表中的GETS和MISSES字段值计算脚本:

SELECT (1 - (Sum(misses) / Sum(gets))) * 100 AS "Latch Hit Ratio"                               
FROM   v$latch;                              

               ⑩ % Non-Parse CPU:表示除解析之外CPU的使用率,计算公式=【1-(parse time cpu)/(CPU used by this session)】%。同样该两项指标来自于V$SYSSTAT字典表,也可以参照AWR报告中Instance Activity Stats章节中的数据,如% Non-Parse CPU:=[1-26723/1434831]%=98.18%。        

同时遭遇row cache lock和enq: US – contention的等待事件

        上周五,接到项目组同事电话通知,说某客户应用系统无法登陆。我在应用服务器端用PL/SQL Developer尝试连接数据库服务器时,报错“ORA-00018:maximum number of sessions exceeded”,显然又是连接数不够用了。

         就电话回复同事说,赶紧检查一下各应用服务器的连接情况,原因是数据库连接数又不够用了。结果,同事接完电话之后,直接关闭了其中的一台IIS应用服务器,然后再启动这台IIS应用服务器。结果是,应用系统恢复了使用,大约20分钟后,却带了整个数据库的性能急剧下降,数据库Hung住,几乎不可用的状态。

        这是一套Windows 2003+10.2.0.5 X64的双节点RAC系统,接下来,就迅速抓取AWR报告,进行问题的定位:

        节点1的报告头:

  Snap Id Snap Time Sessions Cursors/Session
Begin Snap: 6981 01-3月 -13 14:00:17 64 14.9
End Snap: 6982 01-3月 -13 15:00:13 186 17.2
Elapsed:   59.94 (mins)    
DB Time:   2,215.01 (mins)    

        节点2的报告头:

  Snap Id Snap Time Sessions Cursors/Session
Begin Snap: 6981 01-3月 -13 14:00:14 65 14.2
End Snap: 6982 01-3月 -13 15:14:21 178 25.0
Elapsed:   74.12 (mins)    
DB Time:   2,991.16 (mins)    

        从上可以看到,在每个节点上,这一时段的数据库负载都很高,至少要比正常业务期间负载高出很多。同时,也看到,数据库连接数出现较为不太正常的连接。

       节点1的Top 5事件

Event Waits Time(s) Avg Wait(ms) % Total Call Time Wait Class
db file sequential read 210,093 48,731 232 36.7 User I/O
enq: US – contention 73,040 36,420 499 27.4 Other
log file sync 146,401 14,330 98 10.8 Commit
row cache lock 11,636 13,801 1,186 10.4 Concurrency
CPU time   9,314   7.0  

        节点2的Top 5事件:

Event Waits Time(s) Avg Wait(ms) % Total Call Time Wait Class
row cache lock 33,305 49,524 1,487 27.6 Concurrency
enq: US – contention 94,368 46,710 495 26.0 Other
db file sequential read 450,346 38,795 86 21.6 User I/O
CPU time   16,797   9.4  
direct path write temp 18,587 13,857 746 7.7 User I/O

        看到,在2个节点上均出现了row cache lock和enq: US – contention的等待事件,尤其是第2个节点上更为严重。对于row cache lock等待事件,之前曾遇到过相关案例,原因同样是由于高并发的RAC环境下,sequence没有CACHE,迅速定位并解决了这个问题。

        那么,这个enq: US – contention等待事件究竟是什么呢?Google之,找到了类似的案例:异常终止会话导致系统被Hung,以及ITPUB上的一篇帖子:row cache lock+us contention=宕机
        原来,导致enq: US – contention等待事件的原因是Undo表空间不够导致的。结合上述案例的提示,原来是因为同事直接停止IIS应用服务器,导致Oracle需要回滚之间的事务,这样,如果之前的事务比较大的话,那么整个回滚的时间也将越长。同时,还有一种可能就是,当初的ACTIVE事务因为停止IIS导致了被强制终止,这样一来,该事务占有的回滚段资源没有释放出来。等到IIS重启之后,新连接上来的会话因为事务操作,需要分配新的UNDO表空间,结果导致了enq: US – contention等待事件。

        参照上述的两则案例,找出紧急解决办法,由于是RAC,这里交叉重启了2个节点,最后问题得到解决。         

如何正确手工启动Windows下的Oracle RAC数据库?

           这是一则来自于某德国客户生产环境的RAC数据库启动出现故障的案例,记录下来一是用于对自己的警醒,二是可以同广大网友分享。

           操作系统环境:Windows Server 2008 R2 Enterprise version 6.1(Build 7601:Service Pack 1)

           数据库环境:10gR2 10.2.0.5.0的64位RAC双节点数据库;

           上周末,在顺利地对RAC数据库的几张分区表做调整之后,正常关闭RAC数据库,并重新启动2台Windows 2008 R2的操作系统之后,尝试启动Oracle CRS时,发现报错:

           1 在任何一个节点的服务项里,启动OracleCRService服务时,报错,其中OracleCSService的状态一直停留在Starting状态,其它服务项无任何变化;

           2 重启Windows服务器后,使用$CRS_HOME\bin\crsctl start crs在命令行尝试启动CRS时,依然报错;

           3 接下去,开始检查CRS的错误日志:在C:\oracle\product\10.2.0\crs\log\dehamora002\crsd\crsd.log日志文件中看到下述报错信息:

             

2012-12-08 11:52:52.606: [  OCRMAS][3876]th_master:13: I AM THE NEW OCR MASTER at incar 2. Node Number 2
2012-12-08 11:52:52.606: [  OCROSD][3876]utgdv:11:could not read reg value ocrmirrorconfig_loc os error= The system could not find the environment option that was entered.

2012-12-08 11:52:52.621: [  OCROSD][3876]utgdv:11:could not read reg value ocrmirrorconfig_loc os error= The system could not find the environment option that was entered.

2012-12-08 11:52:52.637: [  OCRRAW][3876]proprioo: for disk 0 (\\.\ocrcfg), id match (1), my id set (1381592635,1028247821) total id sets (1), 1st set (1381592635,1028247821), 2nd set (0,0) my votes (2), total votes (2)
2012-12-08 11:52:52.715: [  OCRMAS][3876]th_master: Deleted ver keys from cache (master)

从上可以看出,问题应该是出现在服务器访问共享存储时出现的。果然,在远程联系德国汉堡客户IT人员检查后,发现是服务器同存储间出现了问题,协调并解决该错误。

 

           4 再次重启Windows,并尝试启动CRS时,C:\oracle\product\10.2.0\crs\log\dehamora002\cssd\cssdOUT.log日志文件中看到下述报错信息:

Oracle Database 10g CSS Release 10.2.0.5.0 Production Copyright 1996, 2004, Oracle.  All rights reserved.
12/08/12 12:02:06  ssmain_run_css:  launching boot check 1 with c:\oracle\product\10.2.0\crs\bin\crsctl.exe check boot
OCR initialization failed accessing OCR device: PROC-26: Error while accessing the physical storage Operating System error [The system cannot find the file specified.

] [2]
12/08/12 12:02:06  ssmain_run_css:  boot check returned 8, looping
12/08/12 12:02:07  ssmain_run_css:  launching boot check 2 with c:\oracle\product\10.2.0\crs\bin\crsctl.exe check boot
OCR initialization failed accessing OCR device: PROC-26: Error while accessing the physical storage Operating System error [The system cannot find the file specified.

] [2]
12/08/12 12:02:07  ssmain_run_css:  boot check returned 8, looping
12/08/12 12:02:08  ssmain_run_css:  launching boot check 3 with c:\oracle\product\10.2.0\crs\bin\crsctl.exe check boot
OCR initialization failed accessing OCR device: PROC-26: Error while accessing the physical storage Operating System error [The system cannot find the file specified.

] [2]

           通过查询Metalink:

Can not Start CRS on Windows Cluster [ID 1115153.1]

How to Start (or stop) 10gR2 or 11gR1 Oracle Clusterware Services Manually in Windows [ID 729512.1]

OracleCSService does not start – PROC-26 error possible [ID 305093.1]

           找到产生问题的原因:原来这套RAC环境下的所有Oracle服务都是手工启动的方式,正常情况下,手工启动OracleCRService服务时,会自动启动依赖的相关服务。而该环境下,oracle并没有如我们期待的那样去启动与OracleCRService相关的服务。

           准确定位到原因后,解决问题的办法其实也很简单,就是如Metalink文档上说明的方案,手工依次启动.  OracleObjectService OracleClusterVolumeService OracleCSServiceOracleEVMService、OracleCRService  很快,RAC数据库重新正常启动!

        启示:

      1 对于Windows环境下的RAC,最好是将OracleObjectService的启动类型置为自动启动;

        2 如果上述服务是手工启动的,那么正确手工启动Windows下的Oracle RAC数据库的顺序依次是:OracleObjectService OracleClusterVolumeService(if using OCFS) OracleCSServiceOracleEVMServiceOracleCRService          

解决一则enq: TX – row lock contention的性能故障

            上周二早上,收到项目组的一封邮件:

       早上联代以下时间点用户有反馈EDI导入“假死”,我们跟踪了EDI导入服务,服务是正常在跑,可能是处理的慢所以用户感觉是“假死”了,请帮忙从数据库中检查跟踪以下时间点是否有“异常”操作,多谢!

        2012-11-20 9:10:10~~~~9:55:13,这个时间点内一共反馈了3次,大概是10~20分钟“假死”一次,请帮忙跟踪检查,多谢!

        这是一套Windows RAC的环境,也是之前处理  解决一则row cache lock引起的性能故障 那套环境。下面记录一下处理的经过:
1 对这一个小时进行AWR的收集和分析,首先,从报告头中看到DB Time达到近500分钟,(DB Time)/Elapsed=8,这个比值偏高:
  Snap Id Snap Time Sessions Cursors/Session
Begin Snap: 15142 20-11月-12 09:00:05 62 5.8
End Snap: 15143 20-11月-12 10:00:56 74 8.3
Elapsed:   60.85 (mins)    
DB Time:   492.88 (mins)    
 
2 再看TOP 5事件:
看到排在第一位的是enq: TX – row lock contention事件,也就是说系统中在这一个小时里产生了较为严重的行级锁等待事件。

Top 5 Timed Events

Event Waits Time(s) Avg Wait(ms) % Total Call Time Wait Class
CPU time   21,215   71.7  
enq: TX – row lock contention 12,232 6,013 492 20.3 Application
gc cr multi block request 14,696,067 1,675 0 5.7 Cluster
gc buffer busy 441,472 719 2 2.4 Cluster
db file sequential read 4,191 25 6 .1 User I/O
 
 
通常,产生enq: TX – row lock contention事件的原因有以下几种可能:
  • 不同的session更新或删除同一条记录;
  • 唯一索引有重复索引;
  • 位图索引同时被更新或同时并发的向位图索引字段上插入相同字段值;
  • 并发的对同一个数据块上的数据进行update操作;
  • 等待索引块完成分裂

同时,从段的统计信息章节中,也看到下面的信息:
Segments by Row Lock Waits
  • % of Capture shows % of row lock waits for each top segment compared
  • with total row lock waits for all segments captured by the Snapshot
Owner Tablespace Name Object Name Subobject Name Obj. Type Row Lock Waits % of Capture
SUNISCO SUNISCO_DATA1 BIND_PROCESS_LOG_REFNO   INDEX 159 67.66
SUNISCO FDN_EDI_I01 IDX_EDI_WORK_QUEUE_1   INDEX 29 12.34
SUNISCO SUNISCO_DATA1 IND_EDI_CUSTOMER_TYPE_CODE   INDEX 15 6.38
SUNISCO SUNISCO_DATA1 IDX_EDI_MESSAGE_1   INDEX 14 5.96
SUNISCO FDN_BASE_T01 BSE_NUM_LIST   TABLE 6 2.55



看到row lock waits发生在一个索引上。

3 那么,究竟是什么操作导致了这个enq: TX – row lock contention等待事件呢? 查看系统中,当前有哪些会话产生了enq: TX – row lock contention等待事件

SQL> select event,sid,p1,p2,p3 from v$session_wait where event='enq: TX - row lock contention';
 
EVENT                                                                   SID         P1         P2         P3
---------------------------------------------------------------- ---------- ---------- ---------- ----------
enq: TX - row lock contention                                           224 1415053316    1441815     144197
enq: TX - row lock contention                                           238 1415053316    1441815     144197
enq: TX - row lock contention                                           247 1415053316    1441815     144197
enq: TX - row lock contention                                           248 1415053316    1441815     144197
enq: TX - row lock contention                                           253 1415053316    1441815     144197
SQL> 

看到SID为224,238,247,248,253的会话产生enq: TX – row lock contention等待事件。

4 查看系统中的当前会话,是在哪个对象上产生了产生了enq: TX – row lock contention等待事件

SQL> select ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW# from v$session where event='enq: TX - row lock contention';
 
ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#
------------- -------------- --------------- -------------
       369195              0               0             0
       369195              0               0             0
       369195              0               0             0
       369195              0               0             0
       369195              0               0             0
       369195              0               0             0
 
6 rows selected
SQL>


5 那么这个数据库对象为369195的对象究竟是什么呢?

SQL> select object_name,object_id from dba_objects where object_id=369195;
 
OBJECT_NAME                          OBJECT_ID
----------------------------------- ----------
BIND_PROCESS_LOG_REFNO                  369195
SQL> select OWNER,OBJECT_NAME,OBJECT_ID,DATA_OBJECT_ID, OBJECT_TYPE from dba_objects where object_name='BIND_PROCESS_LOG_REFNO';
 
OWNER                          OBJECT_NAME                    OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
------------------------------ ----------------------------- ---------- -------------- -------------------
SUNISCO                        BIND_PROCESS_LOG_REFNO            369195         369195 INDEX
SQL>

可以看到,定位到的结果同上述AWR报告中段统计信息吻合,是SUNISCO这个用户下的一个索引。

6 接下来,继续看看SID为224,238,247,248,253的会话到底在执行哪些操作导致enq: TX – row lock contention等待事件

SQL> select sid,sql_text from v$session a,v$sql b where sid in(224,238,247,248,253) and (b.sql_id=a.sql_id or b.sql_id=a.prev_sql_id);
 
       SID SQL_TEXT
---------- --------------------------------------------------------------------------------
       224 select count(1)  from EDI_MESSAGE_PROCESS_LOG where   (LOG_ID =  :P_0_0  )
       224 INSERT INTO EDI_MESSAGE_PROCESS_LOG(LOG_ID, SERVICE_TYPE, SERVICE_STATUS, INFO_C
       238 select count(1)  from EDI_MESSAGE_PROCESS_LOG where   (LOG_ID =  :P_0_0  )
       238 INSERT INTO EDI_MESSAGE_PROCESS_LOG(LOG_ID, SERVICE_TYPE, SERVICE_STATUS, INFO_C
       247 INSERT INTO EDI_MESSAGE_PROCESS_LOG(LOG_ID, SERVICE_TYPE, SERVICE_STATUS, REFNO,
       247 INSERT INTO EDI_MESSAGE_PROCESS_LOG(LOG_ID, SERVICE_TYPE, SERVICE_STATUS, REFNO,
       248 INSERT INTO EDI_MESSAGE_PROCESS_LOG (LOG_ID, SERVICE_TYPE, SERVICE_STATUS, REFNO
       248 INSERT INTO EDI_MESSAGE_PROCESS_LOG (LOG_ID, SERVICE_TYPE, SERVICE_STATUS, REFNO
       248 SELECT SEQ_NEWID.NEXTVAL FROM DUAL
       253 SELECT SEQ_NEWID.NEXTVAL FROM DUAL
       253 INSERT INTO EDI_MESSAGE_PROCESS_LOG (LOG_ID, SERVICE_TYPE, SERVICE_STATUS, REFNO
 
11 rows selected
 
SQL>

看到有SQL_ID不同的SQL在同时向EDI_MESSAGE_PROCESS_LOG这张表执行INSERT操作

7 接下去看看EDI_MESSAGE_PROCESS_LOG这张表和索引BIND_PROCESS_LOG_REFNO之间有没有什么关系?

SQL> select index_name,table_name,index_type from user_indexes where table_name='EDI_MESSAGE_PROCESS_LOG';

INDEX_NAME                     TABLE_NAME                     INDEX_TYPE
------------------------------ ------------------------------ ----------
PK_EDI_MESSAGE_PROCESS_LOG     EDI_MESSAGE_PROCESS_LOG        NORMAL
ID_EDI_LOG_INPUT_DATE          EDI_MESSAGE_PROCESS_LOG        NORMAL
BIND_PROCESS_LOG_REFNO         EDI_MESSAGE_PROCESS_LOG        BITMAP

SQL> select index_name,table_name,column_name from user_ind_columns where table_name='EDI_MESSAGE_PROCESS_LOG';

INDEX_NAME                     TABLE_NAME                     COLUMN_NAM
------------------------------ ------------------------------ ----------
PK_EDI_MESSAGE_PROCESS_LOG     EDI_MESSAGE_PROCESS_LOG        LOG_ID
ID_EDI_LOG_INPUT_DATE          EDI_MESSAGE_PROCESS_LOG        INPUT_DATE
BIND_PROCESS_LOG_REFNO         EDI_MESSAGE_PROCESS_LOG        REFNO

SQL> select object_name,object_id,object_type,created from user_objects where object_name='BIND_PROCESS_LOG_REFNO';

OBJECT_NAME                     OBJECT_ID OBJECT_TYPE     CREATED
------------------------------ ---------- --------------- -------------------
BIND_PROCESS_LOG_REFNO             369195 INDEX           2012/11/05 10:18:28

SQL> select index_name,index_type from user_indexes where index_name='BIND_PROCESS_LOG_REFNO';

INDEX_NAME                      INDEX_TYPE
------------------------------- -----------
BIND_PROCESS_LOG_REFNO          BITMAP

SQL>

发现,这个索引BIND_PROCESS_LOG_REFNO是位于EDI_MESSAGE_PROCESS_LOG这张表的REFNO字段上的一个位图索引,而且是2012/11/05 10:18:28创建的,也就是说是近期才创建的1个位图索引

问题定位到这一步基本比较清晰了,产生enq: TX – row lock contention事件的原因就是上述的第2个可能原因:位图索引同时被更新或同时并发的向位图索引字段上插入相同字段值

8 那么,解决的办法也比较简单了,就是干掉这个位图索引,因为这个位图索引在这种应用场景下确实不太适合。事后,经过同客户方沟通确认,该索引是他们的一个DBA当初看到系统比较慢,而加上去的一个位图索引。

9 补充,从当时的ADDM报告中,也可以看到数据库给我们的建议:

FINDING 4: 20% impact (6013 seconds)
------------------------------------
发现 SQL 语句正处于行锁定等待。

   RECOMMENDATION 1: Application Analysis, 17% benefit (5131 seconds)
      ACTION: 在 INDEX "SUNISCO.BIND_PROCESS_LOG_REFNO" (对象 ID 为 369195)
         中检测到了严重的行争用。使用指定的阻塞 SQL 语句在应用程序逻辑中跟踪行争
用的起因。
         RELEVANT OBJECT: database object with id 369195
      RATIONALE: SQL_ID 为 "dr4uxu769tmmb" 的 SQL 语句在行锁上被阻塞。
         RELEVANT OBJECT: SQL statement with SQL_ID dr4uxu769tmmb
         INSERT INTO EDI_MESSAGE_PROCESS_LOG(LOG_ID, SERVICE_TYPE,
         SERVICE_STATUS, LOG_DATETIME, REFNO, REF_TYPE, MSG_ID, BL_NO, BL_ID,
         VOYAGE_ID, VESSEL_NAME, IMO_NO, VOYAGE_NO, FUNCTION_TYPE, INPUT_DATE,
         IN_STATUS, SYSTEM_TYPE, ERROR_LOG, FILE_NAME) VALUES ( :B1 , :B2 ,
         :B3 , :B4 , :B5 , :B6 , :B7 , :B8 , :B9 , :B10 , :B11 , :B12 , :B13 ,
         :B14 , :B15 , :B16 , :B17 , :B18 , :B19 )
      RATIONALE: SQL_ID 为 "dxsbgubsb6r4n" 的 SQL 语句在行锁上被阻塞。
         RELEVANT OBJECT: SQL statement with SQL_ID dxsbgubsb6r4n
         INSERT INTO EDI_MESSAGE_PROCESS_LOG(LOG_ID, SERVICE_TYPE,
         SERVICE_STATUS, INFO_CODE, INFORMATION, INFO_LEVEL, LOG_DATETIME,
         REFNO, REF_TYPE, MSG_ID, BL_NO, VOYAGE_ID, VESSEL_NAME, IMO_NO,
         VOYAGE_NO, FUNCTION_TYPE, INPUT_DATE, IN_STATUS, SYSTEM_TYPE,
         ERROR_LOG, FILE_NAME) VALUES ( :B1 , :B2 , :B3 , :B4 , :B5 , :B6 ,
         :B7 , :B8 , :B9 , :B10 , :B11 , :B12 , :B13 , :B14 , :B15 , :B16 ,
         :B17 , :B18 , :B19 , :B20 , :B21 )
      RATIONALE: SQL_ID 为 "b38qhyzvn5bdd" 的 SQL 语句在行锁上被阻塞。
         RELEVANT OBJECT: SQL statement with SQL_ID b38qhyzvn5bdd
         INSERT INTO EDI_MESSAGE_PROCESS_LOG(LOG_ID, SERVICE_TYPE,
         SERVICE_STATUS, LOG_DATETIME, REFNO, REF_TYPE, MSG_ID, BL_NO,
         VOYAGE_ID, VESSEL_NAME, IMO_NO, VOYAGE_NO, FUNCTION_TYPE, INPUT_DATE,
         IN_STATUS, SYSTEM_TYPE, ERROR_LOG, FILE_NAME) VALUES ( :B1 , :B2 ,
         :B3 , :B4 , :B5 , :B6 , :B7 , :B8 , :B9 , :B10 , :B11 , :B12 , :B13 ,
         :B14 , :B15 , :B16 , :B17 , :B18 )
      RATIONALE: SQL_ID 为 "36k2xpx3c6wr5" 的 SQL 语句在行锁上被阻塞。
         RELEVANT OBJECT: SQL statement with SQL_ID 36k2xpx3c6wr5
         INSERT INTO EDI_MESSAGE_PROCESS_LOG(LOG_ID, SERVICE_TYPE,
         SERVICE_STATUS, REFNO, REF_TYPE, MSG_ID, BL_NO, VOYAGE_ID,
         VESSEL_NAME, IMO_NO, VOYAGE_NO, FUNCTION_TYPE, INPUT_DATE, IN_STATUS,
         SYSTEM_TYPE, ERROR_LOG, FILE_NAME) VALUES ( :B1 , :B2 , :B3 , :B4 ,
         :B5 , :B6 , :B7 , :B8 , :B9 , :B10 , :B11 , :B12 , :B13 , :B14 , :B15
         , :B16 , :B17 )
      RATIONALE: 具有 ID "268", 用户 ID "31", 程序 "FC.EdiService.Import.exe" 和
模块
         "FC.EdiService.Import.exe" 的会话是构成此建议案中的优化建议的 51% 的阻
塞会话。
      RATIONALE: 具有 ID "307", 用户 ID "31", 程序 "FC.EdiService.Import.exe" 和
模块
         "FC.EdiService.Import.exe" 的会话是构成此建议案中的优化建议的 11% 的阻
塞会话。
      RATIONALE: 具有 ID "227", 用户 ID "31", 程序 "FC.EdiService.Import.exe" 和
模块
         "FC.EdiService.Import.exe" 的会话是构成此建议案中的优化建议的 11% 的阻
塞会话。
      RATIONALE: 具有 ID "273", 用户 ID "31", 程序 "FC.EdiService.Import.exe" 和
模块
         "FC.EdiService.Import.exe" 的会话是构成此建议案中的优化建议的 9% 的阻塞
会话。


10 最后,从本案例中,可以看到在日常的数据库维护中,添加或修改一些对象信息时,务必要经过严格的测试,尤其是在生产系统上做调整更应如此。同样,可以看出,数据库的一些理论基础知识对于DBA还是蛮重要的。

 

Oracle索引组织表学习系列三(完)

5 索引组织表(IOT Index-Organized Table)的键压缩

      在创建IOT表时,有一个存储选项NOCOMPRESS,这个选项的意思是不压缩,即对IOT表的索引条目不压缩。该选项不单对IOT表有效,同样对B-Tree索引也适用。

      与NOCOMPRESS选项对应的就是COMPRESS N,这个N只能取值整数,表示要压缩的列数,在数据块儿级别提取"公因子",用以避免存储重复值。如IOT表的主键是(col1,col2,col3)的联合主键的话,那么COMPRESS 2就可以表示,如果在表中重复出现多个col1,col2的重复值的话,那么Oracle就只存储col1,col2 1次,对于重复的记录不再存储。所以,达到压缩的目的。

      接下来,看一个示例:

      1 创建一个NOCOMPRESS的IOT表:

[oracle@oracle11g ~]$ sqlplus 

SQL*Plus: Release 11.2.0.1.0 Production on Fri Nov 23 14:21:43 2012

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


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning and Automatic Storage Management options

SQL> conn hr/hr
Connected.
SQL> create table iot
  2  ( owner, object_type, object_name,
  3  constraint iot_pk primary key(owner,object_type,object_name)
  4  )
  5  organization index
  6  NOCOMPRESS
  7  as
  8  select distinct owner, object_type, object_name
  9  from all_objects;

Table created.

SQL> select count(*) from iot;

  COUNT(*)
----------
     55646

SQL> select lf_blks, br_blks, used_space, opt_cmpr_count, opt_cmpr_pctsave from index_stats;

no rows selected

SQL> 

 

      看到表里有55646条记录。

      2 用ANALYZE INDEX VALID STRUCTURE来分析这个IOT表的主键:

SQL> analyze index iot_pk validate structure;

Index analyzed.

SQL> select lf_blks, br_blks, used_space, opt_cmpr_count, opt_cmpr_pctsave from index_stats;

   LF_BLKS    BR_BLKS USED_SPACE OPT_CMPR_COUNT OPT_CMPR_PCTSAVE
---------- ---------- ---------- -------------- ----------------
       347          3    2493786              2               33

SQL> 

 

      看到这个IOT表的索引使用了347个叶子块,3个分枝块,占用空间大小是2493786字节,约2.4M。

      3 使用COMPRESS 1选项来重建IOT表:

SQL> alter table iot move compress 1;

Table altered.

SQL> select lf_blks, br_blks, used_space, opt_cmpr_count, opt_cmpr_pctsave from index_stats;

no rows selected

SQL> analyze index iot_pk validate structure;

Index analyzed.

SQL> select lf_blks, br_blks, used_space, opt_cmpr_count, opt_cmpr_pctsave from index_stats;

   LF_BLKS    BR_BLKS USED_SPACE OPT_CMPR_COUNT OPT_CMPR_PCTSAVE
---------- ---------- ---------- -------------- ----------------
       304          3    2178229              2               23

SQL> 

 

         然后,看到这个IOT表的索引现在使用了304个叶子块,3个分枝块,占用空间大小是2178229字节,约2.1M。

      4 使用COMPRESS 2继续压缩这个IOT表:

SQL> alter table iot move compress 2;

Table altered.

SQL> select lf_blks, br_blks, used_space, opt_cmpr_count, opt_cmpr_pctsave from index_stats;

no rows selected

SQL> analyze index iot_pk validate structure;

Index analyzed.

SQL> select lf_blks, br_blks, used_space, opt_cmpr_count, opt_cmpr_pctsave from index_stats;

   LF_BLKS    BR_BLKS USED_SPACE OPT_CMPR_COUNT OPT_CMPR_PCTSAVE
---------- ---------- ---------- -------------- ----------------
       233          1    1670153              2                0

SQL> 

 

      最终,看到这个IOT表的索引现在使用了233个叶子块,1个分枝块,占用空间大小是1670153字节,约1.6M。

      说明:

      从上可以看出,使用不同的压缩级别,索引的占用的空间大小逐渐变小,从最初的2.4M变成1.6M。叶子块从最初的347变成233个,分枝块最终只有1个。

      对于上述分析索引之后的OPT_CMPR_COUNT字段表示最优压缩数,即对于该索引而言如果使用COMPRESS 2来压缩的话,可以得到最优的压缩效果。

       同时OPT_CMPR_PCTSAVE字段值则表示最优压缩节省的空间百分比,针对第一次分析之后的结果,可以看到OPT_CMPR_PCTSAVE为33,即可以节省大约33%的空间。如下,压缩后1670153大约是压缩前2493786的2/3,即节约了1/3的空间:

SQL> select 1670153/2493786 from dual;

1670153/2493786
---------------
     .669725871

SQL>

 

6 索引组织表(IOT Index-Organized Table)的INCLUDING和PCTTHRESHOLD参数选择

     对于IOT表而言,如果在建表的语句中同时使用了INCLUDING和PCTTHRESHOLD参数的话,那么PCTTHRESHOLD参数的级别较高。

       PCTTHRESHOLD:行中的数据量超过数据块的这个百分比时,行中其它的列则存放到OVERFLOW段中;

       INCLUDING:行中从第一列直到INCLUDING子句中指定的列(包括该列)都存放在索引块中,其它的列存放到OVERFLOW段中。

       即,对于大小为8K的数据块而言,有下面的IOT表:

SQL> create table iot1
  2  (id number,
  3  name char(2000),
  4  addr char(2000),
  5  salary number,
  6  constraint iot1_pk primary key(id,name)
  7  )
  8  organization index
  9  pctthreshold 50
 10  overflow
 11  including addr;

Table created.

SQL> 

 

       那么,如果PCTTHRESHOLD参数指定为50的话,那么索引块中至多会使用4K的空间来存放主键字段和非主键字段,其它字段则存放到OVERFLOW段中,而会忽略此时的INCLUDING选项,并非将addr字段随主键字段一起存放,而是将其存放到溢出段中。

       关于IOT表的学习,先到这个地方,以后有新的关于IOT表的知识,再补充在这里!