📢📢📢📣📣📣
作者:IT邦德
中国DBA联盟(ACDU)成员,15年DBA工作经验
Oracle、PostgreSQL ACE
CSDN博客专家及B站知名UP主,全网粉丝15万+
擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复,
安装迁移,性能优化、故障应急处理
文章目录
- [1. DG部署要求](#1. DG部署要求)
- 2.主库相关配置
-
- [2.1 强制日志模式](#2.1 强制日志模式)
- [2.2 数据库的归档](#2.2 数据库的归档)
- [2.3 添加standby redo](#2.3 添加standby redo)
- 3.备库监听
- 4.tnsnames配置
- 5.密码文件
- 6.参数文件
-
- [6.1 主库参数](#6.1 主库参数)
- [6.3 备库创建目录](#6.3 备库创建目录)
- 7.创建dataguard数据库
- [8.主备 SwitchOver 切换](#8.主备 SwitchOver 切换)
-
- [8.1 主切换到备](#8.1 主切换到备)
- [8.2. 备库切换主库](#8.2. 备库切换主库)
- [8.3 启动主备库](#8.3 启动主备库)
1. DG部署要求
主库安装好Oracle 26ai软件,并DBCA建好的容器PDB。
备库仅安装好数据库软件即可。
确保备库的SID和主库一致,其他环境变量也保证一致,方便后期同步。
配置物理standby,使用最佳性能模式。
Data Guard是Oracle高可用性HA的重要解决方案。针对不同的系统保护需求,DG提供了三种不同类型的保护模式(Protection Mode),分别为:最大保护(Maximum Protection)、最大可用(Maximum Availability)和最大性能(Maximum performance)
依然采用使用 Duplicate 在线复制的方式搭建 ADG,无需 RMAN 备份,可以通过 RMAN Duplicate 直接在线从主库拷贝文件。

这里建议源端目标端均使用 OMF
2.主库相关配置
2.1 强制日志模式
SQL> set linesize 300
SQL> select name,open_mode,log_mode,force_logging,DATABASE_ROLE,
switchover_status from v$database;
SQL> alter database force logging;

2.2 数据库的归档
如果想开快速恢复区的设置,做如下操作
alter system set db_recovery_file_dest_size=1800g;
alter system set db_recovery_file_dest='+ARCH';
开归档的方式如下:
alter system set log_archive_dest_1='location=+ARCH';
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
alter system archive log current;
2.3 添加standby redo
实际上就是与主库接收到的重做日志相对应,也就是说备库调用RFS进程将从主库接收到的重做日志按顺序写入到standby logfile,在主库创建standby logfile是便于发生角色转换后备用。
sandby redo log创建原则:
a)确保standby redo log的大小与主库online redo log的大小一致
b)如主库为单实例数据库:standby redo log组数=主库日志组总数+1
c)如果主库是RAC数据库:standby redo log组数=(每线程的日志组数+1)*最大线程数
d)不建议复用standby redo log,避免增加额外的I/O以及延缓重做传输
SQL> set linesize 300
SQL> col member for a40
SQL> select group#,type,member from v$logfile;
SQL> select THREAD#,GROUP#,BYTES/1024/1024 MB,STATUS from v$log;
SQL> select GROUP#,THREAD#,BYTES,USED,ARCHIVED,STATUS from v$standby_log;
-- Thread 1 (假设在线日志组数=2,大小=200MB)
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1
GROUP 5 ('+DATA', '+ARCH') SIZE 200M,
GROUP 6 ('+DATA', '+ARCH') SIZE 200M,
GROUP 7 ('+DATA', '+ARCH') SIZE 200M
-- Thread 2 (假设在线日志组数=2,大小=200MB)
ALTER DATABASE ADD STANDBY LOGFILE THREAD 2
GROUP 8 ('+DATA', '+ARCH') SIZE 200M,
GROUP 9 ('+DATA', '+ARCH') SIZE 200M,
GROUP 10 ('+DATA', '+ARCH') SIZE 200M

3.备库监听
整个DG的redo传输服务,都依赖于Oracle Net,因此需要为备库配置监听,配置方法多种多样,可用netmgr,netca,以及直接编辑listener.ora文件
cd $ORACLE_HOME/network/admin/
vi listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = PROD)
(ORACLE_HOME = /opt/oracle/product/26ai/dbhome_1)
(SID_NAME= PROD)
)
)
lsnrctl stop
lsnrctl start
4.tnsnames配置
注意:主备库保持一致
prod_pd =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.20)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PROD)
)
)
prod_st =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.10)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PROD)
)
)
5.密码文件
由于要求主库与备库sys使用相同的密码,在此处,我们直接复制了主库的密码文件到备库
rac 的密码文件通常存放于 ASM 盘中,查看对应的密码文件位置:
srvctl config database -d prod | grep PASSWORD
Password file: +DATA/PROD/PASSWORD/pwdprod.256.1224113223
使用asmcmd 进入到 ASM 磁盘组:
asmcmd -p
pwcopy +DATA/PROD/PASSWORD/pwdprod.256.1224113223 /home/grid/
将密码文件拷贝到备库,并且重命名,命名规则为 orapw+sid
chown oracle:oinstall /home/grid/pwdprod.256.1224113223
mv /home/grid/pwdprod.256.1224113223 /home/oracle/orapwPROD
scp /home/oracle/orapwPROD oracle@192.168.2.10:/opt/oracle/product/26ai/dbhome_1/dbs
6.参数文件
6.1 主库参数
主库生成pfile文件
SQL> create pfile='/home/oracle/pfile_prod.ora' from spfile;
主库修改参数(重启生效)
alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(PROD,PRODDG)' scope=both;
alter system set
LOG_ARCHIVE_DEST_1='LOCATION=+ARCH VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=PROD' scope=both;
alter system set
LOG_ARCHIVE_DEST_2='SERVICE=prod_st
LGWR ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=PRODDG' scope=both;
alter system set FAL_CLIENT='prod_pd' scope=both;
alter system set FAL_SERVER='prod_st' scope=both;
alter system set standby_file_management=AUTO scope=both;
6.2 备库参数
主库的pfile文件拷贝至备库
oracle@primary \~$ pwd
/home/oracle
oracle@primary \~$ scp pfile_prod_new.ora 192.168.2.10:/home/oracle
利用新建的实例创建pfile,然后修改
SQL> create pfile from spfile;
备库参数:
vi /home/oracle/initPROD.ora
*.__oracle_base='/opt/oracle'#ORACLE_BASE set from environment
*.__pga_aggregate_target=1644167168
*.__sga_target=4898947072
*.compatible='23.6.0'
*.control_files='/u01/oracle/oradata/PROD/control01.ctl','/u01/oracle/oradata/PROD/control02.ctl'
*.db_block_size=8192
*.db_unique_name='PRODDG'
*.db_name='PROD'
*.service_names='PROD'
*.log_archive_config='dg_config=(PROD,PRODDG)'
*.LOG_ARCHIVE_DEST_1='LOCATION=/u01/oracle/oradata/arch
VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=PRODDG'
*.LOG_ARCHIVE_DEST_2='SERVICE=prod_pd LGWR
ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=PROD'
*.diagnostic_dest='/opt/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLCDBXDB)'
*.enable_pluggable_database=true
*.FAL_CLIENT='prod_st'
*.FAL_SERVER='prod_pd'
*.standby_file_management=AUTO
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.pga_aggregate_target=1554m
*.processes=640
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=4660m
*.undo_tablespace='UNDOTBS1'
*.db_create_file_dest='/u01/oracle/oradata/PROD'
*.db_create_online_log_dest_1='/u01/oracle/oradata/PROD'
6.3 备库创建目录
mkdir -p /u01/oracle/oradata/PROD
mkdir -p /u01/oracle/oradata/arch
备库使用spfile启动库
sqlplus / as sysdba
startup pfile='/home/oracle/initPROD.ora' nomount;
创建pifle后重新启库
create spfile from pfile='/home/oracle/initPROD.ora';
shutdown immediate;
startup nomount;

