Windows 2008 R2 搭建10.2.0.4 DG

OS:Windows 2008 R2 DataCenter

Database:10.2.0.4

Primary Database  DB_UNIQUE_NAME:ora10gpd

IP:192.168.17.10

Standby Database DB_UNIQUE_NAME:ora10gst

IP:192.168.17.11

SID:ora10g

INSTANCE_NAME:ora10g

SERVICE_NAME:ora10g

GLOBAL_DBNAME:ora10g

DBNAME:ora10g

Net Service Name:ORA10GPD,ORA10GST



安装数据库软件选择介质要注意,需直接安装10.2.0.4的版本,Window 2008 R2已不再支持Win_64的10.2.0.1的包,而不是像Windows 2003 Etnerprise那样,先装完10.2.0.1再升级到10.2.0.4


另外要注意,如果执行setup没有通过检查,需要修改安装的参数文件oraparam,这个文件位于安装介质database\install\oraparam,把不符合要求的数值添加一下即可通过,在OUI界面出来后正式安装前,选用户已验证,忽略操作系统的检查就可以顺利安装了


主库安装完软件以后用dbca创建数据库实例ora10g,备库只需要安装数据库软件即可


Primary Database Configuration:


1.设置主数据库为force logging模式

SQL> conn /as sysdba

SQL> select force_logging from v$database;

SQL> alter database force logging;


2. 设置主数据库为归档模式

先查看一下是否为归档模式,有两种方法:


方法一:
SQL> archive log list


方法二:
SQL> select log_mode from v$database;


修改为归档模式

SQL> shutdown immediate

SQL> startup mount

SQL> alter database archivelog;


3. 主库添加standby redo logfile

注意:添加的standby redo logfile group的数量为N+1,N为online redo logfile的数量
SQL> alter database add standby logfile group 4 ('C:\ORACLE\PRODUCT\10.2.0\ORADATA\ora10g\stdredo04.log') size 50m;
SQL> alter database add standby logfile group 5 ('C:\ORACLE\PRODUCT\10.2.0\ORADATA\ora10g\stdredo05.log') size 50m;
SQL> alter database add standby logfile group 6 ('C:\ORACLE\PRODUCT\10.2.0\ORADATA\ora10g\stdredo06.log') size 50m;
SQL> alter database add standby logfile group 7 ('C:\ORACLE\PRODUCT\10.2.0\ORADATA\ora10g\stdredo07.log') size 50m;


SQL> set lin 80 pages 120
SQL> col member for a60
SQL> select group#,member from v$logfile;


    GROUP# MEMBER
---------- ------------------------------------------------------------
         3 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\REDO03.LOG
         2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\REDO02.LOG
         1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\REDO01.LOG
         4 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\STDREDO4.LOG
         5 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\STDREDO5.LOG
         6 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\STDREDO6.LOG
         7 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\STDREDO7.LOG


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


    GROUP# STATUS
---------- ----------
         4 UNASSIGNED
         5 UNASSIGNED
         6 UNASSIGNED
         7 UNASSIGNED


此时主库还未切换成备库,所以备库日志文件状态皆为“UNASSIGNED


4. 创建主库的初始化参数给备库用
SQL> create pfile from spfile;
存放目录默认为:%ORACLE_HOME%\database\INITora10g.ora
创建完参数后,写回到spfile并用修改好参数的spifle启动
SQL> shutdown immeidate
SQL> startup pfile=%ORACLE_HOME%/database/INITora10g.ora;
SQL> create spfile from pfile;
SQL> shutdown immeidate
SQL> startup


5. 在主库创建备库的控制文件和密码文件
SQL> alter database create standby controlfile as 'C:\control01.ctl';
C:\Users\Administrator>orapwd file=C:\PWDora10g.ora password=oracle entries=5;
注意:windows下口令文件的格式是pwdsid.ora,unix下的格式是orapwSID(大小写敏感)


6. 在主库创建LISTENER.ora和tnsnames.ora
用netca创建动态监听和tnsnames.ora,用net manager创建静态监听


配置好的LISTENER.ora显示如下:
# listener.ora Network Configuration File: C:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.


SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = ora10g)
      (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
      (SID_NAME = ora10g)
    )
  )


LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ora10gpd)(PORT = 1521))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )


配置好的tnsnames.ora显示如下:
# tnsnames.ora Network Configuration File: C:\oracle\product\10.2.0\db_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.


ORA10GPD =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ora10gpd)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ora10g)
    )
  )


ORA10GST =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ora10gst)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ora10g)
    )
  )


EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )


7. 配置主库pfile,添加DG参数
由于主备库采用路径一致,实例名也一致,所以没有添加db_file_name_convert和log_file_name_convert这2个参数


主库部分:
DB_UNIQUE_NAME=ora10gpd
LOG_ARCHIVE_CONFIG='DG_CONFIG=(ora10gpd,ora10gst)'
LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES)DB_UNIQUE_NAME=ora10gpd'
LOG_ARCHIVE_DEST_2='SERVICE=ora10gst lgwr VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ora10gst'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE


备库部分:
FAL_SERVER=ora10gst
FAL_CLIENT=ora10gpd
STANDBY_FILE_MANAGEMENT='AUTO'

8. 拷贝参数文件,密码文件到备库
INITora10g.ora参数文件,PWDora10g.ora密码文件考到%ORACLE_HOME%\database下


9. 用RMAN备份主库数据库文件及控制文件并复制到备库
rman target /
run
{
allocate channel d1 type disk format 'c:\%U';
backup full database include current controlfile for standby;
release channel d1;
}


Standby Database Configuration:


10. 复制pfile到备库后,对相应参数做调整,大致如下:

主库时参数:

DB_UNIQUE_NAME=ora10gst
LOG_ARCHIVE_CONFIG='DG_CONFIG=(ora10gpd,ora10gst)'
LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES)DB_UNIQUE_NAME=ora10gst'
LOG_ARCHIVE_DEST_2='SERVICE=ora10gpd lgwr VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ora10gpd'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE


备库时参数:
FAL_SERVER=ora10gpd
FAL_CLIENT=ora10gst
STANDBY_FILE_MANAGEMENT='AUTO'



11. 在备库启动实例
C:\Users\Administrator>sqlplus / as sysdba


SQL*Plus: Release 10.2.0.4.0 - Production on Tue Jul 15 00:31:35 2014


Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.


ERROR:
ORA-12560: TNS:protocol adapter error


C:\Users\Administrator>set oracle_sid=ora10g


C:\Users\Administrator>sqlplus / as sysdba


SQL*Plus: Release 10.2.0.4.0 - Production on Tue Jul 15 00:37:27 2014


Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.


Connected to an idle instance.


SQL> 

如果设置了ORACLE_SID后仍然报ORA-12560,则需要查看一下Windows服务OracleServiceora10g是否没有启动

Windows中如果需要配置实例名,可以用oradim这个工具(可选步骤)
C:\Users\Administrator>oradim -new -sid ora10g


SQL> startup nomount
ORA-02778: Name given for the log directory is invalid


尝试删除文件pfile后:
SQL> startup nomount
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file 'C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE
\INITORA10G.ORA'


把pfile还原:
SQL> startup nomount
ORA-02778: Name given for the log directory is invalid


SQL> startup nomount
ORA-01261: Parameter db_recovery_file_dest destination string cannot be translated
ORA-01263: Name given for file destination directory is invalid
OSD-04018: Unable to access the specified directory or device.
O/S-Error: (OS 2) 系统找不到指定的文件。


添加以下目录后再次执行:
C:\oracle\product\10.2.0\flash_recovery_area
C:\oracle\product\10.2.0\admin\ora10g\adump
C:\oracle\product\10.2.0\admin\ora10g\bdump
C:\oracle\product\10.2.0\admin\ora10g\cdump

C:\oracle\product\10.2.0\admin\ora10g\dpdump
C:\oracle\product\10.2.0\admin\ora10g\pfile
C:\oracle\product\10.2.0\admin\ora10g\udump
主要是红色这几个文件,因为在pfile中有参数对应这几个位置

SQL> startup nomount
ORACLE instance started.


Total System Global Area  612368384 bytes
Fixed Size                  2067656 bytes
Variable Size             171967288 bytes
Database Buffers          432013312 bytes
Redo Buffers                6320128 bytes
SQL> 

