1.DG基础环境
操作系统版本:redhat7
数据库版本主库:19.3
SID:db19c
db_name:db19c
db_unique_name:db19c
数据库版本备库:19.3
SID:db19cdg
db_name:db19c
db_unique_name:db19cdg
说明:
红色db_name主备库必须保持一致;
绿色db_unique_name主备库名称必须不一致;
数据库小版本不同,不影响测试,当然建议保持一致,避免生产出现问题拍错就麻烦了。
2.主库开启强制归档以及开启归档模,以及修改主库初始化参数
①开启强制归档
alter database force logging;
select force_logging from v$database;
②初始化参数
--主备库设置一致remote_db_unique_name1 [, ... remote_db_unique_name9)
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(db19c,db19cdg)' scope=both sid='*';
--log_archive_dest_1设置主库归档路径;DB_UNIQUE_NAME主库
ALTER SYSTEM SET log_archive_dest_1='LOCATION=/oracle/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=db19c' SCOPE=BOTH;
--log_archive_dest_2中SERVICE设置连接备库的tnsnames名称db19cdg;DB_UNIQUE_NAME备库数据库唯一名db19cdg
ALTER SYSTEM SET log_archive_dest_2='SERVICE=db19cdg LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=db19cdg' SCOPE=BOTH;
--STANDBY_FILE_MANAGEMENT如果设置为auto,主库增删文件会相应地自动在备库做出修改(结合convert参数) ;如果设置为manual,当在primary删除表空间或数据文件,执行drop tablespace .. including contents and datafiles,standby 只是在控制文件中将该文件删除,还需要手动将物理文件删除
alter system set STANDBY_FILE_MANAGEMENT=AUTO scope=both sid='*';
--如果备库设置了db_file_name_convert与log_file_name_convert参数,那么当数据库启动到mount时,就无需手动进行数据文件重命名,因为RMAN在恢复控制文件过程中,会依据该参数设置,自行修改控制文件中记录的数据文件路径日志文件路径。当主库切换备库的时候用到,所以优先写备库的绝对路径!(在ASM自动管理情况下可以使用unique_name,但此处最好填写全路劲)
alter system set DB_FILE_NAME_CONVERT='/u01/data','/oracle/app/oracle/oradata/DB19C' scope=spfile;
alter system set LOG_FILE_NAME_CONVERT='/u01/data','/oracle/app/oracle/oradata/DB19C' scope=spfile;
--这两个参数只需在standby库设置,但也可以在primary库设置这两个参数,以方便switchover或failover时primary库转变为standby角色。FAL_CLIENT = StandbyDB,StandbyDB是standby库的TNS name;FAL_SERVER = PrimaryDB,此处PrimaryDB是一个TNS name,指向primary库。
alter system set FAL_CLIENT='db19c' scope=both sid='*';
alter system set FAL_SERVER='db19cdg' scope=both sid='*';
③开启归档,开启归档需要重启数据库。
3.主库添加standby redo logfile(连接到CDB$ROOT中执行,备库需要,如果切换主库也需要)
添加规则:创建standby日志组,个数是源日志个数+1再与实例数的积,size不能小于原来日志的大小
SQL> select thread#,group#,members,bytes,bytes/1024/1024 from v$log;
THREAD# GROUP# MEMBERS BYTES BYTES/1024/1024
---------- ---------- ---------- ---------- ---------------
1 1 1 209715200 200
1 2 1 209715200 200
1 3 1 209715200 200
alter database add standby logfile group 4 ('/oracle/app/oracle/oradata/DB19C/redo04.log') size 200M;
alter database add standby logfile group 5 ('/oracle/app/oracle/oradata/DB19C/redo05.log') size 200M;
alter database add standby logfile group 6 ('/oracle/app/oracle/oradata/DB19C/redo06.log') size 200M;
alter database add standby logfile group 7 ('/oracle/app/oracle/oradata/DB19C/redo07.log') size 200M;
SQL> select group#,status,type,member from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ------- ------- ----------------------------------------------------------------------
3 ONLINE /oracle/app/oracle/oradata/DB19C/redo03.log
2 ONLINE /oracle/app/oracle/oradata/DB19C/redo02.log
1 ONLINE /oracle/app/oracle/oradata/DB19C/redo01.log
4 STANDBY /oracle/app/oracle/oradata/DB19C/redo04.log
5 STANDBY /oracle/app/oracle/oradata/DB19C/redo05.log
6 STANDBY /oracle/app/oracle/oradata/DB19C/redo06.log
7 STANDBY /oracle/app/oracle/oradata/DB19C/redo07.log
4.主库和备库监听配置以及TNS配置(主备库tns一样),保证防火墙关闭
主库:listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.227)(PORT = 1522))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = db19c)
(SID_NAME = db19c)
(ORACLE_HOME = /oracle/app/oracle/product/19.3.0/db_1)
)
)
主库:tnsname.ora
DB19C =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle19c)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = db19c)
)
)
LISTENER_DB19C =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle19c)(PORT = 1522))
DB19CDG =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.225)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = db19cdg)
)
)
LISTENER_DB19C =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.225)(PORT = 1522))
备库:listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.225)(PORT = 1522))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = db19cdg)
(SID_NAME = db19cdg)
(ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
)
)
备库:tnsname.ora
DB19C =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle19c)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = db19c)
)
)
LISTENER_DB19C =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle19c)(PORT = 1522))
DB19CDG =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.225)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = db19cdg)
)
)
LISTENER_DB19CDG =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.225)(PORT = 1522))
5.主库创建pfile、standby controlfile以及cpoy创建好的pfile和口令文件到备库对应位置
主库:
alter database create standby controlfile as '/home/oracle/controlfile';
create pfile=initdb19c.ora from spfile;
cd $ORACLE_HOME/dbs
scp orapwdb19c 192.168.1.225:/u01/app/oracle/product/19.0.0/dbhome_1/dbs
scp initdb19c.ora 192.168.1.225:/u01/app/oracle/product/19.0.0/dbhome_1/dbs
6.备库修改参数文件
-----------------------------------------------------------------
*.audit_file_dest='/u01/app/oracle/admin/db19c/adump'
*.audit_trail='db'
*.compatible='19.0.0'
*.control_files='/u01/oradata/db19cdg/control01.ctl','/u01/oradata/db19cdg/control02.ctl'
*.db_block_size=8192
*.db_file_name_convert='/oracle/app/oracle/oradata/DB19C','/u01/oradata'
*.db_name='db19c'
*.db_unique_name='db19cdg'
*.diagnostic_dest='/u01/app/oracle'
*.fal_client='db19cdg'
*.fal_server='db19c'
*.log_archive_config='DG_CONFIG=(db19c,db19cdg)'
*.log_archive_dest_1='LOCATION=/oracle/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=db19cdg'
*.log_archive_dest_2='SERVICE=db19c LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=db19c'
*.log_file_name_convert='/oracle/app/oracle/oradata/DB19C','/u01/oradata'
*.standby_file_management='AUTO'
----------------------------------------------------------------------------------
7.备库用init202009024.ora启动到nomount
startup pfile=init202009024.ora nomount;
9.查看备库数据库状态
select open_mode from v$database;
OPEN_MODE
-------------
MOUNTED
在备库启动数据库到恢复管理模式,并开始准备从主库接受日志的传输:
alter database recover managed standby database using current logfile disconnect from session;
此时备库,已经可以收到主库传过来的日志啦!
遇到报错如下:






