Deploy 11.2.0.3 RAC+DG on Windows 2008 R2 Step by Step

环境规划:


节点1: tc1 192.168.56.101 内存:2G

节点2: tc2 192.168.56.102 内存:2G

物理备库:tcdg192.168.56.108内存:1.5G

操作系统:Windows 2008 R2 Enterprise


************
 RAC部分
************


一、准备工作



1.修改提升权限提示方式为“不提示,直接提升”(默认为“非Windows二进制文件的同意提示”)
cmd> secpol.msc->本地策略->安全选项->用户账户控制->管理员批准模式中管理员的提升权限提示的行为


2.禁用防火墙
cmd> firewall.cpl->打开或关闭防火墙->关闭Window防火墙


3.修改注册表关闭DHCP媒体感知(修改后重启生效)
cmd> regedit->\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters下面添加一项,名字是DisableDHCPMediaSense,类型为DWORD,值为1


4.检查是否生效
cmd> netsh interface ipv4 show global
DHCP 媒体感知 :enabled


5.关闭可伸缩网络包(SNP)特性(修改后立即生效)
cmd> netsh int tcp set global rss=disabled
cmd> netsh int tcp set global chimney=disabled


c:\grid>netsh int tcp show global
查询活动状态...


TCP 全局参数
----------------------------------------------
接收方缩放状态                    : disabled
烟囱卸载状态                      : disabled

NetDMA 状态                       : enabled
直接缓存访问(DCA)                 : disabled
接收窗口自动调谐级别              : normal
附加拥塞控制提供程序              : ctcp
ECN 功能                          : disabled
RFC 1323 时间戳                   : disabled


6.调整网络绑定顺序
cmd> ncpa.cpl->高级->高级设置->调整public在前,private在后,并且确保IPV4协议在IPV6协议之前


7.停止Distributed Transaction Coordinator,并设置成手动启动
cmd> services.mcs->点属性修改


8.同步各节点时间(可选)
通常节点之间的时间是由CTSSD(Cluster Time Synchronization Services Daemon)或 Windows Time Service来保证的,如果开启了Windows Time Service(默认关闭),那么必须保证不会被反向修改,需要做以下调整
cmd> regedit->\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config
MaxNegPhaseCorrection的值改为0
cmd> w32tm /config /update  --使修改生效


9.设置环境变量(可选)
装完系统默认应该已经有TMP和TEMP这两个环境变量了,路径都为%USERPROFILE%\AppData\Local\Temp
由于在安装OUI的时候,会用到这2个环境变量,所以如果没有的话需要添加上,并且确保路径是一致的


10.修改C:\windows\system32\etc\hosts
#public ip
192.168.56.101 tc1
192.168.56.102 tc2
#virtual ip
192.168.56.103 tc1-vip
192.168.56.104 tc2-vip
#private ip
10.0.0.1 tc1-priv
10.0.0.2 tc2-priv
192.168.56.105 tc-cluster-scan --格式为"cluster名-scan"


11.full clone节点1至节点2
启动并修改节点2的网卡ip地址主机名后再次重启


12.测试连通性
节点1执行
cmd> ping tc2
cmd> ping tc2-vip
cmd> ping tc2-priv
cmd> net use \\tc2\c$
节点2执行(略)


13.测试远程注册表
节点1执行
cmd> regedit->文件->连接网络注册表->输入tc2->检查名称-确定
节点2执行(略)


二、配置共享磁盘


1.共享磁盘划分规划
DISK1 TC_OCR_VOTE1 1G
DISK2 TC_OCR_VOTE2 1G
DISK3 TC_OCR_VOTE3 1G
DISK1 TC_DATA12G
DISK5 TC_DATA22G
DISK6 TC_FRA1 2G
DISK7 TC_FRA2 2G


从11g开始,Oracle推荐把OCR和VOTEDISK放到ASM中进行管理,所以这里共划分了7块磁盘,3块用于磁盘组OCRVOTE,采用NORMAL冗余,2块用于DATA,2块用于FRA,都是外部冗余。注意,这里分配的用于创建ASM磁盘组的磁盘必须是不带盘符的裸磁盘,在Windows 2003中,可以用diskmgmt.msc来代替diskpart来创建磁盘分区,但是在Windowns 2008中只能用diskpart来分区


2.设置自动挂载(所有节点)
cmd> diskpart
diskpart> automount enable


