在 RHEL 5.5 下安装 Oracle RAC

来源:互联网 发布:java内存泄露的例子 编辑:程序博客网 时间:2024/04/29 15:36

1. 创建用户和用户组

分别在 rac1 和 rac2 两个节点上执行以下命令:

# groupadd -g 500 oinstall
# groupadd -g 501 dba
# useradd -u 504 -g oinstall -G dba -d /home/oracle -m oracle
# passwd oracle

2. 配置 Secure Shell 的等效性

在 rac1节点上执行:

[oracle@rac1 ~]$ mkdir ~/.ssh
[oracle@rac1 ~]$ chmod 700 ~/.ssh
[oracle@rac1 ~]$ ssh-keygen -t rsa
[oracle@rac1 ~]$ ssh-keygen -t dsa

在 rac2 节点上执行:

[oracle@rac2 ~]$ mkdir ~/.ssh
[oracle@rac2 ~]$ chmod 700 ~/.ssh
[oracle@rac2 ~]$ ssh-keygen -t rsa
[oracle@rac2 ~]$ ssh-keygen -t dsa

在 rac1 节点上执行:

[oracle@rac1 ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
[oracle@rac1 ~]$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

提示:下列命令会提示你输入 rac2 的 oracle 密码,按照提示输入即可,如果失败可重新尝试执行命令。

在 rac1 节点上执行:

[oracle@rac1 ~]$ scp ~/.ssh/authorized_keys rac2:~/.ssh/authorized_keys

在 rac2 节点上执行:

[oracle@rac2 ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
[oracle@rac2 ~]$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
[oracle@rac2 ~]$ scp ~/.ssh/authorized_keys rac1:~/.ssh/authorized_keys

在 rac1 节点上执行:

[oracle@rac1 ~]$ ssh rac1 date
[oracle@rac1 ~]$ ssh rac2 date
[oracle@rac1 ~]$ ssh rac1-priv date
[oracle@rac1 ~]$ ssh rac2-priv date

在 rac2 节点上执行:

[oracle@rac2 ~]$ ssh rac1 date
[oracle@rac2 ~]$ ssh rac2 date
[oracle@rac2 ~]$ ssh rac1-priv date
[oracle@rac2 ~]$ ssh rac2-priv date

3. 配置网络

[root@rac1 ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost

10.10.6.203 rac1.company.com.cn rac1
10.10.6.204 rac1-vip
192.168.122.101 rac1-priv

10.10.6.207 rac2.company.com.cn rac2
10.10.6.208?? rac2-vip
192.168.122.102 rac2-priv

[root@rac2 ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost

10.10.6.203 rac1.company.com.cn rac1
10.10.6.204 rac1-vip
192.168.122.101 rac1-priv

10.10.6.207 rac2.company.com.cn rac2
10.10.6.208?? rac2-vip
192.168.122.102 rac2-priv

4. 同步时间

[root@rac1 ~]# crontab -l
0 6 * * * /usr/sbin/ntpdate 10.1.4.30 ; /sbin/hwclock -w? > /dev/null 2>&1

[root@rac2 ~]# crontab -l
0 6 * * * /usr/sbin/ntpdate 10.1.4.30 ; /sbin/hwclock -w? > /dev/null 2>&1

5. 配置内核参数

分别在 rac1 和 rac2 两个节点上将下列内容添加到 /etc/sysctl.conf 中去,然后分别在 shell 下运行 “sysctl -p” 命令。

kernel.shmall = 2097152
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 = 1048576
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

6. 设置用户限制

  1. 在 rac1 和 rac2 两个节点上将下列内容添加到 /etc/security/limits.conf 文件中:

    oracle soft nproc 2047
    oracle hard nproc 16384
    oracle soft nofile 1024
    oracle hard nofile 65536

  2. 分别在 rac1 和 rac2 两个节点上将下列内容添加到 /etc/pam.d/login 文件中:

    session required /lib/security/pam_limits.so

  3. 分别在 rac1 和 rac2 两个节点上将下列内容添加到 /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

7. 使用 HugePage 内存技术

分别在 rac1 和 rac2 两个节点上将下列内容添加到 /etc/security/limits.conf 文件中:

Oracle soft memlock 3145728
Oracle hard memlock 3145728

8. 配置 hangcheck-timer 模块

hangcheck-timer 是 Linux 提供的一个内核级的 IO-Fencing 模块, 这个模块会监控 Linux 内核运行状态,如果长时间挂起,这个模块会自动重启系统。 这个模块在 Linux 内核空间运行,不会受系统负载的影响。这个模块会使用 CPU 的 Time Stamp Counter 寄存器,这个寄存器的值会在每个时钟周期自动增加, 因此使用的是硬件时间,所以精度更高。配置这个模块需要2个参数:hangcheck_tick 和 hangcheck_margin。

hangcheck_tick 参数用于定义多长时间检查一次,缺省值是30秒。有可能内核本身很忙,导致这个检查被推迟,该模块还允许定义一个延迟上限,就是 hangcheck_margin,它的缺省值是180秒。hangcheck-timer 模块会根据 hangcheck_tick 参数定时检查内核。只要2次检查的时间间隔小于 hangcheck_tick 与 hangchec_margin 之和,都会认为内核运行正常,否则就意味着运行异常,这个模块会自动重启系统。

CRS 本身还有一个 MissCount 参数,可以通过“crsctl get css miscount”命令查看。

当 RAC 节点间的心跳信息丢失时, Clusterware 必须确保在进行重构时,故障结点确实是 Dead 状态,否则节点仅是临时负载过高导致心跳丢失,然后其他结点开始重构,但是结点没有重启,这样会损坏数据库。 因此 MissCount 必须大于 hangcheck_tick 与 hangcheck_margin 两个参数之和。

在 rac1 和 rac2 两个节点上都应执行如下操作,以 rac1 节点上的操作为例:

[root@rac1 ~]# find /lib/modules -name “hangcheck-timer.ko”
/lib/modules/2.6.18-164.el5/kernel/drivers/char/hangcheck-timer.ko
/lib/modules/2.6.18-164.el5xen/kernel/drivers/char/hangcheck-timer.ko

[root@rac1 ~]# modprobe hangcheck-timer

[root@rac1 ~]# vi /etc/rc.d/rc.local
modprobe hangcheck-timer

[root@rac1 ~]# vi /etc/modprobe.conf
options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180

[root@rac1 ~]# grep Hangcheck /var/log/messages | tail -2
Sep 7 19:53:03 rac1 kernel: Hangcheck: starting hangcheck timer 0.9.0 (tick is 180 seconds, margin is 60 seconds).
Sep 7 19:53:03 rac1 kernel: Hangcheck: Using monotonic_clock().

9. 划分网络共享存储

[root@rac1 ~]# fdisk -l
Disk /dev/cciss/c0d0: 146.7 GB, 146778685440 bytes
255 heads, 32 sectors/track, 35132 cylinders
Units = cylinders of 8160 * 512 = 4177920 bytes

Device Boot Start End Blocks Id System
/dev/cciss/c0d0p1 * 1 25 101984 83 Linux
/dev/cciss/c0d0p2 26 35132 143236560 8e Linux LVM

Disk /dev/sda: 149.9 GB, 149999992832 bytes
255 heads, 63 sectors/track, 18236 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 1 3000 24097468+ 83 Linux
/dev/sda2 3001 6000 24097500 83 Linux
/dev/sda3 6001 9000 24097500 83 Linux
/dev/sda4 9001 12000 24097500 83 Linux

Disk /dev/sdb: 149.9 GB, 149999992832 bytes
255 heads, 63 sectors/track, 18236 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 3000 24097468+ 83 Linux
/dev/sdb2 3001 6000 24097500 83 Linux
/dev/sdb3 6001 9000 24097500 83 Linux
/dev/sdb4 9001 12000 24097500 83 Linux
[root@testrac1 rac]#

[root@rac2 ~]# partprobe

10. 安装与配置 ocfs2

实践中,我使用 ocfs2 来作为保存 OCR 与 Voting Disks 的文件系统。

[root@rac1 ~]# rpm -Uvh ocfs2*

[root@rac1 ~]# vi /etc/ocfs2/cluster.conf

node:
ip_port = 7777
ip_address = 192.168.122.101
number = 0
name = testrac1
cluster = ocfs2

node:
ip_port = 7777
ip_address = 192.168.122.102
number = 1
name = testrac2
cluster = ocfs2

cluster:
node_count = 2
name = ocfs2

[root@rac1 ~]# /etc/init.d/o2cb offline ocfs2
[root@rac1 ~]# /etc/init.d/o2cb upload
[root@rac1 ~]# /etc/init.d/o2cb configure
[root@rac1 ~]# reboot

在 rac1 节点:

[root@rac1 ~]# mkfs.ocfs2 -b 4k -C 32K -N 4 -L oracrsfiles /dev/sdb1

在 rac1 和 rac2 节点上,以 rac1 上的操作为例:

[root@rac1 ~]# mount -t ocfs2 -o datavolume, nointr /dev/sdb1 /ocfs
[root@rac1 ~]# vi /etc/fstab
/dev/sdb1 /ocfs ocfs_netdev,datavolume,nointr 0 0

11.安装配置 oracleasm

[root@rac1 ~]# rpm -Uvh oracleasm*
[root@rac1 ~]# /etc/init.d/oracleasm createdisk VOL1 /dev/sdb2
[root@rac1 ~]# /etc/init.d/oracleasm createdisk VOL2 /dev/sdb3
[root@rac1 ~]# /etc/init.d/oracleasm createdisk VOL3 /dev/sdb4

我没有使用 raw 分区来配置共享存储从而存储 OCR 和 Voting Disks 或数据库文件,如果你对这方面感兴趣请参考这篇 文章

12. 修改用户配置文件

在 rac1 和 rac2 两个节点上都应执行如下操作,以 rac1 节点上的操作为例(两个节点仅 ORACLE_SID 变量不同):

# User specific environment and startup programs

PATH=$PATH:$HOME/bin
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORA_CRS_HOME=$ORACLE_BASE/product/crs
export ORACLE_SID=racdb1
export PATH=.:${PATH}:$HOME/bin:$ORACLE_HOME/bin
export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
export PATH=${PATH}:$ORACLE_BASE/common/oracle/bin
export ORACLE_TERM=xterm
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_NLS10=$ORACLE_HOME/nls/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/oracm/lib
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib
export CLASSPATH=$ORACLE_HOME/JRE
export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/jlib
export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib
export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/network/jlib
export THREADS_FLAG=native
export TEMP=/tmp
export TMPDIR=/tmp

13. 安装与配置 Oracle Clusterware

你只需要按照官方文档一步一步操作,最后分别在 rac1 和 rac2 两个节点上以 root 身份依次执行 orainstRoot.sh 和 root.sh 脚本,Clusterware 安装结束后,可以确认一下:

$ /u01/app/oracle/product/crs/bin/olsnodes -n
rac1
rac2

$ ls -l /etc/init.d/init.*
-r-xr-xr-x 1 root root 1951 Oct 4 14:21 /etc/init.d/init.crs*
-r-xr-xr-x 1 root root 4714 Oct 4 14:21 /etc/init.d/init.crsd*
-r-xr-xr-x 1 root root 35394 Oct 4 14:21 /etc/init.d/init.cssd*
-r-xr-xr-x 1 root root 3190 Oct 4 14:21 /etc/init.d/init.evmd*

检查 CRS 安装启动情况:用 root 用户执行:

$CRS_HOME/bin/crsctl check crs

CSS appears healthy

CRS appears healthy

EVM appears healthy

表明 CRS 安装完成,并且启动成功。

[root@rac1 bin]# ./crs_stat -t -v

Name Type R/RA F/FT Target State Host
———————————————————————-
ora.rac1.gsd application 0/5 0/0 ONLINE ONLINE rac1
ora.rac1.ons application 0/3 0/0 ONLINE ONLINE rac1
ora.rac1.vip application 0/0 0/0 ONLINE ONLINE rac1
ora.rac2.gsd application 0/5 0/0 ONLINE ONLINE rac2
ora.rac2.ons application 0/3 0/0 ONLINE ONLINE rac2
ora.rac2.vip application 0/0 0/0 ONLINE ONLINE rac2

注:如果 Clusterware 安装失败,再次运行安装程序,里面可以把之前的安装删除掉,删除之后在进行安装。

14. 安装 Oracle 数据库

在 rac1 节点上安装 Oracle 数据库软件,OUI 会自动将相关的软件文件拷贝到 rac2 节点上去,所以这部分的安装过程跟单机安装 Oracle 的过程基本一致,只是在安装模式的选择上勾选 Cluster Installation,另外就是在最后阶段需要根据 UI 界面的提示信息分别在两个节点上执行相关 shell 脚本。

15. 使用 netca 创建监听

  1. oracle 用户在 rac1 节点上运行 netca
  2. 选择所有节点
  3. 选择 Listener configuration
  4. 添加一个 LISTENER,端口号1521 ,然后结束配置。

监听配置成功后, 2个节点上的 Listener 都会作为 Application Resource 注册到 CRS 中, 这样 CRS  就可以监控Listener 的运行状态。 我们可以通过 crs_stat -t -v 查看 Listener 状态。tnsnames.ora 配置文件内容如下:

RACDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = racdb)
)
)

LISTENERS_RACDB =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
)

RACDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = racdb)
(INSTANCE_NAME = racdb1)
)
)

RACDB2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = testrac2-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = racdb)
(INSTANCE_NAME = racdb2)
)
)

16. 创建 ASM 实例

  1. 运行 DBCA 命令
  2. 选择 configure Automatic Storage Management, 来创建 ASM 实例。
  3. 选择所有节点。
  4. 输入密码。RAC 的 spfile 必须放在共享目录下。 参数文件我们选择第一个 initialization parameter。
  5. 修改 ASM 参数: asm_diskstring = ORCL:VOL*,这样能让 Oracle 自动发现这些硬盘。
  6. ASM 实例创建完后,用 Create New 来创建 ASM 磁盘组。 我们用 VOL1 来创建一个 DATA 组, VOL2 创建FLASH_RECOVERY_AREA 组。
    注意: Redundancy 一般选 external 就是也就是不考虑冗余,假如选 normal 则是 mirror,至少要一个 FailGroup。选 High 就是 triple mirror,3倍镜像,需要三个 FailGroup。
  7. 创建完成后,能看到组的状态是 Mount,ASM 组必须 mount 之后才能使用。
    注意: ASM 对应的device 需要oracle 用户的权限,如: 

    chown oracle:oinstall /dev/mapper/device_name

