环境
主库: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 监控等。