📢📢📢📣📣📣
作者: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; 