17. 使用 dbca 创建 RAC 数据库

  1. 用 oracle 用户运行 dbca
  2. 选择 custom database
  3. 输入数据库的全局名,比如 racdb
  4. 输入系统的角色建立密码
  5. 选择 ASM 来存储, 分别选择我们刚创建的 DATA 和 FLASH_RECOVERY_AREA 组。
  6. Database Services 这里,你选择 Add 你一个新的 service, 随便叫名字,比如 racdb。然后选择 TAF Policy,是 Basic。 这个服务在 RAC 的 Failover 中会用到,如果在这里没有配置,也可以通过 dbca 命令, 选择 Services Management 来进行配置。 具体参考 Blog:Oracle RAC Failover 详解
  7. 开始创建数据库。

18. 检查与测试

[root@rac1 bin]# ./srvctl status database -d rac
Instance rac2 is running on node rac1
Instance rac1 is running on node rac2

[root@rac1 bin]# ./crs_stat -t
Name Type Target State Host
————————————————————
ora.rac.db application ONLINE ONLINE rac1
ora….oltp.cs application ONLINE ONLINE rac2
ora….ac1.srv application ONLINE ONLINE rac2
ora….ac2.srv application ONLINE ONLINE rac1
ora….c1.inst application ONLINE ONLINE rac2
ora….c2.inst application ONLINE ONLINE rac1
ora….SM2.asm application ONLINE ONLINE rac1
ora….C1.lsnr application ONLINE ONLINE rac1
ora.rac1.gsd application ONLINE ONLINE rac1
ora.rac1.ons application ONLINE ONLINE rac1
ora.rac1.vip application ONLINE ONLINE rac1
ora….SM1.asm application ONLINE ONLINE rac2
ora….C2.lsnr application ONLINE ONLINE rac2
ora.rac2.gsd application ONLINE ONLINE rac2
ora.rac2.ons application ONLINE ONLINE rac2
ora.rac2.vip application ONLINE ONLINE rac2

原创粉丝点击