环境
主库:RAC
备库:RAC
主库和备库使用相同的实例名、数据库名,主库的 db_unique_name 规划为 cydb,备库的 db_unique_name 规划为 cydbdpc。
主库服务器上已经安装好了 oracle 软件,并且创建好了数据库 cydb。
备库服务器上只安装了 oracle 软件。
主库日志模式
主库需要打开归档,且启用强制日志。
alter database archivelog;
alter database force logging;
检查主库当前日志情况
set lines 200;
col member for a60;
select THREAD#,MEMBER,f.GROUP#,BYTES/1024/1024 "SIZE(M)"
from v$logfile f
join v$log g
on f.group# = g.group#;
THREAD# MEMBER GROUP# SIZE(M)
---------- ------------------------------------------------------------ ---------- ----------
1 /oradata/cydb/redo01.log 1 2048
2 /oradata/cydb/redo06.log 6 2048
主库配置 standby 日志
alter database add standby logfile thread 1 group 21 ('/oradata/cydb/standby1_01.log') size 2048M; <-- 增加 n + 1 组
alter database add standby logfile thread 2 group 27 ('/oradata/cydb/standby2_01.log') size 2048M; <-- 增加 n + 1 组
如果是 ASM,standby 日志路径只需要指定 '+DATA' 即可。
主库配置参数
db_unique_name='cydb';
alter system set log_archive_config='dg_config=(cydb,cydbdpc)' sid='*';
alter system set log_archive_config='dg_config=(cydb,ebusrdg,drebusr,cydbdpc)' sid='*';
alter system set log_archive_dest_1='location=/oradata/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=cydb' sid='*';
alter system set log_archive_dest_4='SERVICE=cydbdpc LGWR ASYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=cydbdpc' sid='*';
alter system set db_file_name_convert='/oradata/cydbdpc/','/oradata/cydb/' sid='*' scope=spfile ;
alter system set log_file_name_convert='/oradata/cydbdpc/','/oradata/cydb/' sid='*' scope=spfile;
alter system set fal_server='cydbdpc' sid='*';
alter system set standby_file_management='AUTO' sid='*';
如果是 ASM,归档日志本地路径只需要指定 +ARCH 即可。
备库配置参数
在主库上创建 pfile 文件,将其传到备库第一节点后,根据实际情况修改参数文件。
SQL> create pfile='/tmp/initcydb1.ora' from spfile;
注意:
- 修改参数文件时一定要仔细,曾经有过将参数名前面的实例名写错,duplicate 在线复制 DG 时报 ASM 磁盘组权限错误,被误导排查了很久时间(期间提了两个 SR 均未解决,后面通过备份恢复来创建 DG,最后一步打开数据库时才报错“instance_number 未定义”,才发现实际上参数已经定义了,但是参数前面的实例名写错了)。
- 删除集群相关配置,并显式设置 *.cluster_database=false
- 如果是 ASM,通过 alias 指定控制文件位置:'+DATA/rlsbdbdpc/controlfile/control01.ctl'
- 对于convert参数,最佳实践是在目录的后面加上 / ,并且尽量使用路径而不是字符串,例如 '+DATA/CYDB/','+DATA/CYDBDPC/'。
下面两行官方示例没有修改,但也可以修改:
- *.audit_file_dest='/data/app/oracle/admin/cybdpc/adump'
- *.dispatchers='(PROTOCOL=TCP) (SERVICE=cydbdpcXDB)'
准备目录结构
根据参数文件创建目录结构。注意不要忘记第二节点的目录!
然后启动第1节点实例到 nomount。
备库第1节点配置监听并静态注册
使用 grid 用户修改其 listener.ora 文件,加入如下静态注册内容:
$ vi $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=cydbdpcxw)
(SID_NAME=cydb1)
(ORACLE_HOME=/data/app/oracle/product/11.2.0/db_1)
)
)
$ lsnrctl stop; lsnrctl start
如果正常,后面配置 tnsnames 的时候,使用 VIP 来访问。
如果后面不能通信,则停掉 grid 监听,使用 oracle 在物理 IP 上创建监听并注册一个临时用的服务名,示例如下:
LISTENER =
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=???)(PORT=1521))
(ADDRESS=(PROTOCOL=ipc)(KEY=PNPKEY)))
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=cydbdpcxw)
(SID_NAME=cydb1)
(ORACLE_HOME=/data/app/oracle/product/11.2.0/db_1)
)
)
如果监听莫名故障,使用 crsctl stop listener; crsctl start listener 重启监听一般可解决问题。
配置 tnsnames
在主库第1节点上修改 tnsnames 文件,然后传输到备库第1节点。
主库使用其VIP(1个或2个都可以)访问,备库使用上面配置的监听地址和服务访问。(后续改回)
主库上的 tnsnames 仍然可以使用 scan 来访问主库,可以只修改备库的 tnsnames 通过 VIP 访问主库。
创建密码文件
将主库的密码文件复制到备库第1节点。
测试 Oracle Net 连通性
一定要做测试!使用 tnsnames 分别测试到主库和备库的连接。
开始数据库复制
将备库启动到nomount,禁用主库归档日志删除脚本。
rman target sys/oracle@cydb auxiliary sys/oracle@cydbdpc nocatalog
run{
ALLOCATE CHANNEL ch10 TYPE disk; < -- 可以分配多个通道
ALLOCATE auxiliary CHANNEL ch00 TYPE disk; < -- 可以分配多个通道
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE [USING [COMPRESSED] BACKUPSET];
}
创建 spfile(所有节点)
修改参数文件:
*.cluster_database=true
cydb2.instance_number=2
cydb1.instance_number=1
cydb2.thread=2
cydb1.thread=1
cydb2.undo_tablespace='UNDOTBS2'
cydb1.undo_tablespace='UNDOTBS1'
创建 spfile 到共享目录。
修改各节点 pfile 内容,指向 spfile(12c使用集群管理参数文件,可忽略此步)。
修改 Oracle Net
删除备库第1节点 grid 用户 listener.ora 中添加的内容,然后重启监听:
lsnrctl stop ; lsnrctl start
srvctl stop listener; srvctl start listener
crsctl status res -t
修改 tnsnames.ora 文件对备库的访问,并同步到主备所有节点。
打开数据库
只在第1节点操作(第2节点的实例不要启,后面通过集群启动).
startup mount force;
alter database recover managed standby database using current logfile disconnect from session;
alter database recover managed standby database cancel;
alter database open;
加入集群管理
只在第1节点操作。
srvctl add database -d cydbdpc -c RAC -o /data/app/oracle/product/11.2.0/db_1 -p '/oradata/drebusr/spfilecydbdpc.ora' -r physical_standby -n cydb
srvctl add instance -d cydbdpc -i cydb1 -n ebbcsosdb11
srvctl add instance -d cydbdpc -i cydb2 -n ebbcsosdb12
共享密码文件
11g如果使用了集群文件系统,则将密码放到集群文件系统。
12c将密码文件加入集群管理。
$ srvctl modify database -db cydbdpc -pwfile '/oradata/cydbdr/orapwcydbdpc'
$ orapwd file='+DATA' dbuniquename='cydbdpc' input_file=/tmp/orapwcydbdpc <-- 会自动更新集群中的配置
启动数据库
手动关闭第一节点实例,然后通过集群启动数据库。
SQL> shutdown immediate;
$ srvctl start database -d cydbdpc
$ crsctl status res -t
启用日志实时应用
SQL> alter database recover managed standby database using current logfile disconnect;
在备库上做后期配置
如归档删除策略、部署巡检脚本、zabbix 监控等。