3.清除磁盘(节点1)
cmd> list disk
cmd> select disk 1
cmd> clean all
...
cmd> select disk 7
cmd> clean all


4.创建扩展分区和逻辑磁盘(节点1)
cmd> select disk 1
cmd> create part ext
cmd> create part log
...
cmd> select disk 7
cmd> create part ext
cmd> create part log


5.删除逻辑磁盘盘符(节点2)
本地节点上用diskpart创建完扩展分区和逻辑盘后不会显示逻辑盘符,但其他节点上可能会有,需要全部去除,注意,刚在节点2需重启才能发现节点1上对磁盘的分区
cmd> select disk 3 --注意对应的逻辑驱动器卷标,并不是从1开始的
cmd> remov
...
cmd> select disk 9
cmd> remov


6.用asmtool或asmtoolg来划分asm磁盘组分区
进入grid安装介质中,如:C:\grid\asmtools,运行amstoolg
选中要添加到同一个磁盘组的盘,输入磁盘组名称,点击下一步


三、安装Grid Infrastructure软件


1.预检安装条件是否满足
C:\grid> runcluvfy stage -pre crsinst -n tc1,tc2 -verbose
C:\grid> runcluvfy stage -post hwos -n tc1,tc2 -verbose

会提示集群服务配置失败,由于此时并没有配置过vip,忽略。还有一个警告是无法将用户 "Administrator" 作为域用户进行验证,这个可以忽略。最后一个警告是提示防火墙没有关闭,但检查了一下,确实是关闭的,根据后面OUI里面的提示,通过修改注册表可以关闭防火墙。但是后来发现是因为域配置文件中的防火墙没有关造成的


2.安装(略)


                                    


四、安装Database软件


1.预检安装条件是否满足
C:\grid> runcluvfy stage -pre dbinst -n tc1,tc2 -verbose


2.安装(略)
安装数据库软件卡在100%,卡了大约1个小时,多数是因为系统资源不够,测试环境内存太小,分配了2G也勉强能用,以为卡死掉了,不过耐心等待后终于完全装好,好费劲啊
结束之后要在远程节点执行ORACLE_HOME/bin/selecthome.bat,以激活以下5个产品:
Oracle Data Provider for .NET
Oracle Provider for OLE DB
Oracle Objects for OLE
Oracle Counters for Windows Performance Monitor
Oracle Administration Assistant


五、创建磁盘组(ASMCA)


1.创建+DATA和+FRA磁盘组
C:\Users\Administrator>set oracle_home=c:\app\11.2.0\grid
C:\Users\Administrator>set oracle_sid=+asm1
C:\Users\Administrator>asmcmd
ASMCMD> ls
DATA/
FRA/
OCRVOTE/


2.创建OCR镜像备份
虽然之前已经单独为OCR和VOTEDISK创建了一个磁盘组,但Oracle建议至少在其他磁盘组中存放OCR的镜像,注意,每个磁盘组只能存放一个OCR镜像
C:\Users\Administrator>asmcmd lsof
DB_Name  Instance_Name  Path
+ASM     +asm1          +ocrvote.255.4294967295
由于此时并未创建数据库实例,所以目前只有在+OCRDATE磁盘组中有唯一的一个文件,就是OCR文件


C:\Users\Administrator>asmcmd
ASMCMD> cd ocrvote/tc-cluster/ocrfile
ASMCMD> ls
REGISTRY.255.854982335
ASMCMD> pwd
+ocrvote/tc-cluster/ocrfile
注意,OCR实际的文件名是REGISTRY.255.854982335,而并不是+ocrvote.255.4294967295,这只是一个路径


OCR文件的备份方式


--自动备份
C:\Users\Administrator>ocrconfig -showbackup
PROT-24: Oracle 集群注册表的自动备份不可用
PROT-25: Oracle 集群注册表的手动备份不可用


默认Oracle会提供5份自动备份,按月、星期、天、以及保留最后3次改动,也可以手动执行备份,由于是新部署的环境,所以自动备份还未生成,也没有执行过手动备份


--手工备份
C:\Users\Administrator>ocrconfig -manualbackup


tc2     2014/08/08 11:05:30     C:\app\11.2.0\grid\cdata\tc-cluster\backup_20140808_110530.ocr
默认存放在“%ORACLE_CRS_HOME%\cdata\集群名\”下面,文件名格式为“backup_xxxxxxxx_xxxxxx.orc”
这个默认位置可以通过-backuploc参数来改
C:\Users\Administrator>ocrconfig -backuploc c:\app