手动创建和主库一致的目录后问题解决


12. 把生成的备份集复制到备库后,执行恢复

rman target / auxiliary sys/oracle@ora10gst
run
{
allocate auxiliary channel d1 type disk;
duplicate target database for standby dorecover nofilenamecheck;
release channel d1;
}


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


恢复管理器: Release 10.2.0.4.0 - Production on 星期二 7月 15 00:52:10 2014


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


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


RMAN> run
2> {
3> allocate auxiliary channel d1 type disk;
4> duplicate target database for standby dorecover nofilenamecheck;
5> release channel d1;
6> }


使用目标数据库控制文件替代恢复目录
分配的通道: d1
通道 d1: sid=157 devtype=DISK


启动 Duplicate Db 于 15-7月 -14


内存脚本的内容:
{
   set until scn  660928;
   restore clone standby controlfile;
   sql clone 'alter database mount standby database';
}
正在执行内存脚本


正在执行命令: SET until clause


启动 restore 于 15-7月 -14


通道 d1: 正在还原控制文件


故障转移到上一个备份


释放的通道: d1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: Duplicate Db 命令 (在 07/15/2014 00:52:43 上) 失败
RMAN-03015: 在存储的脚本Memory Script中出现错误
RMAN-06026: 有些目标没有找到 - 终止还原
RMAN-06024: 没有找到控制文件的备份或副本来还原


13. 尝试用备库连接主库并做还原
C:\Users\Administrator>rman target sys/oracle@ora10gpd auxiliary /


Recovery Manager: Release 10.2.0.4.0 - Production on Tue Jul 15 01:59:05 2014


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


RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00554: initialization of internal recovery manager package failed
RMAN-04005: error from target database:
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor


查看监听状态
C:\Users\Administrator>lsnrctl status


LSNRCTL for 64-bit Windows: Version 10.2.0.4.0 - Production on 15-7月 -2014 02:0
9:01


Copyright (c) 1991, 2007, Oracle.  All rights reserved.


正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora10gst)(PORT=1521)))
LISTENER 的 STATUS
------------------------
别名                      LISTENER
版本                      TNSLSNR for 64-bit Windows: Version 10.2.0.4.0 - Produ
ction
启动日期                  15-7月 -2014 00:28:29
正常运行时间              0 天 1 小时 40 分 34 秒
跟踪级别                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
监听程序参数文件          C:\oracle\product\10.2.0\db_1\network\admin\listener.o
ra
监听程序日志文件          C:\oracle\product\10.2.0\db_1\network\log\listener.log


监听端点概要...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora10gst)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC0ipc)))
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
  例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "ora10g" 包含 1 个例程。
  例程 "ora10g", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "ora10gst" 包含 1 个例程。
  例程 "ora10g", 状态 BLOCKED, 包含此服务的 1 个处理程序...
服务 "ora10gst_XPT" 包含 1 个例程。
  例程 "ora10g", 状态 BLOCKED, 包含此服务的 1 个处理程序...
命令执行成功


停止监听
C:\Users\Administrator>lsnrctl stop


LSNRCTL for 64-bit Windows: Version 10.2.0.4.0 - Production on 15-7月 -2014 02:0
9:15


Copyright (c) 1991, 2007, Oracle.  All rights reserved.


正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora10gst)(PORT=1521)))
命令执行成功


重新启动监听
C:\Users\Administrator>lsnrctl start


LSNRCTL for 64-bit Windows: Version 10.2.0.4.0 - Production on 15-7月 -2014 02:0
9:20


Copyright (c) 1991, 2007, Oracle.  All rights reserved.


启动tnslsnr: 请稍候...


TNSLSNR for 64-bit Windows: Version 10.2.0.4.0 - Production
系统参数文件为C:\oracle\product\10.2.0\db_1\network\admin\listener.ora
写入C:\oracle\product\10.2.0\db_1\network\log\listener.log的日志信息
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora10gst)(PORT=1521)))
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC0ipc)))


