0. 概要说明
ORACLE版本:32位的Oracle Database 11.2.0.1.0
OS版本:32位的WinXP SP3
主库SID:primary
从库SID:standby
优势:通过RMAN创建Dataguard无需主库宕机,实施起来相对简单
1. DBCA建立主库,SID为primary
2. 开启主库归档模式
C:\>set oracle_sid=primary
C:\>sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on 星期日 6月 17 15:09:39 2012
Copyright (c) 1982, 2010, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select log_mode from v$database;
LOG_MODE
------------------------
NOARCHIVELOG
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 313860096 bytes
Fixed Size 1374304 bytes
Variable Size 138413984 bytes
Database Buffers 167772160 bytes
Redo Buffers 6299648 bytes
数据库装载完毕。
SQL> alter database archivelog;
数据库已更改。
SQL> select log_mode from v$database;
LOG_MODE
------------------------
ARCHIVELOG
SQL> alter database open;
数据库已更改。
SQL>
3. 开启强制日志记录
SQL> ALTER DATABASE FORCE LOGGING;
数据库已更改。
SQL>
4. 为主库添加Standby Redo Log,Oracle建议Standby Redo Log大小和Online Redo Log大小一致,并至少多出一组
SQL> select group#,thread#,bytes/1024/1024 from v$log;
GROUP# THREAD# BYTES/1024/1024
---------- ---------- ---------------
1 1 50
2 1 50
3 1 50
5. 配置Dataguard相关参数
SQL> alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)';
系统已更改。
SQL> alter system set LOG_ARCHIVE_DEST_1='LOCATION=C:\oracle\oradata\primary\arch1\ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary';
系统已更改。
SQL> alter system set LOG_ARCHIVE_DEST_2='SERVICE=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby';
系统已更改。
SQL> alter system set LOG_ARCHIVE_DEST_STATE_1=ENABLE;
系统已更改。
SQL> alter system set FAL_SERVER=standby;
系统已更改。
SQL> alter system set FAL_CLIENT=primary;
系统已更改。
SQL> alter system set DB_FILE_NAME_CONVERT='C:\oracle\oradata\standby\','C:\oracle\oradata\primary' scope=spfile;
系统已更改。
SQL> alter system set LOG_FILE_NAME_CONVERT='C:\oracle\oradata\standby\arch1\','C:\oracle\oradata\primary\arch1' scope=spfile;
系统已更改。
6. 配置监听相关参数
编辑C:\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora为如下内容
# listener.ora Network Configuration File: C:\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 = primary)
(ORACLE_HOME = C:\oracle\product\11.2.0\dbhome_1)
(SID_NAME = primary)
)
(SID_DESC =
(GLOBAL_DBNAME = standby)
(ORACLE_HOME = C:\oracle\product\11.2.0\dbhome_1)
(SID_NAME = standby)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = PC8896-20120219)(PORT = 1521))
)
ADR_BASE_LISTENER = c:\oracle\product\11.2.0\dbhome_1\log
编辑C:\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora为如下内容
PRIMARY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = PC8896-20120219)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = primary)
)
)
STANDBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = PC8896-20120219)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = standby)
)
)
测试tnsping可以同时连通主库和从库
C:\>tnsping primary
TNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 17-6月 -2012 20:22:56
Copyright (c) 1997, 2010, Oracle. All rights reserved.
已使用的参数文件:
C:\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\sqlnet.ora
已使用 TNSNAMES 适配器来解析别名
尝试连接 (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = PC8896-20120219)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = primary)))
OK (40 毫秒)
C:\>tnsping standby
TNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 17-6月 -2012 20:23:01
Copyright (c) 1997, 2010, Oracle. All rights reserved.
已使用的参数文件:
C:\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\sqlnet.ora
已使用 TNSNAMES 适配器来解析别名
尝试连接 (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = PC8896-20120219)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = standby)))
OK (30 毫秒)
C:\>lsnrctl status
LSNRCTL for 32-bit Windows: Version 11.2.0.1.0 - Production on 17-6月 -2012 20:23:24
Copyright (c) 1991, 2010, Oracle. All rights reserved.
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=PC8896-20120219)(PORT=1521)))
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 11.2.0.1.0 - Production
启动日期 17-6月 -2012 14:00:01
正常运行时间 0 天 6 小时 23 分 31 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 C:\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora
监听程序日志文件 c:\oracle\product\11.2.0\dbhome_1\log\diag\tnslsnr\PC8896-20120219\listener\alert\log.xml
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=PC8896-20120219)(PORT=1521)))
服务摘要..
服务 "primary" 包含 2 个实例。
实例 "primary", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
实例 "primary", 状态 READY, 包含此服务的 1 个处理程序...
服务 "primaryXDB" 包含 1 个实例。
实例 "primary", 状态 READY, 包含此服务的 1 个处理程序...
服务 "standby" 包含 1 个实例。
实例 "standby", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
C:\>
7. 创建从库密码文件
C:\>copy C:\oracle\product\11.2.0\dbhome_1\database\PWDprimary.ora C:\oracle\product\11.2.0\dbhome_1\database\PWDstandby.ora
已复制 1 个文件。
C:\>
8. 创建从库启动参数文件
编辑C:\oracle\product\11.2.0\dbhome_1\database\INITstandby.ora为如下内容
DB_NAME=primary
DB_UNIQUE_NAME=standby
DB_BLOCK_SIZE=8192
9. 创建从库目录结构
mkdir C:\oracle\oradata\standby\arch1
mkdir c:\oracle\diag\rdbms\primary\standby\trace
mkdir c:\oracle\diag\rdbms\primary\standby\cdump
10. 创建并启动从库实例到nomount状态
C:\>oradim -new -sid standby -startmode manual
实例已创建。
C:\>set oracle_sid=standby
C:\>sqlplus "/ as sysdba"
SQL*Plus: Release 11.2.0.1.0 Production on 星期日 6月 17 20:27:27 2012
Copyright (c) 1982, 2010, Oracle. All rights reserved.
已连接到空闲例程。
SQL> startup nomount pfile=C:\oracle\product\11.2.0\dbhome_1\database\INITstandby.ora
ORACLE 例程已经启动。
Total System Global Area 150667264 bytes
Fixed Size 1373152 bytes
Variable Size 92277792 bytes
Database Buffers 50331648 bytes
Redo Buffers 6684672 bytes
SQL> create spfile from pfile;
文件已创建。
SQL>
11. 测试可以通过Oracle Net正常连通主从库
C:\>sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on 星期日 6月 17 20:28:34 2012
Copyright (c) 1982, 2010, Oracle. All rights reserved.
SQL> connect sys/oracle@primary as sysdba
已连接。
SQL> connect sys/oracle@standby as sysdba
已连接。
SQL>
12. 通过RMAN创建从库
通过RMAN连接目标库(主库)与辅助库(从库)然后执行以下脚本,注意脚本里面的是反斜杠(unix需用正斜杠)
rman target sys/oracle@primary auxiliary sys/oracle@standby
run {
duplicate target database for standby from active database
spfile
parameter_value_convert 'primary','standby'
set db_unique_name='standby
'
set db_file_name_convert='\primary
\','\standby
\'
set log_file_name_convert='\primary
\','\standby
\'
set control_files='C:\oracle\oradata\standby\CONTROL01.CTL'
set log_archive_max_processes='5'
set fal_client='standby
'
set fal_server='primary
'
set standby_file_management='AUTO'
set log_archive_config='dg_config=(primary
,
)'standby
set log_archive_dest_1='service=
ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=primary
'primary
;
}
脚本输出
C:\>rman target sys/oracle@primary auxiliary sys/oracle@standby
恢复管理器: Release 11.2.0.1.0 - Production on 星期日 6月 17 20:46:53 2012
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
连接到目标数据库: PRIMARY (DBID=1623612784)
已连接到辅助数据库: PRIMARY (未装载)
RMAN> run {
2> duplicate target database for standby from active database
3> spfile
4> parameter_value_convert 'primary','standby'
5> set db_unique_name='standby'
6> set db_file_name_convert='\primary\','\standby\'
7> set log_file_name_convert='\primary\','\standby\'
8> set control_files='C:\oracle\oradata\standby\CONTROL01.CTL'
9> set log_archive_max_processes='5'
10> set fal_client='standby'
11> set fal_server='primary'
12> set standby_file_management='AUTO'
13> set log_archive_config='dg_config=(primary,standby)'
14> set log_archive_dest_1='service=primary ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=primary'
15> ;
16> }
启动 Duplicate Db 于 17-6月 -12
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: SID=96 设备类型=DISK
内存脚本的内容:
{
backup as copy reuse
targetfile 'c:\oracle\product\11.2.0\dbhome_1\DATABASE\PWDprimary.ORA' auxiliary format
'c:\oracle\product\11.2.0\dbhome_1\DATABASE\PWDstandby.ORA' targetfile
'C:\ORACLE\PRODUCT\11.2.0\DBHOME_1\DATABASE\SPFILEPRIMARY.ORA' auxiliary format
'C:\ORACLE\PRODUCT\11.2.0\DBHOME_1\DATABASE\SPFILESTANDBY.ORA' ;
sql clone "alter system set spfile= ''C:\ORACLE\PRODUCT\11.2.0\DBHOME_1\DATABASE\SPFILESTANDBY.ORA''";
}
正在执行内存脚本
启动 backup 于 17-6月 -12
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=146 设备类型=DISK
完成 backup 于 17-6月 -12
sql 语句: alter system set spfile= ''C:\ORACLE\PRODUCT\11.2.0\DBHOME_1\DATABASE\SPFILESTANDBY.ORA''
内存脚本的内容:
{
sql clone "alter system set audit_file_dest =
''c:\oracle\admin\standby\adump'' comment=
'''' scope=spfile";
sql clone "alter system set dispatchers =
''(PROTOCOL=TCP) (SERVICE=standbyXDB)'' comment=
'''' scope=spfile";
sql clone "alter system set db_unique_name =
''standby'' comment=
'''' scope=spfile";
sql clone "alter system set db_file_name_convert =
''\primary\'', ''\standby\'' comment=
'''' scope=spfile";
sql clone "alter system set log_file_name_convert =
''\primary\'', ''\standby\'' comment=
'''' scope=spfile";
sql clone "alter system set control_files =
''C:\oracle\oradata\standby\CONTROL01.CTL'' comment=
'''' scope=spfile";
sql clone "alter system set log_archive_max_processes =
5 comment=
'''' scope=spfile";
sql clone "alter system set fal_client =
''standby'' comment=
'''' scope=spfile";
sql clone "alter system set fal_server =
''primary'' comment=
'''' scope=spfile";
sql clone "alter system set standby_file_management =
''AUTO'' comment=
'''' scope=spfile";
sql clone "alter system set log_archive_config =
''dg_config=(primary,standby)'' comment=
'''' scope=spfile";
sql clone "alter system set log_archive_dest_1 =
''service=primary ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=primary'' comment=
'''' scope=spfile";
shutdown clone immediate;
startup clone nomount;
}
正在执行内存脚本
sql 语句: alter system set audit_file_dest = ''c:\oracle\admin\standby\adump'' comment= '''' scope=spfile
sql 语句: alter system set dispatchers = ''(PROTOCOL=TCP) (SERVICE=standbyXDB)'' comment= '''' scope=spfile
sql 语句: alter system set db_unique_name = ''standby'' comment= '''' scope=spfile
sql 语句: alter system set db_file_name_convert = ''\primary\'', ''\standby\'' comment= '''' scope=spfile
sql 语句: alter system set log_file_name_convert = ''\primary\'', ''\standby\'' comment= '''' scope=spfile
sql 语句: alter system set control_files = ''C:\oracle\oradata\standby\CONTROL01.CTL'' comment= '''' scope=spfile
sql 语句: alter system set log_archive_max_processes = 5 comment= '''' scope=spfile
sql 语句: alter system set fal_client = ''standby'' comment= '''' scope=spfile
sql 语句: alter system set fal_server = ''primary'' comment= '''' scope=spfile
sql 语句: alter system set standby_file_management = ''AUTO'' comment= '''' scope=spfile
sql 语句: alter system set log_archive_config = ''dg_config=(primary,standby)'' comment= '''' scope=spfile
sql 语句: alter system set log_archive_dest_1 = ''service=primary ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=primary'' comment= '''' scope=spfile
Oracle 实例已关闭
已连接到辅助数据库 (未启动)
Oracle 实例已启动
系统全局区域总计 313860096 字节
Fixed Size 1374304 字节
Variable Size 104859552 字节
Database Buffers 201326592 字节
Redo Buffers 6299648 字节
内存脚本的内容:
{
backup as copy current controlfile for standby auxiliary format 'C:\ORACLE\ORADATA\STANDBY\CONTROL01.CTL';
}
正在执行内存脚本
启动 backup 于 17-6月 -12
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动数据文件副本
复制备用控制文件
输出文件名=C:\ORACLE\PRODUCT\11.2.0\DBHOME_1\DATABASE\SNCFPRIMARY.ORA 标记=TAG20120617T204715 RECID=2 STAMP=786228436
通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:03
完成 backup 于 17-6月 -12
内存脚本的内容:
{
sql clone 'alter database mount standby database';
}
正在执行内存脚本
sql 语句: alter database mount standby database
内存脚本的内容:
{
set newname for tempfile 1 to
"C:\ORACLE\ORADATA\STANDBY\TEMP01.DBF";
switch clone tempfile all;
set newname for datafile 1 to
"C:\ORACLE\ORADATA\STANDBY\SYSTEM01.DBF";
set newname for datafile 2 to
"C:\ORACLE\ORADATA\STANDBY\SYSAUX01.DBF";
set newname for datafile 3 to
"C:\ORACLE\ORADATA\STANDBY\UNDOTBS01.DBF";
set newname for datafile 4 to
"C:\ORACLE\ORADATA\STANDBY\USERS01.DBF";
backup as copy reuse
datafile 1 auxiliary format
"C:\ORACLE\ORADATA\STANDBY\SYSTEM01.DBF" datafile
2 auxiliary format
"C:\ORACLE\ORADATA\STANDBY\SYSAUX01.DBF" datafile
3 auxiliary format
"C:\ORACLE\ORADATA\STANDBY\UNDOTBS01.DBF" datafile
4 auxiliary format
"C:\ORACLE\ORADATA\STANDBY\USERS01.DBF" ;
sql 'alter system archive log current';
}
正在执行内存脚本
正在执行命令: SET NEWNAME
临时文件 1 在控制文件中已重命名为 C:\ORACLE\ORADATA\STANDBY\TEMP01.DBF
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
启动 backup 于 17-6月 -12
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动数据文件副本
输入数据文件: 文件号=00001 名称=C:\ORACLE\ORADATA\PRIMARY\SYSTEM01.DBF
输出文件名=C:\ORACLE\ORADATA\STANDBY\SYSTEM01.DBF 标记=TAG20120617T204729
通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:45
通道 ORA_DISK_1: 启动数据文件副本
输入数据文件: 文件号=00002 名称=C:\ORACLE\ORADATA\PRIMARY\SYSAUX01.DBF
输出文件名=C:\ORACLE\ORADATA\STANDBY\SYSAUX01.DBF 标记=TAG20120617T204729
通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:35
通道 ORA_DISK_1: 启动数据文件副本
输入数据文件: 文件号=00003 名称=C:\ORACLE\ORADATA\PRIMARY\UNDOTBS01.DBF
输出文件名=C:\ORACLE\ORADATA\STANDBY\UNDOTBS01.DBF 标记=TAG20120617T204729
通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:07
通道 ORA_DISK_1: 启动数据文件副本
输入数据文件: 文件号=00004 名称=C:\ORACLE\ORADATA\PRIMARY\USERS01.DBF
输出文件名=C:\ORACLE\ORADATA\STANDBY\USERS01.DBF 标记=TAG20120617T204729
通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:01
完成 backup 于 17-6月 -12
sql 语句: alter system archive log current
内存脚本的内容:
{
switch clone datafile all;
}
正在执行内存脚本
数据文件 1 已转换成数据文件副本
输入数据文件副本 RECID=2 STAMP=786228540 文件名=C:\ORACLE\ORADATA\STANDBY\SYSTEM01.DBF
数据文件 2 已转换成数据文件副本
输入数据文件副本 RECID=3 STAMP=786228541 文件名=C:\ORACLE\ORADATA\STANDBY\SYSAUX01.DBF
数据文件 3 已转换成数据文件副本
输入数据文件副本 RECID=4 STAMP=786228541 文件名=C:\ORACLE\ORADATA\STANDBY\UNDOTBS01.DBF
数据文件 4 已转换成数据文件副本
输入数据文件副本 RECID=5 STAMP=786228541 文件名=C:\ORACLE\ORADATA\STANDBY\USERS01.DBF
完成 Duplicate Db 于 17-6月 -12
RMAN>
13. 验证日志传输
查看primary最大归档日志序号:
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
9
SQL>
查看standby最大归档日志序号,刚开始没有,开启MRP (Managed Recovery Process)后同步完成,可能有几秒的延迟:
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
SQL> alter database recover managed standby database disconnect from session;
数据库已更改。
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
9
SQL>
除此之外,也可以在主库执行select group#,sequence#,archived,status from v$log查询和在从库执行select group#,sequence#,archived,status from v$standby_log查询来查看日志的传输情况。
REF:
1. Step by Step Guide on Creating Physical Standby Using RMAN DUPLICATE...FROM ACTIVE DATABASE [ID 1075908.1]
2. Oracle® Data Guard Concepts and Administration 11g Release 2 (11.2)
http://docs.oracle.com/cd/E11882_01/server.112/e25608/toc.htm
3. Creating a Physical Standby Database
http://docs.oracle.com/cd/E11882_01/server.112/e25608/create_ps.htm#i63561
http://docs.oracle.com/cd/E11882_01/server.112/e25608/manage_ps.htm
5. Duplicating a Database
http://docs.oracle.com/cd/E11882_01/backup.112/e10642/rcmdupdb.htm#i1008564