C:\Users\Administrator>ocrconfig -manualbackup


tc2     2014/08/08 11:20:38     c:\app\backup_20140808_112038.ocr


tc2     2014/08/08 11:05:30     C:\app\11.2.0\grid\cdata\tc-cluster\backup_20140808_110530.ocr


注意,以上命令我是在tc1节点上执行的,但是默认却放到了tc2节点的本地路径,我又尝试在节点2上再次执行手工备份,依然是在tc2节点本地指定的路径生成OCR备份,难道是Oracle专门这样设计的吗?


--导出/导入到本地磁盘的方式
ocrconfig -export C:\ocr_bak.ocr
ocrconfig -import C:\ocr_bak.ocr

注意:利用自动或手动备份进行恢复是用restore而不是import


--在磁盘组中添加OCR冗余
C:\Users\Administrator>ocrconfig -add +DATA
C:\Users\Administrator>ocrconfig -add +FRA
C:\Users\Administrator>ocrcheck
Oracle 集群注册表的状态如下:
         版本                  :          3
         总空间 (KB)     :     262120--总共才250M左右
         已用空间 (KB)      :       2808
         可用空间 (KB):     259312
         ID                       :  513928542
         设备/文件名         :   +OCRVOTE
                                    设备/文件完整性检查成功
         设备/文件名         :      +DATA
                                    设备/文件完整性检查成功
         设备/文件名         :       +FRA
                                    设备/文件完整性检查成功


                                    设备/文件尚未配置


                                    设备/文件尚未配置


         集群注册表完整性检查成功


         逻辑损坏检查成功


这里在+DATA和+FRA磁盘组都配置了OCR的备份,可以看到,Oracle提供最多5个位置用来备份OCR


可以看到,Oracle提供了多种备份ORC的方法,在10g中,用得比较多的就是存放在多个RAW设备上,然后用export/import到RAW磁盘的方式进行备份恢复,到了11g,Oracle把OCR放入了磁盘组,默认就是放VOTEDISK的那个磁盘组,并且建议在其他磁盘组中创建冗余


3.查看表决磁盘
C:\Users\Administrator>crsctl query css votedisk
##  STATE    File Universal Id                File Name Disk group
--  -----    -----------------                --------- ---------
 1. ONLINE   7a6a6919ffe84fcfbf1e242c18f0b93e (\\.\ORCLDISKOCRVOTE2) [OCRVOTE]
 2. ONLINE   5857035b4da74fb3bf2f9c7d79a8aa2e (\\.\ORCLDISKOCRVOTE1) [OCRVOTE]
 3. ONLINE   7dd5966551d84fcbbffd88b32c038537 (\\.\ORCLDISKOCRVOTE0) [OCRVOTE]
找到了 3 个表决磁盘。


六、创建数据库实例(DBCA)


1.预检之前安装的RAC数据库软件是否正常
c:\grid> runcluvfy stage -pre dbcfg -n all -d C:\app\11.2.0\grid -verbose


2.创建数据库实例

c:\grid> dbca


***********
  DG部分
***********


*****主库配置*****



1.开启归档和force logging
SQL> select database_role,log_mode,force_logging from v$database;


DATABASE_ROLE    LOG_MODE     FOR
---------------- ------------ ---
PRIMARY          ARCHIVELOG   NO


SQL> alter database force logging;


2.修改主库DG配置需要的参数
SQL> ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(tc,tcdg)';
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES)DB_UNIQUE_NAME=tc';
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=tcdgLGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)DB_UNIQUE_NAME=tcdg';
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=ENABLE;
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE;
SQL> ALTER SYSTEM SET FAL_SERVER=tcdg;
SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT='AUTO';


默认情况下,如果不指定scope,默认是both,这里我们需要让设置的参数在内存和spfile同时生效,所以可以不加scope=both。此外,数据库默认的db_unique_name=db_name,因此也不作修改


SQL> show parameter db_unique_name


NAME                                 TYPE        VALUE
------------------------------------ ----------- ----------------
db_unique_name                       string      tc