正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora10gst)(PORT=1521)))
LISTENER 的 STATUS
------------------------
别名                      LISTENER
版本                      TNSLSNR for 64-bit Windows: Version 10.2.0.4.0 - Produ
ction
启动日期                  15-7月 -2014 02:09:24
正常运行时间              0 天 0 小时 0 分 5 秒
跟踪级别                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
监听程序参数文件          C:\oracle\product\10.2.0\db_1\network\admin\listener.o
ra
监听程序日志文件          C:\oracle\product\10.2.0\db_1\network\log\listener.log


监听端点概要...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora10gst)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC0ipc)))
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
  例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "ora10g" 包含 1 个例程。
  例程 "ora10g", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功

UNKNOW表示静态监听

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


恢复管理器: Release 10.2.0.4.0 - Production on 星期二 7月 15 02:13:41 2014


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


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


RMAN>


原因:由于监听没有重启过,故之前设置的静态监听没有生效,还是原来错误的信息


RMAN> duplicate target database for standby dorecover nofilenamecheck;


启动 Duplicate Db 于 15-7月 -14
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: sid=155 devtype=DISK


内存脚本的内容:
{
   set until scn  660928;
   restore clone standby controlfile;
   sql clone 'alter database mount standby database';
}
正在执行内存脚本


正在执行命令: SET until clause


启动 restore 于 15-7月 -14
使用通道 ORA_AUX_DISK_1


通道 ORA_AUX_DISK_1: 正在还原控制文件


故障转移到上一个备份


RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: Duplicate Db 命令 (在 07/15/2014 02:19:01 上) 失败
RMAN-03015: 在存储的脚本Memory Script中出现错误
RMAN-06026: 有些目标没有找到 - 终止还原
RMAN-06024: 没有找到控制文件的备份或副本来还原


在备库上连接主库,并且没有用通道依旧不行


14. 直接在备库上进行还原
RMAN> catalog start with 'c:\';


使用目标数据库控制文件替代恢复目录
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: catalog 命令 (在 07/15/2014 02:32:59 上) 失败
ORA-01507: 未装载数据库


RMAN> catalog backuppiece 'c:\02PDDMR5_1_1';  --之前主库做全备时生成的控制文件备份集


RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: catalog 命令 (default 通道上, 在 07/15/2014 02:33:31 上) 失败
ORA-01507: 未装载数据库


RMAN>


C:\Users\Administrator>sqlplus / as sysdba


SQL*Plus: Release 10.2.0.4.0 - Production on 星期二 7月 15 02:35:06 2014


Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.




连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options


SQL> alter database mount standby database;
alter database mount standby database
*
第 1 行出现错误:
ORA-00205: 标识控制文件时出错, 有关详细信息, 请查看预警日志


此时由于控制文件还没有恢复,无法启动到mount状态,也无法利用备份集恢复数据文件


15. 直接把在主库上为备库创建过的备库控制文件复制到备库相应位置
SQL> startup mount
ORACLE 例程已经启动。


Total System Global Area  612368384 bytes
Fixed Size                  2067656 bytes
Variable Size             171967288 bytes
Database Buffers          432013312 bytes
Redo Buffers                6320128 bytes
ORA-00205: ?????????, ??????, ???????


这里乱码可能是因为环境变量的问题,其实是还是下面这句:


ORA-00205: error in identifying control file, check alert log for more info

C:\Users\Administrator>rman target /


恢复管理器: Release 10.2.0.4.0 - Production on 星期二 7月 15 09:45:44 2014


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


连接到目标数据库: ora10g (未装载)


RMAN> restore controlfile from 'c:\02PDDMR5_1_1';


启动 restore 于 15-7月 -14
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=156 devtype=DISK


通道 ORA_DISK_1: 正在还原控制文件
通道 ORA_DISK_1: 还原完成, 用时: 00:00:03
输出文件名=C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL01.CTL
输出文件名=C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL02.CTL
输出文件名=C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL03.CTL
完成 restore 于 15-7月 -14


RMAN> alter database mount;


数据库已装载
释放的通道: ORA_DISK_1


RMAN> restore database;


启动 restore 于 15-7月 -14
启动 implicit crosscheck backup 于 15-7月 -14
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=151 devtype=DISK
已交叉检验的 1 对象
完成 implicit crosscheck backup 于 15-7月 -14


