文章
|
DBA:Linux 在 RHEL3 上将单一实例数据库转换为 Oracle RAC 10g 作者:Vincent Chan 学习如何在 Red Hat Enterprise Linux 3 上将单一实例数据库转换为 Oracle 真正应用程序集群 (RAC) 10g。 内容
对于那些具有有限操作经验的用户而言,实施 Oracle RAC 10g 的前景令人生畏。但事情并不一定如此。 本指南将提供明确的步骤,引导您在 RHEL3 上将单一实例 Oracle 10g 数据库转换为 Oracle RAC。我将 Oracle 自动存储管理 (ASM)(一个构建到 Oracle 数据库内核中的集成文件系统和卷管理解决方案)用于 RAC 数据库存储,因为它不但提供了存储可靠性和高性能,还简化了数据库存储管理。
总的说来,有多种方法可以将数据库转换为 RAC。如果数据库比较小,则可以考虑在 ASM 上安装一个新的 RAC 数据库,并将当前数据库中的数据导出/导入到 RAC 数据库。对于较大的数据库,首选的方法是使用 RMAN 将数据库文件移植到 ASM。这里所要说明的方法是一个分为两个阶段的方法:首先,将数据移植到 ASM,然后将单一实例数据库转换为 RAC。如果您是对 ASM 不了解,建议您采用此移植方法,先熟悉 ASM,然后再进一步运用 ASM 和 RAC。(有关 Oracle ASM 的更多信息,请访问 Oracle ASM 产品中心或参考文档。) 本指南要求您对 RAC 体系结构有一个基本了解,对 Oracle 数据库和 Red Hat Enterprise Linux 的管理较为熟悉。有关详细信息,请参考文档。
概述 RAC 集群由两台运行 RHEL3(内核 2.4.21-27)的 Intel x86 服务器组成。每个节点都可以访问共享存储器并可以连接到公共网络和专用网络。 本指南分为以下步骤:
以下是在转换到 RAC 之前的单一实例数据库环境的情况介绍:
和 RAC 数据库环境情况介绍:
您将在每个节点上安装 Oracle Home 以实现冗余。ASM 和 RAC 实例在每个节点上共享同一 Oracle Home。 第 1 步:准备安装 1a.检验软件程序包版本。 安装所需的程序包。其他信息可以从 文档中获得。 [root@salmon1]# rpm -qa | grep -i compat compat-libstdc++-7.3-2.96.128 compat-gcc-c++-7.3-2.96.128 compat-libstdc++-devel-7.3-2.96.128 compat-db-4.0.14-5 compat-glibc-7.x-2.2.4.32.6 compat-slang-1.4.5-5 compat-gcc-7.3-2.96.128 compat-pwdb-0.62-3 [root@salmon1]# [root@salmon1]# rpm -qa | grep openmotif openmotif-2.2.3-3.RHEL3 [root@salmon1]# [root@salmon1]# rpm -qa | grep -i gcc gcc-gnat-3.2.3-42 gcc-c++-ssa-3.5ssa-0.20030801.48 compat-gcc-c++-7.3-2.96.128 libgcc-ssa-3.5ssa-0.20030801.48 gcc-3.2.3-42 gcc-g77-3.2.3-42 gcc-java-3.2.3-42 gcc-ssa-3.5ssa-0.20030801.48 gcc-g77-ssa-3.5ssa-0.20030801.48 gcc-objc-ssa-3.5ssa-0.20030801.48 libgcc-3.2.3-42 gcc-c++-3.2.3-42 gcc-objc-3.2.3-42 gcc-java-ssa-3.5ssa-0.20030801.48 compat-gcc-7.3-2.96.128 1b.检验内核参数。 检验以下内核参数。其他信息可以从 文档中获得。 [root@salmon1]# sysctl -a | grep shm kernel.shmmni = 4096 kernel.shmall = 2097152 kernel.shmmax = 2147483648 [root@salmon1]# sysctl -a | grep sem kernel.sem = 250 32000 100 128 [root@salmon1]# sysctl -a | grep -i ip_local net.ipv4.ip_local_port_range = 1024 65000 [root@salmon1]# sysctl -a | grep -i file-max fs.file-max = 655361c.创建 Oracle Base 目录、oracle 用户和组。 在第一个节点上使用下面的信息,在第二个节点上创建 oracle 用户以及 oinstall 和 dba 组。 [oracle@salmon1]$ hostname salmon1.dbsconsult.com [oracle@salmon1]$ [oracle@salmon1]$ id uid=500(oracle) gid=500(dba) groups=500(dba),501(oinstall) [oracle@salmon1]$ [oracle@salmon1]$ echo $ORACLE_BASE /u01/app/oracle1d.编辑 oracle 用户环境文件。 [oracle@salmon1]$ more .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi export PATH=$PATH:$HOME/bin export ORACLE_SID=prod1 export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/10.1.0 export LD_LIBRARY_PATH=$ORACLE_HOME/lib export PATH=$ORACLE_HOME/bin:$PATH umask 0221e.配置 oracle 用户 shell 限制。 [root@salmon1]# more /etc/security/limits.conf * soft nproc 2047 * hard nproc 16384 * soft nofile 1024 * hard nofile 65536 [root@salmon1]# grep pam_limits /etc/pam.d/login session required /lib/security/pam_limits.so1f.配置公共网络和专用网络。 使用下面的信息对网络接口设备 eth0(公共)和 eth1(专用)进行必需的更改。 [root@salmon1]# redhat-config-network
1g.编辑 the /etc/hosts 文件。 127.0.0.1 localhost.localdomain localhost 10.10.10.84 sallocal1.dbsconsult.com sallocal1 10.10.10.85 sallocal2.dbsconsult.com sallocal2 192.168.0.184 salmon1.dbsconsult.com salmon1 192.168.0.185 salmon2.dbsconsult.com salmon2 192.168.0.186 salmon1-vip.dbsconsult.com salmon1-vip 192.168.0.187 salmon2-vip.dbsconsult.com salmon2-vip验证主机名和配置的网络接口设备。 [root@salmon1]# hostname salmon1.dbsconsult.com [root@salmon1]# /sbin/ifconfig 1h.使用 SSH 建立用户等效性。 在集群就绪服务 (CRS) 和 RAC 安装过程中,Oracle Universal Installer (OUI) 必须能够以 oracle 的身份将软件复制到所有 RAC 节点,而不提示输入口令。在 Oracle 10g 中,可以使用 ssh 代替 rsh 完成此操作。 要建立用户等效性,请在两个节点上以 oracle 用户的身份生成用户的公钥和私钥。 [oracle@salmon1]$ ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/oracle/.ssh/id_dsa): Created directory '/home/oracle/.ssh'. 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: 5d:8c:42:97:eb:42:ae:52:52:e9:59:20:2a:d3:6f:59 oracle@salmon1.dbsconsult.com在每个节点上测试连接。验证当您再次运行以下命令时,系统是否不提示您输入口令。 ssh salmon1 date ssh salmon2 date ssh sallocal1 date ssh sallocal2 date ssh salmon1.dbsconsult.com date ssh salmon2.dbsconsult.com date ssh sallocal1.dbsconsult.com date ssh sallocal2.dbsconsult.com date1i.配置 hangcheck timer 内核模块。 hangcheck timer 内核模块监控系统的运行情况,并重新启动出现故障的 RAC 节点。它使用两个参数,即 hangcheck_tick(定义系统检查频率)和 hangcheck_margin(定义在重置 RAC 节点前的最大挂起延时)来确定节点是否出现故障。 在 /etc/rc.d/rc.local 中添加以下行以自动加载 hangcheck 模块。 [root@salmon1]# grep insmod /etc/rc.d/rc.local insmod hangcheck-timer hangcheck_tick=30 hangcheck_margin=1801j.重新创建数据库控制文件。 在转换到 RAC 之前,确保在控制文件中正确调整以下项的大小。如果需要,请使用正确的设置重新创建数据库控制文件。 MAXLOGFILES MAXLOGMEMBERS MAXDATAFILES MAXINSTANCES MAXLOGHISTORY1k.调整数据库缓冲区高速缓存。 从单一实例数据库转换到 RAC 时,数据库缓冲区高速缓存需要额外的内存。在 RAC 中,为每个块缓冲区高速缓存中的全局高速缓存服务 (GCS) 分配空间。所需的额外内存量取决于应用程序访问数据的方式,即同一个块是否高速缓存到多个实例中。
在演示实验中,我观察到缓冲区高速缓存的使用率增加了大约 8%。使用缓冲区高速缓存顾问确定最佳的缓冲区高速缓存大小,或切换到 Oracle 自动共享内存管理 (ASMM) 让 Oracle 进行控制。 第 2 步:将数据库移植到 ASM ASM 实例与数据库实例之间的同步需要 Oracle 集群同步服务 (CSS) 后台程序。要启动 ASM 实例,必须启动 CSS 后台程序。安装或升级到 Oracle 数据库 10g 时,应该已经为单节点版本配置了 CSS,并且 CSS 应在系统重新启动时自动启动。
[root@salmon1]# ps a€“ef | grep ocssd.bin | wc a€“l
17
2a.下载 ASM RPM.
从 OTN 下载以下 ASM RPM:
2b.安装 ASM RPM。 以 root 用户的身份安装 ASM RPM。 [root@salmon1]# rpm -i oracleasm-support-2.0.0-1.i386.rpm [root@salmon1]# rpm -i oracleasm-2.4.21-27.EL-1.0.4-2.i686.rpm Linking module oracleasm.o into the module path [ OK ] [root@salmon1]# rpm -i oracleasmlib-2.0.0-1.i386.rpm [root@salmon1]# rpm -qa | grep oracleasm oracleasm-2.4.21-27.EL-1.0.4-2 oracleasm-support-2.0.0-1 oracleasmlib-2.0.0-12c.配置 ASM。 以 root 用户的身份配置 ASMLib。
[root@salmon1]# /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 []:dba
Start Oracle ASM library driver on boot (y/n) [n]:y
Fix permissions of Oracle ASM disks on boot (y/n) [y]:y
Writing Oracle ASM library driver configuration [ OK ]
Creating /dev/oracleasm mount point [ OK ]
Loading module "oracleasm" [ OK ]
Mounting ASMlib driver filesystem [ OK ]
Scanning system for ASM disks
2d.创建 ASM 磁盘。
以 root 用户的身份在任何一个节点上创建 ASM 磁盘。 [root@salmon1]# /etc/init.d/oracleasm createdisk VOL1 /dev/sdg5 Marking disk "/dev/sdg5" as an ASM disk [ OK ] [root@salmon1]# /etc/init.d/oracleasm createdisk VOL2 /dev/sdg6 Marking disk "/dev/sdg6" as an ASM disk [ OK ] [root@salmon1]# /etc/init.d/oracleasm createdisk VOL3 /dev/sdg7 Marking disk "/dev/sdg7" as an ASM disk [ OK ] [root@salmon1]# /etc/init.d/oracleasm createdisk VOL4 /dev/sdg8 Marking disk "/dev/sdg8" as an ASM disk [ OK ] [root@salmon1]# /etc/init.d/oracleasm createdisk VOL5/dev/sdg9 Marking disk "/dev/sdg9" as an ASM disk [ OK ] [root@salmon1]# /etc/init.d/oracleasm createdisk VOL6 /dev/sdg10 Marking disk "/dev/sdg10" as an ASM disk [ OK ] [root@salmon1]# /etc/init.d/oracleasm createdisk VOL7 /dev/sdg11 Marking disk "/dev/sdg11" as an ASM disk [ OK ] [root@salmon1]# /etc/init.d/oracleasm createdisk VOL8 /dev/sdg12 Marking disk "/dev/sdg12" as an ASM disk [ OK ] [root@salmon1]# /etc/init.d/oracleasm createdisk VOL9 /dev/sdg13 Marking disk "/dev/sdg13" as an ASM disk [ OK ] [root@salmon1]# /etc/init.d/oracleasm createdisk VOL10 /dev/sdg14 Marking disk "/dev/sdg14" as an ASM disk [ OK ]验证能否从每个节点看到 ASM 磁盘。 [root@salmon1]# /etc/init.d/oracleasm listdisks VOL1 VOL2 VOL3 VOL4 VOL5 VOL6 VOL7 VOL8 VOL9 VOL10 [root@salmon1]# /etc/init.d/oracleasm scandisks Scanning system for ASM disks [ OK ]2e.创建 ASM init.ora。 在第一个节点上,使用以下参数在 $ORACLE_HOME/dbs 中创建一个 init+ASM1A.ora 文件: #asm_diskgroups='DG1', a€?DG2a€?, a€?RECOVERYDESTa€? asm_diskstring='ORCL:VOL*' background_dump_dest=/u01/app/oracle/admin/+ASM/bdump core_dump_dest=/u01/app/oracle/admin/+ASM/cdump user_dump_dest=/u01/app/oracle/admin/+ASM/udump instance_type=asm large_pool_size=16M remote_login_passwordfile=exclusive +ASM1A.instance_number=1 +ASM1B.instance_number=22f.创建 ASM 口令文件。 使用 orapwd 实用程序在第一个节点上的 $ORACLE_HOME/dbs 中创建一个 orapw+ASM1A 文件。 [oracle@salmon1]$ cd $ORACLE_HOME/dbs [oracle@salmon1]$ orapwd file=orapw+ASM1A password=sys entries=52g.创建第一个 ASM 实例。 在第一个节点上创建第一个 ASM 实例。将 CRS 软件安装到第二个节点后,将在“后续安装”中创建第二个 ASM 实例。 [oracle@salmon1]$ export ORACLE_SID=+ASM1A [oracle@salmon1]$ sqlplus / as sysdba SQL*Plus:Release 10.1.0.3.0 - Production on Thu May 26 05:51:07 2005 Copyright (c) 1982, 2004, Oracle.保留所有权利。 Connected to an idle instance. SQL> startup ORACLE instance started. Total System Global Area 104857600 bytes Fixed Size 777616 bytes Variable Size 104079964 bytes Database Buffers 0 bytes Redo Buffers 0 bytes ORA-15110:no diskgroups mounted2h.创建 ASM 实例 spfile。 在 ASM 实例启动后立即创建一个 spfile。使用 spfile 文件,任何新建的磁盘组都将自动添加到 spfile 文件。 SQL> create spfile from pfile; File created.2i.创建磁盘组。 创建三个磁盘组:DG1、DG2 和 RECOVERYDEST。DG1 和 DG2 将用于存储 Oracle 数据文件和重做日志。RECOVERYDEST 将用作闪回恢复区。 SQL> create diskgroup dg1 normal redundancy 2 failgroup fg1a disk 3 'ORCL:VOL1','ORCL:VOL2' 4 failgroup fg1b disk 5 'ORCL:VOL3','ORCL:VOL4'; Diskgroup created. SQL> create diskgroup dg2 normal redundancy 2 failgroup fg2a disk 3 'ORCL:VOL5','ORCL:VOL6' 4 failgroup fg2b disk 5 'ORCL:VOL7','ORCL:VOL8'; Diskgroup created. SQL> create diskgroup recoverydest normal redundancy 2 failgroup fgrd1 disk 3 'ORCL:VOL9' 4 failgroup fgrd2 disk 5 'ORCL:VOL10'; Diskgroup created. SQL> show parameter diskgroup NAME TYPE VALUE ------------------------------ ----------- ----------------------------- asm_diskgroups string DG1, DG2, RECOVERYDEST SQL> select name,total_mb from v$asm_diskgroup; NAME TOTAL_MB ------------------------- ------------------- DG1 36864 DG2 36864 RECOVERYDEST 73728 3 rows selected. SQL> select name,path,failgroup from v$asm_disk; NAME PATH FAILGROUP -------- --------------- ---------------- VOL1 ORCL:VOL1 FG1A VOL10 ORCL:VOL10 FGRD2 VOL2 ORCL:VOL2 FG1A VOL3 ORCL:VOL3 FG1B VOL4 ORCL:VOL4 FG1B VOL5 ORCL:VOL5 FG2A VOL6 ORCL:VOL6 FG2A VOL7 ORCL:VOL7 FG2B VOL8 ORCL:VOL8 FG2B VOL9 ORCL:VOL9 FGRD1 10 rows selected.2j.配置闪回恢复区。 SQL> connect sys/sys@prod1 as sysdba Connected. SQL> alter database disable block change tracking; Database altered. SQL> alter system set db_recovery_file_dest_size=72G; System altered. SQL> alter system set db_recovery_file_dest=a€?+RECOVERYDESTa€?; System altered.2k.将数据文件移植到 ASM。 必须使用 RMAN 将数据文件移植到 ASM 磁盘组。所有数据文件都将移植到新创建的磁盘组 DG1。在 DG1 和 DG2 中创建重做日志和控制文件。在生产环境中,应将重做日志存储到与余下的 Oracle 数据文件不同的磁盘组和磁盘控制器上。 SQL> connect sys/sys@prod1 as sysdba Connected. SQL> alter system set db_create_file_dest=a€?+DG1a€?; System altered. SQL> alter system set control_files='+DG1/cf1.dbf' scope=spfile; System altered. SQL> shutdown immediate; [oracle@salmon1]$ rman target / RMAN> startup nomount; Oracle instance started Total System Global Area 419430400 bytes Fixed Size 779416 bytes Variable Size 128981864 bytes Database Buffers 289406976 bytes Redo Buffers 262144 bytes RMAN> restore controlfile from '/u02/oradata/prod1/control01.ctl'; Starting restore at 26-MAY-05 using target database controlfile instead of recovery catalog allocated channel:ORA_DISK_1 channel ORA_DISK_1:sid=160 devtype=DISK channel ORA_DISK_1:copied controlfile copy output filename=+DG1/cf1.dbf Finished restore at 26-MAY-05 RMAN> alter database mount; database mounted released channel:ORA_DISK_1 RMAN> backup as copy database format '+DG1'; Starting backup at 26-MAY-05 allocated channel:ORA_DISK_1 channel ORA_DISK_1:sid=160 devtype=DISK channel ORA_DISK_1:starting datafile copy input datafile fno=00001 name=/u02/oradata/prod1/system01.dbf output filename=+DG1/prod1/datafile/system.257.1 tag=TAG20050526T073442 recid=1 stamp=559294642 channel ORA_DISK_1:datafile copy complete, elapsed time: 00:02:49 channel ORA_DISK_1:starting datafile copy input datafile fno=00003 name=/u02/oradata/prod1/sysaux01.dbf output filename=+DG1/prod1/datafile/sysaux.258.1 tag=TAG20050526T073442 recid=2 stamp=559294735 channel ORA_DISK_1:datafile copy complete, elapsed time: 00:01:26 channel ORA_DISK_1:starting datafile copy input datafile fno=00002 name=/u02/oradata/prod1/undotbs01.dbf output filename=+DG1/prod1/datafile/undotbs1.259.1 tag=TAG20050526T073442 recid=3 stamp=559294750 channel ORA_DISK_1:datafile copy complete, elapsed time: 00:00:15 channel ORA_DISK_1:starting datafile copy input datafile fno=00004 name=/u02/oradata/prod1/users01.dbf output filename=+DG1/prod1/datafile/users.260.1 tag=TAG20050526T073442 recid=4 stamp=559294758 channel ORA_DISK_1:datafile copy complete, elapsed time: 00:00:07 channel ORA_DISK_1:starting datafile copy copying current controlfile output filename=+DG1/prod1/controlfile/backup.261.1 tag=TAG20050526T073442 recid=5 stamp=559294767 channel ORA_DISK_1:datafile copy complete, elapsed time: 00:00:08 Finished backup at 26-MAY-05 RMAN> switch database to copy; datafile 1 switched to datafile copy "+DG1/prod1/datafile/system.257.1" datafile 2 switched to datafile copy "+DG1/prod1/datafile/undotbs1.259.1" datafile 3 switched to datafile copy "+DG1/prod1/datafile/sysaux.258.1" datafile 4 switched to datafile copy "+DG1/prod1/datafile/users.260.1" RMAN> alter database open; database opened RMAN> exit SQL> connect sys/sys@prod1 as sysdba Connected. SQL> select tablespace_name, file_name from dba_data_files; TABLESPACE FILE_NAME --------------------- ----------------------------------------- USERS +DG1/prod1/datafile/users.260.1 SYSAUX +DG1/prod1/datafile/sysaux.258.1 UNDOTBS1 +DG1/prod1/datafile/undotbs1.259.1 SYSTEM +DG1/prod1/datafile/system.257.12l.将临时表空间移植到 ASM。 SQL> alter tablespace temp add tempfile size 100M; Tablespace altered. SQL> select file_name from dba_temp_files; FILE_NAME ------------------------------------- +DG1/prod1/tempfile/temp.264.32m.将重做日志移植到 ASM。 删除现有的重做日志,并在 ASM 磁盘组 DG1 和 DG2 中重新创建它们。 SQL> alter system set db_create_online_log_dest_1='+DG1'; System altered. SQL> alter system set db_create_online_log_dest_2='+DG2'; System altered. SQL> select group#, member from v$logfile; GROUP# MEMBER --------------- ---------------------------------- 1 /u03/oradata/prod1/redo01.log 2 /u03/oradata/prod1/redo02.log SQL> alter database add logfile group 3 size 10M; Database altered. SQL> alter system switch logfile; System altered. SQL> alter database drop logfile group 1; Database altered. SQL> alter database add logfile group 1 size 100M; Database altered. SQL> alter database drop logfile group 2; Database altered. SQL> alter database add logfile group 2 size 100M; Database altered. SQL> alter system switch logfile; System altered. SQL> alter database drop logfile group 3; Database altered. SQL> select group#, member from v$logfile; GROUP# MEMBER --------------- ---------------------------------------- 1 +DG1/prod1/onlinelog/group_1.265.3 1 +DG2/prod1/onlinelog/group_1.257.1 2 +DG1/prod1/onlinelog/group_2.266.3 2 +DG2/prod1/onlinelog/group_2.258.12n.从 spfile 文件创建 pfile 文件。 创建并保留数据库 pfile 的副本。您将稍后在“后续安装”中向 pfile 中添加更多的 RAC 特定参数。 SQL> connect sys/sys@prod1 as sysdba Connected. SQL> create pfile='/tmp/tmppfile.ora' from spfile; File created.2o.添加其他控制文件。 如果需要其他控制文件以实现冗余,则可以在 ASM 中创建它,方法与在其他任何文件系统中创建相同。 SQL> connect sys/sys@prod1 as sysdba Connected to an idle instance. SQL> startup mount ORACLE instance started. Total System Global Area 419430400 bytes Fixed Size 779416 bytes Variable Size 128981864 bytes Database Buffers 289406976 bytes Redo Buffers 262144 bytes Database mounted. SQL> alter database backup controlfile to '+DG2/cf2.dbf'; Database altered. SQL> alter system set control_files='+DG1/cf1.dbf ','+DG2/cf2.dbf' scope=spfile; System altered. SQL> shutdown immediate; ORA-01109:database not open Database dismounted. ORACLE instance shut down. SQL> startup ORACLE instance started. Total System Global Area 419430400 bytes Fixed Size 779416 bytes Variable Size 128981864 bytes Database Buffers 289406976 bytes Redo Buffers 262144 bytes Database mounted. Database opened. SQL> select name from v$controlfile; NAME --------------------------------------- +DG1/cf1.dbf +DG2/cf2.dbf 将所有数据文件成功移植到 ASM 后,将不再需要旧的数据文件并可以将其删除。您的单一实例数据库现在在 ASM 上运行!
第 3 步:安装集群就绪服务 (CRS) 软件 CRS 要求共享原始设备或 Oracle 集群文件系统 (OCFS) 上有两个文件,即 Oracle 集群注册表 (OCR) 和 Voting Disk。这些文件必须可以由集群中的所有节点访问。此处使用原始设备来容纳这两个文件。 3a.创建 OCR 和 Voting Disk。 OCR 的存储器大小至少应为 100MB,voting disk 的存储器大小应至少为 20MB。
[root@salmon1]# more /etc/sysconfig/rawdevices /dev/raw/raw11 /dev/sde1 /dev/raw/raw12 /dev/sde2 [root@salmon1]# chown oracle:dba /dev/raw/raw11 [root@salmon1]# chown oracle:dba /dev/raw/raw12 [root@salmon1]# /sbin/service rawdevices restart Assigning devices: /dev/raw/raw11 --> /dev/sde1 /dev/raw/raw11:bound to major 8, minor 65 /dev/raw/raw12 --> /dev/sde2 /dev/raw/raw12:bound to major 8, minor 66 done [root@salmon1]# su - oracle [oracle@salmon1]$ ln -s /dev/raw/raw11 /u02/oradata/prod1/ocr [oracle@salmon1]$ ln -s /dev/raw/raw12 /u02/oradata/prod1/vdisk3b.安装 CRS 软件。 安装 CRS 软件之前,请关闭监听程序、数据库和 ASM 实例。装入 CRS CD 或从 OTN 下载该软件。只应在第一个节点上启动 OUI。安装过程中,安装程序将该软件自动复制到第二个节点。 [oracle@salmon1]$ export ORACLE_BASE=/u01/app/oracle [oracle@salmon1]$ /mnt/cdrom/runInstaller
[oracle@salmon1]$ /u01/app/oracle/product/10.1.0/crs_1/bin/olsnodes -n
salmon1 1
salmon2 2
[oracle@salmon1]$ ps -ef | egrep "css|crs|evm"
第 4 步:安装 Oracle RAC 软件 4a.编辑 oracle 用户环境文件。 在节点 1 上,设置 ORACLE_SID=prod1a。 在节点 2 上,设置 ORACLE_SID=prod1b。 [oracle@salmon1]$ more .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi export PATH=$PATH:$HOME/bin export ORACLE_SID=prod1a export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/10.1.0/db_1 export ORA_CRS_HOME=$ORACLE_BASE/product/10.1.0/crs_1 export LD_LIBRARY_PATH=$ORACLE_HOME/lib export PATH=$ORACLE_HOME/bin:$PATH umask 0224b.安装 RAC 软件。 装入 Oracle 数据库 10g 企业版 CD 或从 OTN 下载该软件。只在第一个节点上启动 OUI。安装过程中,安装程序将该软件自动复制到第二个节点。 [oracle@salmon1]$ .~/.bash_profile [oracle@salmon1]$ /mnt/cdrom/runInstaller
只应在一个节点上启动和配置网络配置助手 (NETCA)。在配置过程结束时,NETCA 将在两个节点上启动 Oracle listener。 [oracle@salmon1]$ netca
在节点 1 上: [oracle@salmon1]$ srvctl status nodeapps -n salmon1 VIP is running on node:salmon1 GSD is running on node:salmon1 Listener is running on node:salmon1 ONS daemon is running on node:salmon1在节点 2 上: [oracle@salmon2]$ srvctl status nodeapps -n salmon2 VIP is running on node:salmon2 GSD is running on node:salmon2 Listener is running on node:salmon2 ONS daemon is running on node:salmon24e. listener.ora 文件 在节点 1 上:
[oracle@salmon1]$ more $ORACLE_HOME/network/admin/listener.ora
LISTENER_SALMON1 =
(DESCRIPTION_LIST =
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS = (PROTOCOL = TCP)(HOST = salmon1-vip)(PORT = 1521))
)
(ADDRESS_LIST=
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.184)(PORT = 1521))
)
)
)
SID_LIST_LISTENER_SALMON1 =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.1.0/db_1)
(PROGRAM = extproc)
)
)
在节点 2 上:
[oracle@salmon2]$ more $ORACLE_HOME/network/admin/listener.ora
LISTENER_SALMON2 =
(DESCRIPTION_LIST =
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS = (PROTOCOL = TCP)(HOST = salmon2-vip)(PORT = 1521))
)
(ADDRESS_LIST=
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.185)(PORT = 1521))
)
)
)
SID_LIST_LISTENER_SALMON2 =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.1.0/db_1)
(PROGRAM = extproc)
)
)
4f. tnsnames.ora 文件
在两个节点上:
[oracle@salmon1]$ more $ORACLE_HOME/network/admin/tnsnames.ora
LISTENERS_PROD1 =
(ADDRESS_LIST=
(ADDRESS = (PROTOCOL = TCP)(HOST = salmon1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = salmon2-vip)(PORT = 1521))
)
PROD1 =
(DESCRIPTION=
(ADDRESS = (PROTOCOL = TCP)(HOST = salmon1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = salmon2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA=
(SERVICE_NAME = PROD1)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 200)
(DELAY = 5)
)
)
)
PROD1A =
(DESCRIPTION=
(ADDRESS = (PROTOCOL = TCP)(HOST = salmon1-vip)(PORT = 1521))
(CONNECT_DATA=
(SERVER = DEDICATED)
(SERVICE_NAME = PROD1)
(INSTANCE_NAME = PROD1A)
)
)
PROD1B =
(DESCRIPTION=
(ADDRESS = (PROTOCOL = TCP)(HOST = salmon2-vip)(PORT = 1521))
(CONNECT_DATA=
(SERVER = DEDICATED)
(SERVICE_NAME = PROD1)
(INSTANCE_NAME = PROD1B)
)
)
第 5 步:后续安装 5a.在第一个节点上重新定位 ASM 实例文件。 将 ASM 实例口令文件和 spfile+ASM1A.ora 复制到新的 Oracle Home。 [oracle@salmon1]$ cp /u01/app/oracle/product/10.1.0/dbs/orapw+ASM1A /u01/app/oracle/product/10.1.0/db_1/dbs [oracle@salmon1]$ cp /u01/app/oracle/product/10.1.0/dbs/spfile+ASM1A.ora /u01/app/oracle/product/10.1.0/db_1/dbs5b.为第二个 ASM 实例创建 init.ora。 在第二个节点上,在 $ORACLE_HOME/dbs 中创建一个 init+ASM1B.ora 文件。 asm_diskgroups='DG1', a€?DG2a€?, a€?RECOVERYDESTa€? asm_diskstring='ORCL:VOL*' background_dump_dest=/u01/app/oracle/admin/+ASM/bdump core_dump_dest=/u01/app/oracle/admin/+ASM/cdump user_dump_dest=/u01/app/oracle/admin/+ASM/udump instance_type=asm large_pool_size=16M remote_login_passwordfile=exclusive +ASM1A.instance_number=1 +ASM1B.instance_number=25c.为第二个 ASM 实例创建口令文件。 使用 orapwd 实用程序在第二个节点上的 $ORACLE_HOME/dbs 中创建一个 orapw+ASM1B 文件。 5d.创建第二个 ASM 实例。 在第二个节点上创建第二个 ASM 实例。 [oracle@salmon2]$ export ORACLE_SID=+ASM1B [oracle@salmon2]$ sqlplus / as sysdba SQL*Plus:Release 10.1.0.3.0 - Production on Thu May 26 18:43:14 2005 Copyright (c) 1982, 2004, Oracle.保留所有权利。 Connected to an idle instance. SQL> startup ORACLE instance started. Total System Global Area 104857600 bytes Fixed Size 777616 bytes Variable Size 104079964 bytes Database Buffers 0 bytes Redo Buffers 0 bytes ASM diskgroups mounted SQL> create spfile from pfile; File created. SQL> shutdown immediate;5e.使用 CRS 注册 ASM 实例。 为实现更高的可用性,请在 CRS 框架下注册 ASM 实例。注册后,CRS 应检测到任何失败的实例,并自动尝试启动这些实例。重新启动服务器后,CRS 还将自动启动这些实例。 在节点 1 上: [oracle@salmon1]$ srvctl add asm -n salmon1 -i +ASM1A -o /u01/app/oracle/product/10.1.0/db_1 [oracle@salmon1]$ srvctl start asm -n salmon1 [oracle@salmon1]$ srvctl status asm -n salmon1 ASM instance +ASM1A is running on node salmon1.在节点 2 上: [oracle@salmon2]$ srvctl add asm -n salmon2 -i +ASM1B -o /u01/app/oracle/product/10.1.0/db_1 [oracle@salmon2]$ srvctl start asm -n salmon2 [oracle@salmon2]$ srvctl status asm -n salmon2 ASM instance +ASM1B is running on node salmon2. [oracle@salmon1]$ ps -ef | grep dbw | grep -v grep oracle 8918 1 0 May 26 ?00:00:01 asm_dbw0_+ASM1A [oracle@salmon1]$ kill -9 8918 [oracle@salmon1]$ srvctl status asm a€“n salmon1 ASM instance +ASM1A is not running on node salmon1. [oracle@salmon1]$ ps -ef | grep dbw | grep -v grep [oracle@salmon1]$ srvctl status asm a€“n salmon1 ASM instance +ASM1A is running on node salmon1. [oracle@salmon1]$ ps -ef | grep dbw | grep -v grep oracle 8920 1 0 May 26 ?00:00:01 asm_dbw0_+ASM1A5f.为两个 RAC 实例创建口令文件。 使用 orapwd 实用程序在第一个节点上的 $ORACLE_HOME/dbs 中创建一个 orapwprod1a 文件,并在第二个节点上的 $ORACLE_HOME/dbs 中创建 orapwprod1b 文件。 5g.在 pfile 中添加 RAC 特定参数。 修改在第 2 步中保存的 pfile。添加并修改以下参数: *.cluster_database_instances=2 *.cluster_database=true *.remote_listener='LISTENERS_PROD1a€? prod1a.thread=1 prod1a.instance_number=1 prod1a.undo_tablespace='UNDOTBS1' prod1b.thread=2 prod1b.instance_number=2 prod1b.undo_tablespace='UNDOTBS2'5h.修改两个实例的 init.ora。 在节点 1 上: [oracle@salmon1]$ more $ORACLE_HOME/dbs/initprod1a.ora spfile='+DG1/spfileprod1.ora'在节点 2 上: [oracle@salmon2]$ more $ORACLE_HOME/dbs/initprod1b.ora spfile='+DG1/spfileprod1.ora'5i.将数据库 spfile 移植到 ASM。 SQL> !echo $ORACLE_SID prod1a SQL> connect / as sysdba Connected to an idle instance. SQL> startup pfile=/tmp/tmppfile.ora ORACLE instance started. Total System Global Area 419430400 bytes Fixed Size 779416 bytes Variable Size 128981864 bytes Database Buffers 289406976 bytes Redo Buffers 262144 bytes Database mounted. Database opened. SQL> create spfile='+DG1/spfileprod1.ora' from pfile='/tmp/tmppfile.ora'; File created. SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup ORACLE instance started. Total System Global Area 419430400 bytes Fixed Size 779416 bytes Variable Size 128981864 bytes Database Buffers 289406976 bytes Redo Buffers 262144 bytes Database mounted. Database opened. SQL> show parameter spfile NAME TYPE VALUE ---------------------- ------------ --------------------------- spfile string +DG1/spfileprod1.ora5j.创建 RAC 数据词典视图。 在第一个 RAC 实例上创建 RAC 数据词典视图。 SQL> !echo $ORACLE_SID prod1a SQL> spool /tmp/catclust.log SQL> @$ORACLE_HOME/rdbms/admin/catclust ... ... ... SQL> spool off SQL> shutdown immediate;5k.使用 CRS 注册 RAC 实例。 在节点 1 上: [oracle@salmon1]$ srvctl add database -d prod1 -o $ORACLE_HOME [oracle@salmon1]$ srvctl add instance -d prod1 -i prod1a -n salmon1 [oracle@salmon1]$ srvctl add instance -d prod1 -i prod1b -n salmon2 [oracle@salmon1]$ srvctl start instance -d prod1 -i prod1a5l.为第二个 RAC 实例创建重做日志。 SQL> connect sys/sys@prod1a as sysdba Connected. SQL> alter database add logfile thread 2 group 3 size 100M; SQL> alter database add logfile thread 2 group 4 size 100M; SQL> select group#, member from v$logfile; GROUP# MEMBER --------------- ---------------------------------------- 1 +DG1/prod1/onlinelog/group_1.265.3 1 +DG2/prod1/onlinelog/group_1.257.1 2 +DG1/prod1/onlinelog/group_2.266.3 2 +DG2/prod1/onlinelog/group_2.258.1 3 +DG1/prod1/onlinelog/group_3.268.1 3 +DG2/prod1/onlinelog/group_3.259.1 4 +DG1/prod1/onlinelog/group_4.269.1 4 +DG2/prod1/onlinelog/group_4.260.1 8 rows selected. SQL> alter database enable thread 2; Database altered.5m.为第二个 RAC 实例创建重做表空间。 SQL> create undo tablespace UNDOTBS2 datafile size 200M; SQL> select tablespace_name, file_name from dba_data_files 2 where tablespace_name=a€?UNDOTBS2a€?; TABLESPACE FILE_NAME --------------------- -------------------------------------- UNDOTBS2 +DG1/prod1/datafile/undotbs2.270.15n.启动第二个 RAC 实例。 [oracle@salmon1]$ srvctl start instance -d prod1 -i prod1b [oracle@salmon1]$ crs_stat -t Name Type Target State Host ----------------------------------------------------------------------- ora....1a.inst application ONLINE ONLINE salmon1 ora....1b.inst application ONLINE ONLINE salmon2 ora.prod1.db application ONLINE ONLINE salmon1 ora....M1A.asm application ONLINE ONLINE salmon1 ora....M1B.asm application ONLINE ONLINE salmon2 ora....N1.lsnr application ONLINE ONLINE salmon1 ora....on1.gsd application ONLINE ONLINE salmon1 ora....on1.ons application ONLINE ONLINE salmon1 ora....on1.vip application ONLINE ONLINE salmon1 ora....N2.lsnr application ONLINE ONLINE salmon2 ora....on2.gsd application ONLINE ONLINE salmon2 ora....on2.ons application ONLINE ONLINE salmon2 ora....on2.vip application ONLINE ONLINE salmon2 [oracle@salmon1]$ srvctl status database -d prod1 Instance prod1a is running on node salmon1 Instance prod1b is running on node salmon2 [oracle@salmon1]$ srvctl stop database -d prod1 [oracle@salmon1]$ srvctl start database -d prod1 [oracle@salmon1]$ sqlplus system/system@prod1 SQL*Plus:Release 10.1.0.3.0 - Production on Fri May 27 05:53:21 2005 Copyright (c) 1982, 2004, Oracle.保留所有权利。 Connected to: Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Production With the Partitioning, Real Application Clusters, OLAP and Data Mining options SQL> select instance_number instance#, instance_name, host_name, status 2 from gv$instance; INSTANCE# INSTANCE_NAME HOST_NAME STATUS ----------------- ----------------- ------------------------- ----------- 1 prod1a salmon1.dbsconsult.com OPEN 2 prod1b salmon2.dbsconsult.com OPEN恭喜您!您已经将单一实例数据库转换为 RAC!
第 6 步:测试透明应用程序故障切换 (TAF) Oracle TAF 中的故障切换机制使任何失败的数据库连接能够重新连接到集群中的其他节点。故障切换对用户是透明的。Oracle 在故障切换实例上重新执行查询并继续向用户显示余下的结果。 为示范 TAF 选件的故障切换机制,请连接到两个不同的数据库会话并执行以下步骤: 6a.使用 PROD1 服务连接第一个会话。 如果 failover_type 和 failover_mode 返回的输出为“NONE”,则验证是否在 tnsnames.ora 中正确配置了 PROD1 服务。 SQL> connect system/system@prod1 as sysdba Connected. SQL> select instance_number instance#, instance_name, host_name, status 2 from v$instance; INSTANCE# INSTANCE_NAME HOST_NAME STATUS ----------------- -------------- ------------------------- ---------------- 1 prod1a salmon1.dbsconsult.com OPEN SQL> select failover_type, failover_method, failed_over 2 from v$session where username='SYSTEM'; FAILOVER_TYPE FAILOVER_MODE FAILED_OVER ------------------------- -------------------- ---------------------- SELECT BASIC NO6b.从其他会话中关闭该实例。 在 prod1a 实例上以 sys 用户的身份连接,并关闭该实例。 SQL> connect sys/sys@prod1a as sysdba Connected. SQL> select instance_number instance#, instance_name, host_name, status 2 from v$instance; INSTANCE# INSTANCE_NAME HOST_NAME STATUS ----------------- ---------------- ------------------------ ---------------- 1 prod1a salmon1.dbsconsult.com OPEN SQL> shutdown abort; ORACLE instance shut down.6c.验证该会话是否已经完成故障切换。 从第 6 步中的同一会话执行以下查询以验证该会话是否故障切换到其他实例。
SQL> select instance_number instance#, instance_name, host_name, status
2 from v$instance;
INSTANCE# INSTANCE_NAME HOST_NAME STATUS
----------------- ---------------- ------------------------ ----------------
2 prod1b salmon2.dbsconsult.com OPEN
SQL> select failover_type, failover_method, failed_over
2 from v$session where username='SYSTEM';
FAILOVER_TYPE FAILOVER_MODE FAILED_OVER
----------------- -------------- ----------------------
SELECT BASIC YES
结论 了解了 RAC 体系结构并进行恰当规划后,从单一实例数据库转移到 RAC 配置并不一定很复杂。ASM 和 RAC 相互支持以提供更高级别的可用性、可伸缩性和业务连续性。衷心希望本指南提供了清晰、准确的转换执行方法。
Vincent Chan ( vkchan99@yahoo.com) 是 MSD Inc.的一位高级顾问。他是一位 Oracle 认证高级数据库管理员,有九年的各种客户端设计和 Oracle 解决方案实施经验。 |