以下两个参数修改后,需重启生效,必须加上scope=spfile
SQL> ALTER SYSTEM SET DB_FILE_NAME_CONVERT='C:\app\oracle\oradata\tc','+data/tc/datafile' scope=spfile;
SQL> ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='C:\app\oracle\oradata\tc','+data/tc/onlinelog' scope=spfile;


生产环境停库需要先停应用,再停监听,执行检查点,把在线日志归档
C:\Users\Administrator>srvctl stop listener -n tc1
C:\Users\Administrator>srvctl stop lisetner -n tc2
SQL> alter system checkpoint;
SQL> alter system archive log current;
C:\Users\Administrator>srvctl stop database -d tc


再启动数据库(注意,启动数据库时,会自动开启监听)
C:\Users\Administrator>srvctl start database -d tc


SQL> show parameter file_name_convert


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_file_name_convert                 string      C:\app\oracle\oradata\tc, +data/tc/datafile
log_file_name_convert                string      C:\app\oracle\oradata\tc, +data/tc/onlinelog


可以看到,2个转换文件名的参数已经生效了


3.创建tnsnames.ora和listener.ora
C:\Users\Administrator>netca,添加备库的NET SERVICE NAME:tcdg
也可以在原有的tnsnames.ora中进行修改,那么就不用netca了


修改完的内容如下:
# tnsnames.ora Network Configuration File: C:\app\oracle\product\11.2.0\dbhome_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.


TC =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = tc-cluster-scan)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = tc)
    )
  )


TCDG =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.108)(PORT = 1521))  --这里HOST到底用主机名还是IP可以根据需求
    )
    (CONNECT_DATA =
      (SERVICE_NAME = tc)--注意这里是tc而不是tcdg,因为实例名和主库保持一致
    )
  )


注意,由于GI的监听是在%ORACLE_CRS_HOME%/network/admin中的,即C:\app\11.2.0\grid\NETWORK\ADMIN,而不是单实例的%ORACLE_HOME%/network/admin,即C:\app\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN


默认RAC数据库是用grid下的netca来创建监听的,可以通过以下命令查看
C:\Users\Administrator>call C:\app\11.2.0\grid\BIN\netca


Oracle Net Services 配置:
Oracle Net Configuration Assistant 是从网格基础结构主目录启动的。网络配置将是集
群范围的。


在打开的配置界面中,可以看到已经有一个LISTENER的监听了,打开C:\app\11.2.0\grid\NETWORK\ADMIN下的listener.ora,发现内容如下,和我们熟悉的listener.ora并不同:


LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER))))# line added by Agent
LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1))))# line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON # line added by Agent


已经有2个监听了,而我们需要的是能用于单实例的监听,又不和原有动态监听冲突,所以考虑给主库创建一个静态监听,用net manager应用程序来创建,完成后会在%ORACLE_HOME%/network/admin目录下生成一个listener.ora的文件,内容如下:


# listener.ora Network Configuration File: C:\app\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.


SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = tc)
      (ORACLE_HOME = C:\app\oracle\product\11.2.0\dbhome_1)
      (SID_NAME = tc1)--注意是节点1的实例,所以是tc1,不能写成tc
    )
  )


LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = TC1)(PORT = 1521))
  )


ADR_BASE_LISTENER = C:\app\oracle\product\11.2.0\dbhome_1\log


如果配置正确,那么会显示如下的监听状态:
C:\Users\Administrator>lsnrctl status
...
服务摘要..
服务 "+ASM" 包含 1 个实例。
  实例 "+asm1", 状态 READY, 包含此服务的 1 个处理程序...
服务 "tc" 包含 2 个实例。
  实例 "tc1", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
  实例 "tc1", 状态 READY, 包含此服务的 1 个处理程序...
服务 "tcXDB" 包含 1 个实例。
  实例 "tc1", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功

1个动态监听,1个静态监听,都为实例tc1创建了服务tc

4.创建密码文件(可省略)
C:\Users\Administrator>orapwd file=pwdtc1.ora password=oracle entries=5 


5.创建备库初始化参数文件
SQL> create pfile='c:\inittc1.ora' from spfile;


6.复制tnsnames.ora,listener.ora,密码文件,初始化参数文件到备库相应位置


*****备库配置*****


1.根据pfile创建相应的目录
mkdir C:\app\oracle\admin\tc\adump
mkdir C:\app\oracle\admin\tc\dpdump
mkdir C:\app\oracle\admin\tc\hdump
mkdir C:\app\oracle\admin\tc\pfile
mkdir C:\app\oracle\oradata\tc
mkdir C:\app\oracle\flash_recovery_area