启动 implicit crosscheck copy 于 15-7月 -14
使用通道 ORA_DISK_1
已交叉检验的 1 对象
完成 implicit crosscheck copy 于 15-7月 -14


搜索恢复区中的所有文件
正在编制文件目录...
没有为文件编制目录


使用通道 ORA_DISK_1


通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集还原的数据文件
正将数据文件00001还原到C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSTEM01.DBF
正将数据文件00002还原到C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\UNDOTBS01.DBF
正将数据文件00003还原到C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSAUX01.DBF
正将数据文件00004还原到C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\USERS01.DBF
正将数据文件00005还原到C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\EXAMPLE01.DBF
通道 ORA_DISK_1: 正在读取备份片段 C:\01PDDMOQ_1_1
通道 ORA_DISK_1: 已还原备份片段 1
段句柄 = C:\01PDDMOQ_1_1 标记 = TAG20140715T001314
通道 ORA_DISK_1: 还原完成, 用时: 00:01:05
完成 restore 于 15-7月 -14


RMAN>


15. 验证RMAN备份是否成功


查看一下备库的文件是否已经恢复
SQL> set lin 80 pages 120
SQL> col name for a60
SQL> select file#,name from v$datafile;


     FILE# NAME
---------- ------------------------------------------------------------
         1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSTEM01.DBF
         2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\UNDOTBS01.DBF
         3 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSAUX01.DBF
         4 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\USERS01.DBF
         5 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\EXAMPLE01.DBF


SQL> select name from v$tempfile;


NAME
------------------------------------------------------------
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\TEMP01.DBF


查看备库表空间情况
SQL> select ts#,name from v$tablespace;


       TS# NAME
---------- ------------------------------------------------------------
         0 SYSTEM
         1 UNDOTBS1
         2 SYSAUX
         4 USERS
         3 TEMP
         6 EXAMPLE


已选择6行。

注意,因为此时数据库仍然在mount状态下,无法使用dba_data_files和dba_temp_files等视图查看,会提示ORA-01219错误
而只能通过v$的动态性能视图查看,因为这些固定表/视图是存放在数据字典中的,可以在mount状态下访问


SQL> select open_mode from v$database;


OPEN_MODE
--------------------
MOUNTED


SQL> select file_name from dba_data_files;
select file_name from dba_data_files
                      *
第 1 行出现错误:
ORA-01219: 数据库未打开: 仅允许在固定表/视图中查询


SQL> select file_name from dba_temp_files;
select file_name from dba_temp_files
                      *
第 1 行出现错误:
ORA-01219: 数据库未打开: 仅允许在固定表/视图中查询


16. 创建备库standby redo logfile group
由于主库参数中配置了lgwr,所以备库也需要创建standby redo log


SQL> alter database add standby logfile group 4 ('C:\ORACLE\PRODUCT\10.2.0\ORADATA\ora10g\stdredo04.log') size 50m;
SQL> alter database add standby logfile group 5 ('C:\ORACLE\PRODUCT\10.2.0\ORADATA\ora10g\stdredo05.log') size 50m;
SQL> alter database add standby logfile group 6 ('C:\ORACLE\PRODUCT\10.2.0\ORADATA\ora10g\stdredo06.log') size 50m;
SQL> alter database add standby logfile group 7 ('C:\ORACLE\PRODUCT\10.2.0\ORADATA\ora10g\stdredo07.log') size 50m;

其实是因为恢复过来的控制文件中已经有了创建过standby redo logfile的记录了,而再创建一次的话,会提示:

ORA-01184: logfile group 4 already exists 日志文件组已经存在,似乎必须要在恢复备库控制文件之前,就先把standby redo logfile创建好。

但现在似乎陷入一个死循环:创建standby redo logfile,数据库必须先mount,而如果备库不先对备库控制文件进行恢复的话,是无法启动到mount状态的,尝试直接拷贝主库的standby redo logfile到备库,因为主库这个时候是不会用到这几个文件的,只有发生角色转换时才会用到,其现在的状态一定是UNASSIGNED的,所以可以放心拷贝。



17. 备库启动mrp进程,进行redo apply
先查看一下主备库本地和远程归档路径是否正常,主要是远程,因为当自身作为主库是,要传递归档到备库才能应用