7.创建dataguard数据库
备库RMAN登陆,做以下操作
rman target sys/oracle@prod_pd AUXILIARY sys/oracle@prod_st
RMAN> run {
allocate channel prmy1 type disk;
allocate channel prmy2 type disk;
allocate channel prmy3 type disk;
allocate channel prmy4 type disk;
allocate channel prmy5 type disk;
allocate channel prmy6 type disk;
allocate auxiliary channel aux1 type disk;
allocate auxiliary channel aux2 type disk;
allocate auxiliary channel aux3 type disk;
allocate auxiliary channel aux4 type disk;
allocate auxiliary channel aux5 type disk;
allocate auxiliary channel aux6 type disk;
duplicate target database for standby from active database dorecover nofilenamecheck;
}

8.主备 SwitchOver 切换
8.1 主切换到备
这个过程留意alert日志,然后关闭实例2,去备库确认切换信息
SQL> alter database commit to switchover to physical standby with session shutdown;
8.2. 备库切换主库
SQL> alter database commit to switchover to primary with session shutdown;
8.3 启动主备库
--打开新的主库
alter database open;
select name,open_mode,database_role from v$database;
打开新的备库:
srvctl start db -d PROD
alter database recover managed standby database using current logfile disconnect from session;
select name,open_mode,database_role from gv$database;