可以只创建红色部分

2.把从主库复制过来的文件做相应修改,在这些文件中,除了tnsnames.ora可以原封不动,其他都需要进行相应修改,包括修改文件名,修改完的pfile内容如下:
*.__db_cache_size=0
*.__java_pool_size=0
*.__large_pool_size=0

*.__oracle_base='C:\app\oracle'#ORACLE_BASE set from environment
*.__pga_aggregate_target=0
*.__sga_target=0
*.__shared_io_pool_size=0
*.__shared_pool_size=0
*.__streams_pool_size=0

*.audit_file_dest='C:\app\oracle\admin\tc\adump'
*.audit_trail='db'
*.cluster_database=false --这个参数必须设置为false,说明是单实例数据库,否则启动会报错
*.compatible='11.2.0.0.0'
*.control_files='C:\app\oracle\oradata\tc\control01.ctl','C:\app\oracle\oradata\tc\control02.ctl'
*.db_block_size=8192
*.db_create_file_dest='C:\app\oracle\oradata'
*.db_domain=''
*.db_name='tc'
*.db_recovery_file_dest='C:\app\oracle\flash_recovery_area'
*.db_recovery_file_dest_size=3908042752
*.diagnostic_dest='C:\app\oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=tcXDB)'
*.fal_server='TC'
*.instance_number=1
*.log_archive_config='DG_CONFIG=(tc,tcdg)'
*.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=tcdg'
*.log_archive_dest_2='SERVICE=tc LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=tc'

*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.log_archive_format='ARC%S_%R.%T'
*.memory_target=857735168
*.nls_language='SIMPLIFIED CHINESE'
*.nls_territory='CHINA'
*.open_cursors=300
*.processes=150
#*.remote_listener='tc-cluster-scan:1521' --原来的远程监听,这行要注释掉,单实例上没有这个参数
*.remote_login_passwordfile='exclusive'
*.standby_file_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.db_file_name_convert='+data/tc/datafile','C:\app\oracle\oradata\tc\'
*.log_file_name_convert='+data/tc/onlinelog','C:\app\oracle\oradata\tc\'
*.db_unique_name=tcdg --复制过来的pfile如果不设置这个参数,默认的值是tc,所以必须要修改掉


注意,红色部分是需要修改的内容,由于主库是RAC数据库,很多用于RAC的参数已经去掉,没有全部列出

3.创建服务
oradim -new -sid tc -startmode manual -spfile


4.启动监听
C:\Users\Administrator>lsnrctl start


5.用pfile启动
如果启动时遇到ORA-12560: TNS: 协议适配器错误,那么请检查以下2点:


1.是否启动了OracleServervicetcdg服务
由于之前创建实例时用了-startmode manual,那么主机重启后需手动启动这个服务,Oracle建议这些服务都是手动的
C:\Users\Administrator>net start oracleservicetcdg
OracleServicetcdg 服务正在启动 ..
OracleServicetcdg 服务已经启动成功。


2.是否设置了正确的ORACLE_SID
C:\Users\Administrator>set oracle_sid=tc


C:\Users\Administrator>sqlplus / as sysdba
SQL> startup nomount
ORACLE 例程已经启动。


Total System Global Area  855982080 bytes--由memory_target参数确定
Fixed Size                  2260000 bytes
Variable Size             507511776 bytes
Database Buffers          343932928 bytes
Redo Buffers                2277376 bytes
SQL> 


注意,这里系统重新分配了各内存组件的内存,其实刚才修改pfile的时候,把这些参数的值全部设置为0了:


*.__db_cache_size=0
*.__java_pool_size=0
*.__large_pool_size=0
*.__pga_aggregate_target=0
*.__sga_target=0
*.__shared_io_pool_size=0
*.__shared_pool_size=0
*.__streams_pool_size=0



这样就表示由数据库自动管理这些内存组件,包括SGA和PGA,具体是由以下这个参数来分配的:
*.memory_target=857735168

注意,生产环境务必要改大这个参数值,起码是真实物理内存的40%-60%


主库或备库执行:


C:\Users\Administrator>rman target sys/oracle@tc auxiliary sys/oracle@tcdg