主库查看:
SQL> set lin 120 pages 120
SQL> col destination for a40
SQL> select dest_id,status,destination from v$archive_dest_status where dest_id<3;


   DEST_ID STATUS    DESTINATION
---------- --------- ----------------------------------------
         1 VALID     USE_DB_RECOVERY_FILE_DEST
         2 VALID     ora10gst


备库查看:
SQL> set lin 120 pages 120
SQL> col destination for a40
SQL> select dest_id,status,destination from v$archive_dest_status where dest_id<3;


   DEST_ID STATUS    DESTINATION
---------- --------- ----------------------------------------
         1 VALID     USE_DB_RECOVERY_FILE_DEST
         2 VALID     ora10gpd


备库执行:
SQL> alter database recover managed standby database using current logfile disconnect from session;


数据库已更改。


查看备库进程:
SQL> select process from v$managed_standby;


PROCESS
---------
ARCH
ARCH
RFS
MRP0
RFS
RFS


已选择6行。


主库查看日志情况:
SQL> archive log list;
数据库日志模式            存档模式
自动存档             启用
存档终点            USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列     23
下一个存档日志序列   25
当前日志序列           25


SQL> alter system switch logfile;


SQL> archive log list;
数据库日志模式            存档模式
自动存档             启用
存档终点            USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列     24
下一个存档日志序列   26
当前日志序列           26


SQL> select sequence#,applied from v$archived_log;

 SEQUENCE# APP
---------- ---
        15 NO
        16 NO
        17 NO
        18 NO
        19 NO
        20 NO
        21 NO
        22 NO
        23 NO
        23 YES
        23 YES
        24 NO
        24 YES
        25 YES
        25 NO


备库查看日志情况:
SQL> select open_mode from v$database;


OPEN_MODE
--------------------
MOUNTED


SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            DB_RECOVERY_FILE_DEST
最早的联机日志序列     25
下一个存档日志序列   0
当前日志序列           26
SQL> select sequence#,applied from v$archived_log;


 SEQUENCE# APP
---------- ---
        15 YES
        16 YES
        17 YES
        18 YES
        19 YES
        20 YES
        21 YES
        22 YES
        23 YES
        24 YES
        25 YES

注意:最后要查看一下TEMP表空间和对应的数据库文件TEMP01.DBF是否存在,如果不是的话,手动添加一下。

有可能会出现有TEMP表空间,但没有对应的数据库文件,则可以用下面的语句添加:


SQL> ALTER TABLESPACE TEMP ADDTEMPFILE 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G
\TEMP01.DBF' SIZE 100M;


注意这里关键词是TEMPFILE,如果是数据库文件,那么就改成DATAFILE,其他都一样。SIZE必须指定,否则会提示找不到该文件:

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G
\TEMP01.DBF';
ALTER TABLESPACE TEMP ADD TEMPFILE 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\TEMP
01.DBF'
*
第 1 行出现错误:
ORA-01119: 创建数据库文件 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\TEMP01.DBF'
时出错
ORA-17610: 文件 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\TEMP01.DBF' 不存在,
大小也未指定
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。


SQL> SELECT FILE_NAME FROM DBA_TEMP_FILES;


FILE_NAME
--------------------------------------------------------------------------------


C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\TEMP01.DBF

SQL> SELECT FILE_NAME FROM DBA_TEMP_FILES;


FILE_NAME
--------------------------------------------------------------------------------


C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\TEMP01.DBF


可以看到,备库已经可以跟上主库的日志,一个个应用了,至此,DG顺利搭建完毕。


18. 最后,可以用pfile给备库创建一个spfile,那么以后再启动备库时,默认就会使用spfile来启动了(可选步骤)



关于临时表空间的说明:


由于RMAN备份不会对临时表空间的数据文件进行备份,所以DG环境搭建好之后,物理路径上是不存在临时表空间的,作为备库ROLE,固然没有什么关系,但当需要把备库切换成主库之前,就需要加上了


SQL> select tf.file#,tf.name as F_NAME,ts.name AS TS_NAME from v$tempfile tf,v$tablespace 
ts where  tf.ts#=ts.ts#;



FILE# F_NAME                                                             TS_NAME
----- --------------------------------------------------------------------------------------------- ----------------
    1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\TEMP01.DBF          TEMP


