环境

主库:10.18.56.21
备库:10.18.56.22

主库和备库使用相同的实例名、数据库名(均为 cydb),主库的 db_unique_name 规划为 cydb,备库的 db_unique_name 规划为 cydbdg。

主库服务器上已经安装好了 oracle 数据库软件,并且创建好了数据库 cydb。
备库服务器上只安装了 oracle 软件。

windows 搭建灾备的方法是一样的,只是在使用 pfile 启动实例之前,需要注册一下实例:

cmd> oradim –NEW –SID orcl –STARTMODE manual

主库日志模式

主库需要打开归档,且启用强制日志。

SQL> shutdown immediate;  
SQL> startup mount;  
SQL> alter database archivelog;  
SQL> alter system set log_archive_dest_1='LOCATION=/data/app/archivelog/';  
SQL> alter database force logging;  
SQL> alter database open;  
SQL> alter system switch logfile;   <----- 生产经验,多执行几次以产生归档,避免后面运行 duplicate 命令时出错

主库配置 standby 日志

检查主库当前日志情况

SQL> set lines 200;
SQL> col member for a60;
SQL> select MEMBER,f.GROUP#,BYTES/1024/1024 "SIZE(M)" 
from v$logfile f 
join v$log g 
on f.group# = g.group#;   

MEMBER                                 GROUP#    SIZE(M)
------------------------------------------------------------ ---------- ----------
/data/app/oracle/oradata/CYDB/redo03.log                  3       2048
/data/app/oracle/oradata/CYDB/redo02.log                  2       2048
/data/app/oracle/oradata/CYDB/redo01.log                  1       2048

配置 standby 日志

SQL> alter database add standby logfile group 21 ('/data/app/oracle/oradata/CYDB/standby01.log') size 2048m;
添加 n + 1 组。

主库配置参数

DB_NAME=cydb
DB_UNIQUE_NAME=cydb scope=spfile 
LOG_ARCHIVE_CONFIG='DG_CONFIG=(cydb,cydbdg)' 
LOG_ARCHIVE_DEST_1='LOCATION=/data/app/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=cydb'
LOG_ARCHIVE_DEST_2='SERVICE=cydbdg ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=cydbdg'
FAL_SERVER='cydbdg'
DB_FILE_NAME_CONVERT='CYDBDG','CYDB' scope=spfile
LOG_FILE_NAME_CONVERT='CYDBDG','CYDB' scope=spfile
STANDBY_FILE_MANAGEMENT=AUTO

注意:
如果是 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)'

备库配置参数

DB_NAME=cydb
DB_UNIQUE_NAME=cydbdg scope=spfile
LOG_ARCHIVE_CONFIG='DG_CONFIG=(cydb,cydbdg)'
LOG_ARCHIVE_DEST_1='LOCATION=/data/app/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=cydbdg'
LOG_ARCHIVE_DEST_2='SERVICE=cydb ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=cydb'
FAL_SERVER=cydb
DB_FILE_NAME_CONVERT='CYDB','CYDBDG' scope=spfile
LOG_FILE_NAME_CONVERT='CYDB','CYDBDG' scope=spfile
STANDBY_FILE_MANAGEMENT=AUTO
CONTROL_FILES='/data/app/oracle/oradata/CYDBDG/control01.ctl','/data/app/oracle/oradata/CYDBDG/control02.ctl'

根据参数文件创建目录结构。然后启动实例到 nomount。

主备库配置网络

在备库上静态注册一个与 DB_UNIQUE_NAME 不同的临时服务名。示例如下:

LISTENER =
 (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=10.18.56.22)(PORT=1521))
 )

SID_LIST_LISTENER=
  (SID_LIST=
      (SID_DESC=
         (GLOBAL_DBNAME=cydbdgxw)
         (SID_NAME=cydb)            
         (ORACLE_HOME=/data/app/oracle/product/19.3/db_1)
      )
   )

然后配置可同时访问主备库的 tnsnames,示例如下:

cydb =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.18.56.21)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = cydb)
    )
  )

cydbdg =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.18.56.22)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = cydbdgxw)
    )
  )

将 tnsnames 复制到主备上。

同步密码文件

将主库的密码文件复制到备库:

$ scp $ORACLE_HOME/dbs/orapwcydb 10.18.56.22:$ORACLE_HOME/dbs/orapwcydb

测试 Oracle Net 连通性

一定要做测试!使用 tnsnames 分别测试到主库和备库的连接。

开始数据库复制

禁用主库归档日志删除脚本。然后复制。

$ rman target / auxiliary sys/oracle@cydbdg nocatalog
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE;

恢复 Oracle Net 配置

删除备库的 listener.ora 文件,更正 tnsnames 文件中到备库的连接,注意主备库的 tnsnames 文件要同步。

打开数据库

SQL> alter database recover managed standby database using current logfile disconnect from session;
SQL> alter database recover managed standby database cancel;
SQL> alter database open;

启用实时同步

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

检查实时同步

SQL> set lines 200;
SQL> select open_mode,database_role,switchover_status from v$database;

OPEN_MODE         DATABASE_ROLE    SWITCHOVER_STATUS
-------------------- ---------------- --------------------
READ ONLY WITH APPLY PHYSICAL STANDBY NOT ALLOWED


SQL> select name,value from V$DATAGUARD_STATS;

NAME                 VALUE
-------------------------------- ----------------------------------------------------------------
transport lag                 +00 00:00:00
apply lag                     +00 00:00:00
apply finish time
estimated startup time        13

在主库创建一个测试表,检查备库上是否生成。

所有配置都正确,还是不能同步,将主库重启一下即可(Bug)。

在备库上做后期配置

如归档删除策略、部署巡检脚本、zabbix 监控等。

-- By 许望(RHCA、OCM、VCP)
最后修改:2020 年 01 月 02 日 08 : 35 PM
如果觉得我的文章对你有用,请随意赞赏