恢复管理器: Release 11.2.0.3.0 - Production on 星期六 8月 9 12:26:33 2014


Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.


已连接到目标数据库: TC (DBID=3163057399)
已连接到辅助数据库: TC (未装载)


如果在备库上执行出现以下错误:


RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00554: 内部恢复管理器程序包初始化失败
RMAN-04005: 目标数据库中存在错误:
ORA-12545: 因目标主机或对象不存在, 连接失败


那么需要在备库主机的hosts中加入一行:
192.168.56.105 tc-cluster-scan--注意,这里添加的是scan-ip,而不是具体的节点1或节点2的主机名


RMAN> duplicate target database for standby from active database;
出现如下错误:


RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: Duplicate Db 命令 (在 08/09/2014 17:19:04 上) 失败
RMAN-05501: 终止复制目标数据库
RMAN-05517: 临时文件 +DATA/tc/tempfile/temp.263.855057647 与目标数据库使用的文件
冲突


那么就需要用SET NEWNAME FOR TEMPFILE 1 TO 'PATH'来指定一下文件名,如下(注意换了一种写法):


RMAN> run{
allocate channel c1 device type disk;
allocate auxiliary channel c2 device type disk;
set newname for tempfile 1 to 'c:\app\oracle\oradata\tc\temp01.dbf';
duplicate target database for standby from active database;

release channel c1;
release channel c2;
}


其实还可以加上更多的参数来进行duplicate:


RMAN> run{
allocate channel c1 device type disk;
allocate auxiliary channel c2 device type disk;
set newname for tempfile 1 to 'c:\app\oracle\oradata\tc\temp01.dbf';
duplicate target database for standby from active database 
spfile --可以使用spfile参数来添加备库所需参数 
set control_files='c:\app\oracle\oradata\tc\control01.ctl','\app\oracle\oradata\tc\control02.ct' 
set log_archive_config='DG_CONFIG=(tc,tcdg)' 
set log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=tcdg' 
set log_archive_dest_2='SERVICE=tc LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=tc' 
set log_archive_dest_state_1='ENABLE' 
set log_archive_dest_state_2='ENABLE' 
set remote_login_passwordfile='exclusive' 
set standby_file_management='AUTO'; 
set db_file_name_convert='+data/tc/datafile','C:\app\oracle\oradata\tc' 
set log_file_name_convert='+data/tc/onlinelog','C:\app\oracle\oradata\tc' 
set db_name=tc 
set db_unique_name=tcdg;
release channel c1;
release auxiliary channel c2;
}



注意,如果使用了spfile参数,那么就不再使用备库上的pfile,会直接在备库上生成一个修改好参数的spifle并使用,所以建议把备库上需要的DG参数全部加上


--备库查看文件:

SQL> set lin 80 pages 80
SQL> col name for a50
SQL> select file#,name from v$datafile;


     FILE# NAME
---------- --------------------------------------------------
         1 C:\APP\ORACLE\ORADATA\TC\SYSTEM.256.855057451
         2 C:\APP\ORACLE\ORADATA\TC\SYSAUX.257.855057453
         3 C:\APP\ORACLE\ORADATA\TC\UNDOTBS1.258.855057453
         4 C:\APP\ORACLE\ORADATA\TC\USERS.259.855057453
         5 C:\APP\ORACLE\ORADATA\TC\EXAMPLE.264.855057687
         6 C:\APP\ORACLE\ORADATA\TC\UNDOTBS2.265.855058289


SQL> select file#,name from v$tempfile;


     FILE# NAME
---------- --------------------------------------------------
         1 C:\APP\ORACLE\ORADATA\TC\TEMP01.DBF


SQL> select group#,member from v$logfile;


    GROUP#
----------
MEMBER
-----------------------------------------------------------------------


         2
C:\APP\ORACLE\ORADATA\TC\GROUP_2.262.855057605


         2
C:\APP\ORACLE\ORADATA\TCDG\ONLINELOG\O1_MF_2_9YCZCO9R_.LOG


         1
C:\APP\ORACLE\ORADATA\TC\GROUP_1.261.855057597


         1
C:\APP\ORACLE\ORADATA\TCDG\ONLINELOG\O1_MF_1_9YCZBZ3X_.LOG


         3
C:\APP\ORACLE\ORADATA\TC\GROUP_3.266.855058587


         3