查看一下视图,发现在控制文件中有这个表空间和对应的文件的记录,而实际物理路径oradata中却没有该文件,那么就需要手动创建一个文件,而此时作为10g的物理standby,没有办法直接添加,因为只能运行在mount状态下


如果此时备库切换成了主库并open,直接创建TEMP表空间也是不行的,会提示表空间已存在,此时可以重新建一个TEMP1表空间,文件名对应TEMP02.DBF,再把原来的TEMP表空间drop即可:


SQL> create temporary tablespace TEMP1 tempfile 'C:\oracle\product\10.2.0\oradata\ora10g\TEMP02.DBF' size 100m reuse;

SQL> alter database default temporary tablespace TEMP1;

SQL> drop tablespace TEMPincluding contents and datafiles;



关于保护模式的说明:


主库:

SQL> select open_mode,database_role,protection_mode,protection_level from v$database;


OPEN_MODE  DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------- ---------------- -------------------- --------------------
READ WRITE PRIMARY          MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE


备库:

SQL> select open_mode,database_role,protection_mode,protection_level from v$database;


OPEN_MODE  DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
---------- ---------------- -------------------- --------------------
MOUNTED    PHYSICAL STANDBY MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE


主库在mount状态下:

SQL> alter database set standby database to maximize availability;
SQL> alter database set standby database to maximize protection;


注意:要切换成功,必须保证LGWR SYNC AFFIRM


关于SWITCHOVER的说明:


主库:

SQL> select database_role,switchover_status from v$database;


DATABASE_ROLE    SWITCHOVER_STATUS
---------------- --------------------
PRIMARY          SESSIONS ACTIVE


备库:

SQL> select database_role,switchover_status from v$database;


DATABASE_ROLE    SWITCHOVER_STATUS
---------------- --------------------
PHYSICAL STANDBY NOT ALLOWED


SQL> select count(*) from v$session where username is not null;


  COUNT(*)
----------
         1


虽然当前数据库的状态是SESSIONS ACTIVE而不是TO STANDBY,但是查询V$SESSION会话,确认除了当前会话外,其他都是系统会话,那么就可以在主库进行SWITCHOVER切换了


切换之前,除了看switchover_status是否正确以外,还要确保两边日志应用是同步的,否则当备库切换成主库时,会提示需要介质恢复,备库不用先cancel,可以直接做switchover


主库执行:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;


重启数据库,启动到MOUNT状态,注意,9i及以前版本需要分2步执行:
SQL> START NOMOUNT
SQL> ALTER DATABASE MOUNT STANDBY DATABASE;


备库执行:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

如果出现ora-16139:media reovery required 错误,则先执行redo apply,等日志都应用完以后再切换就ok了


如果再做一次switchover切换回来,切换好之后,备库没有及时开启redo apply的话,主库会报一个错误:

SQL> select status,error from v$archive_dest;


STATUS    ERROR
--------- -----------------------------------------------------------------
VALID
ERROR     ORA-16058: standby database instance is not mounted


解决方法很简单,备库重新启动redo apply即可,只有启动了MRP进程后,归档日志才会再一次传到备库,再次查看,远程归档就正常了,并且会把归档日志传递到备库,根据我们以往的经验,不开启MRP进程只是不应用,而不会连归档日志都不传,这里因为做了switchover切换,所以情况不太一样,只要记住,做好swithover切换以后查看远程归档路径是否正常,然后再切归档,进一步测试备库是否能收到归档并应用


关于FAILOVER的说明:


当主库完全挂掉,那么此时需要把备库强制激活,当做主库,把原来的主库重新配置成备库,再做一次switchover再切换回来


备库启动到mount状态下执行:
SQL> alter database activate standby database; 


当执行alter database recover managed standby finish;那么DG configuration就被破坏了,备库此时变成独立的数据库而不再依赖于主库,此时有两种方法可以恢复DG:

1.重新搭建DG,用rman异机恢复方式

2.如果主库开启了flashback database,那么可以找到备库成为主库的那一刻的SCN,通过闪回数据库库回到那个SCN,再做恢复



你可能感兴趣的:(oracle,windows,rman,2008,R2,10g,dg)