C:\APP\ORACLE\ORADATA\TCDG\ONLINELOG\O1_MF_3_9YCZDHFO_.LOG


         4
C:\APP\ORACLE\ORADATA\TC\GROUP_4.267.855058593


         4
C:\APP\ORACLE\ORADATA\TCDG\ONLINELOG\O1_MF_4_9YCZF9L2_.LOG


         1
C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\ONLINELOG\O1_MF_1_9YCZC41Y_.LOG


         2
C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\ONLINELOG\O1_MF_2_9YCZCXOH_.LOG


         3
C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\ONLINELOG\O1_MF_3_9YCZDOGN_.LOG


         4
C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\ONLINELOG\O1_MF_4_9YCZFJTV_.LOG




已选择12行。


SQL> select group#,thread#,members from v$log;


    GROUP#    THREAD#    MEMBERS
---------- ---------- ----------
         1          1          3
         2          1          3
         3          2          3
         4          2          3


备库共有4组online redo logfile,每组3个日志文件,Oracle建议适当增加日志组,每组最多2个成员,而现在每组3个成员显然太多了,对性能会有影响,删除一组FRA下面的


SQL> alter database drop logfile member 'C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\ONLINELOG\O1_MF_1_9YCZC41Y_.LOG';


数据库已更改。


SQL> alter database drop logfile member 'C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\
ONLINELOG\O1_MF_2_9YCZCXOH_.LOG';
alter database drop logfile member 'C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\ONLIN
ELOG\O1_MF_2_9YCZCXOH_.LOG'
*
第 1 行出现错误:
ORA-01609: 日志 2 是线程 1 的当前日志 - 无法删除成员
ORA-00312: 联机日志 2 线程 1: 'C:\APP\ORACLE\ORADATA\TC\GROUP_2.262.855057605'
ORA-00312: 联机日志 2 线程 1:
'C:\APP\ORACLE\ORADATA\TCDG\ONLINELOG\O1_MF_2_9YCZCO9R_.LOG'
ORA-00312: 联机日志 2 线程 1:
'C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\ONLINELOG\O1_MF_2_9YCZCXOH_.LOG'


SQL> alter database drop logfile member 'C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\ONLINELOG\O1_MF_3_9YCZDOGN_.LOG';


数据库已更改。


SQL> alter database drop logfile member 'C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\ONLINELOG\O1_MF_4_9YCZFJTV_.LOG';


数据库已更改。


SQL> select group#,members,status from v$log;


    GROUP#    MEMBERS STATUS
---------- ---------- ----------------
         1          2 CLEARING
         2          3 CURRENT
         3          2 UNUSED
         4          2 UNUSED


第2组的日志由于正在使用,所以无法删除,先不管,等有机会切换日志后再进行删除


--再来看一下主库的online redo logfile的情况:

SQL> col member for a45
SQL> select group#,member from v$logfile;


    GROUP# MEMBER
---------- ---------------------------------------------
         2 +DATA/tc/onlinelog/group_2.262.855057605
         2 +FRA/tc/onlinelog/group_2.258.855057607
         1 +DATA/tc/onlinelog/group_1.261.855057597
         1 +FRA/tc/onlinelog/group_1.257.855057601
         3 +DATA/tc/onlinelog/group_3.266.855058587
         3 +FRA/tc/onlinelog/group_3.259.855058591
         4 +DATA/tc/onlinelog/group_4.267.855058593
         4 +FRA/tc/onlinelog/group_4.260.855058595


也是一共4组,但每组是2个成员,可以看到,用duplicate过来的备库,每组多创建了个1个成员


--在备库添加standby redo logfile

SQL> alter database add standby logfile 'C:\app\oracle\oradata\tc\std_05.log'size 50m;
SQL> alter database add standby logfile 'C:\app\oracle\oradata\tc\std_06.log'size 50m;
SQL> alter database add standby logfile 'C:\app\oracle\oradata\tc\std_07.log'size 50m;
SQL> alter database add standby logfile 'C:\app\oracle\oradata\tc\std_08.log'size 50m;
SQL> alter database add standby logfile 'C:\app\oracle\oradata\tc\std_09.log'size 50m;


注意,如果不指定组号,默认会在online redo logfile组的基础上递增,如,原来有4组online redo logfile,那么可以看到添加后的备库日志:
SQL> select group#,thread# from v$standby_log;


    GROUP#    THREAD#
---------- ----------
         5          0 --备库日志文件从5开始编号
         6          0
         7          0
         8          0
         9          0


刚才默认创建了5组standby redo logfile,thread#为0是因为还没有被应用,应用以后应该是1


--主库查看归档路径状态

SQL> col destination for a30
SQL> col error for a20
SQL> select dest_id,destination,status,error fromv$archive_dest_state where dest_id<3;


   DEST_ID DESTINATION                    STATUS    ERROR
---------- ------------------------------ --------- --------------------
         1 USE_DB_RECOVERY_FILE_DEST      VALID
         2 tcdg                           VALID


--备库查看归档路径状态

SQL> col destination for a30
SQL> col error for a20
SQL> select dest_id,destination,status,error fromv$archive_dest_state where dest_id<3
;


   DEST_ID DESTINATION                    STATUS    ERROR
---------- ------------------------------ --------- --------------------
         1 USE_DB_RECOVERY_FILE_DEST      VALID
         2 tc                             VALID


--开始应用日志

SQL> alter database recover managed standby databaseusing current logfile disconnect from session;


--主库切换1次日志

SQL> alter system switch logfile;


系统已更改。


--备库查看日志应用情况

SQL> select sequence#,applied fromv$archived_log;


 SEQUENCE# APPLIED
---------- ---------
        30 YES
        29 YES
        31 YES
        32 YES
        33 YES
        34 IN-MEMORY --说明正在应用


已选择6行。


SQL> select group#,status from v$log;


    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 CLEARING --CLEARING状态了,而非CURRENT了
         3 UNUSED
         4 UNUSED


--删除刚才没有成功的那个group2的日志组成员
SQL> alter database drop logfile member 'C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\ONLINELOG\O1_MF_2_9YCZCXOH_.LOG';
alter database drop logfile member 'C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\
*
第 1 行出现错误:
ORA-01156: 进行中的恢复或闪回可能需要访问文件


--需要先停止REDO APPLY后再删除

SQL> recover managed standby database cancel;
完成介质恢复。
SQL> alter database drop logfile member 'C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\
ONLINELOG\O1_MF_2_9YCZCXOH_.LOG';


数据库已更改。


SQL> select group#,members from v$log;


    GROUP#    MEMBERS
---------- ----------
         1          2
         2          2
         3          2
         4          2


--删完日志文件后,要记得把standby_file_management参数的值改回为AUTO

SQL> show parameter standby_file_management;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------
standby_file_management              string      MANUAL
SQL> alter system set standby_file_management=auto;


系统已更改。


SQL> show parameter standby_file_management


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------
standby_file_management              string      AUTO


--重新启用REDO APPLY

SQL> recover managed standby database using current logfile disconnect from session;
完成介质恢复。


至此,RAC-DG顺利搭建完成。


总结:
由于本机的内存并不大,只有8G,在两个节点共分配2G,DG节点分配1.5G以后,经常会出现卡顿现象,而且是在已经关闭节点2,只在节点1上操作的情况下,节点1会经常由于内存不足而崩溃重启,估计对于Window 2008而言,2G物理内存实在是太少了,不过这个情况在生产环境应该要好一点,起码都是几十G到几百G的物理内存环境。


今天用的是duplicate方式来创建的物理备库,其实这是11g新特性,在10g中,我们只能以rman全库备份的方式进行异机恢复,duplicate的好处是可以直接在备库创建online redo logfile,并且能用spifle指定备库所需参数,无需创建全库备份,主库所有文件可以自动化地由rman恢复到备库,包括密码文件,临时文件等,还可以用dorecover还原online redo logfile中的内容,使恢复出来的备库获得最新的数据文件,可以加快DG同步的时间


Tips:
1.使用远程桌面连接方式安装,可以不装VBox的辅助工具,也无需添加共享文件夹,就能方便的在主机和虚拟机之间方便地复制安装介质或命令。


2.在11g中数据库警告日志文件的位置与10g不同,要注意,不要混淆了,分析日志同步故障要先看警告日志
通用路径:%ORACLE_HOME%\diag\rdbms\DB_UNIQUE_NAME\SID_NAME\trace\alertSID.log
节点1:C:\app\Administrator\diag\rdbms\tc\tc1\trace\alert_tc1.log
备库:C:\app\oracle\diag\rdbms\tcdg\tc\trace\alert_tc.log


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值