ADG duplicate实施方案详细教程(单机版)
Oracle ADG Duplicate 实施方案详解
概述
本文详细介绍了使用Duplicate方式搭建Oracle Active Data Guard的完整实施方案,包含参数配置、实施步骤、回退方案和常见问题处理。
ADG参数说明
参数名称 | 说明 |
---|---|
*.db_create_file_dest | OMF方式管理数据文件,优先级高于DB_FILE_NAME_CONVERT |
*.fal_server | 指定备用数据库获取丢失归档日志的Oracle Net服务名称 |
*.db_unique_name | 数据库唯一名称标识 |
*.log_archive_config | 配置Data Guard环境中的数据库唯一名称 |
*.log_archive_dest_n | 配置归档传输目的地和属性 |
*.DB_FILE_NAME_CONVERT | 主备库数据文件路径转换 |
*.LOG_FILE_NAME_CONVERT | 主备库日志文件路径转换 |
*.service_names | 服务名,需与主库保持一致 |
关键参数详解
- VALID_FOR属性: 建议为每个redo传输目的地指定,确保角色转换后redo传输正常
- compression=enable: 启用压缩,默认使用ZLIB算法
- DB_FILE_NAME_CONVERT: 仅用于物理备库的路径名转换
- LOG_FILE_NAME_CONVERT: 指定备用数据库在线重做日志文件的位置
具体参数作用及格式详见Oracle Data Guard 关键参数详解
一、回退方案测试
清除备库环境步骤
-- 1.停mrp、停库
alter database recover managed standby database cancel;
shutdown immediate;-- 2.删除控制文件
rm -f /oracle/product/oradata/XDGDB/control01.ctl
rm -f /oracle/product/oradata/XDGDB/control02.ctl-- 3.删除spfile(可选)
rm -f /oracle/product/19.3/db/dbs/spfilexdgdb.ora-- 4.删除日志文件
rm -f /oracle/product/oradata/DGDB/redo01.log
rm -f /oracle/product/oradata/DGDB/redo02.log
rm -f /oracle/product/oradata/DGDB/redo03.log
rm -f /oracle/product/oradata/DGDB/redo11.log
rm -f /oracle/product/oradata/DGDB/redo12.log
rm -f /oracle/product/oradata/DGDB/redo13.log-- 5.删除数据文件
rm -f /oracle/product/oradata/DGDB/system01.dbf
rm -f /oracle/XDGDB/datafile/o1_mf_test_dat_n7cxkz91_.dbf
rm -f /oracle/product/oradata/DGDB/sysaux01.dbf
rm -f /oracle/product/oradata/DGDB/undotbs01.dbf
rm -f /oracle/XDGDB/datafile/o1_mf_test_dat_n6y8yk14_.dbf
rm -f /oracle/product/oradata/DGDB/users01.dbf
rm -f /oracle/product/oradata/DGDB/XDGDB/datafile/o1_mf_test_dat_n7cxyqgo_.dbf-- 6.删除临时文件(未open时,temp文件实际不存在)
rm -f /oracle/product/oradata/DGDB/temp01.dbf-- 7.删除archived_log
rm -f /oradata/1_*.dbf
二、变更实施方案-ADG搭建
1. 主库开启force logging
alter database force logging;
select open_mode,database_role,flashback_on,force_logging from v$database;-- RMAN配置
configure archivelog deletion policy to shipped to standby;
2. 主库拷贝密码文件到备库
scp /oracle/product/19.3/db/dbs/orapwxdgdb 备库IP:/home/oracle/
3. 备库创建密码文件
orapwd file='/oracle/product/19.3/db/dbs/orapwxdgdb' input_file='/home/oracle/orapwdgdb'
4. 主库创建pfile并传送到备库
create pfile='/home/oracle/pfile.ora' from spfile;
scp /home/oracle/pfile.ora 备库IP:/home/oracle/
5. 备库修改pfile参数
*.audit_file_dest='/oracle/product/admin/dgdb/adump'
*.control_files='/oracle/product/oradata/XDGDB/control01.ctl','/oracle/product/oradata/XDGDB/control02.ctl'
*.db_create_file_dest='/oracle/product/oradata'
*.fal_server='dgdb'
*.db_unique_name='xdgdb'
*.log_archive_config='dg_config=(dgdb,xdgdb)'
*.log_archive_dest_1='location=/oradata valid_for=(all_logfiles,all_roles) db_unique_name=xdgdb'
*.log_archive_dest_2='SERVICE=dgdb valid_for=(online_logfiles,primary_role) db_unique_name=dgdb lgwr async compression=enable'
*.db_file_name_convert='/oracle','/oracle/product/oradata'
*.log_file_name_convert='/oracle/product/oradata/DGDB','/oracle/product/oradata/XDGDB/onlinelog'
*.standby_file_management='AUTO'
*.service_names='dgdb'
注意: 检查是否需要修改_ktb_debug_flags=8
参数
6. 启动备库到nomount并生成spfile
startup nomount pfile='/home/oracle/newstd.pf';
create spfile='/oracle/product/19.3/db/dbs/spfilexdgdb.ora' from pfile='/home/oracle/newstd.pf';
shutdown immediate;
startup nomount;
show parameter spfile;
7. 备库配置静态监听
# listener.ra中配置
SID_LIST_LISTENER=(SID_LIST=(SID_DESC=(GLOBAL_DBNAME=dgdb) # 需与数据库参数service_names一致(SID_NAME=xdgdb)(ORACLE_HOME=/oracle/product/19.3/db)))
执行lsnrctl reload
查看实例状态
8. 主备库配置tnsnames.ora
# 主库配置
DGDB =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.152.85)(PORT = 21129))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = dgdb)))XDGDB =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.152.88)(PORT = 21129))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = dgdb)(UR=A) # 解决连接问题可选参数))
9. 验证主备库连接
sqlplus sys/SY#2020oracle@dgdb as sysdba
sqlplus sys/SY#2020oracle@xdgdb as sysdbarman target sys/SY#2020oracle@dgdb auxiliary sys/SY#2020oracle@xdgdb
10. 主库修改参数
alter system set log_archive_config='dg_config=(dgdb,xdgdb)' scope=both sid='*';
alter system set log_archive_dest_2='SERVICE=xdgdb valid_for=(online_logfiles,primary_role) db_unique_name=xdgdb lgwr async compression=enable';
alter system set log_archive_dest_state_2=enable scope=both sid='*';
alter system set archive_lag_target=1800;
alter system set standby_file_management='AUTO';
alter system set db_recovery_file_dest_size=4G;
alter system set db_recovery_file_dest='/oradata';
alter system set db_file_name_convert='/oracle','/oracle' scope=spfile;
alter system set log_file_name_convert='/oradata','/oradata' scope=spfile;
alter system set fal_server='xdgdb' scope=both sid='*';
11. 执行duplicate数据库
创建duplicate.sh脚本:
export NLS_DATE_FORMAT="YYYYMMDD HH24:MI:SS"
date
echo "##########################"
echo "start standby database"
echo "##########################"
sqlplus "/ as sysdba"<<EOF
#startup nomount ;
connect sys/SY#2020oracle@dgdb AS SYSDBA
connect sys/SY#2020oracle@xdgdb AS SYSDBA
exit
EOFdate
echo "##########################"
echo "start to duplicate target database"
echo "##########################"
rman target sys/SY#2020oracle@dgdb auxiliary sys/SY#2020oracle@xdgdb <<EOF
run {
allocate channel ch001 type disk;
allocate channel ch002 type disk;
allocate channel ch003 type disk;
allocate channel ch004 type disk;
allocate auxiliary channel ch005 type disk;
allocate auxiliary channel ch006 type disk;
duplicate target database for standby from active database using compressed backupset nofilenamecheck;
release channel ch001;
release channel ch002;
release channel ch003;
release channel ch004;
release channel ch005;
release channel ch006;
}
exit
EOF
执行脚本:
chmod +x duplicate.sh
sh duplicate.sh
12. 备库验证日志实时应用
-- 检查redo日志情况
set linesize 300
set pagesize 10000
col member for a60
col status for a10
col dbid format 999999999
select a.group#,a.sequence#,a.status,a.bytes/1024/1024/1024 from v$log a;
select a.thread#,b.group#,a.sequence#,a.status,a.bytes/1024/1024,b.member
from v$log a,v$logfile b
where a.group#=b.group# order by 1;
select * from v$logfile;
select GROUP#,DBID,THREAD#,SEQUENCE#,BYTES,BLOCKSIZE,USED,ARCHIVED,STATUS from v$standby_log;-- 启动mrp
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;-- 检查mrp进程
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#,BLOCK#, BLOCKS FROM V$MANAGED_STANDBY;-- 检查主备库延时
set lines 1200 pages 1200
col name for a30
col value for a30
col datum_time for a30
col time_computed for a30
SELECT name, value, datum_time, time_computed
FROM V$DATAGUARD_STATS;-- 查询归档应用情况
SELECT /*+rule*/ ARCH.THREAD# "Thread",
ARCH.SEQUENCE# "Last Sequence Received",
APPL.SEQUENCE# "Last Sequence Applied",
(ARCH.SEQUENCE# - APPL.SEQUENCE#) "Difference"
FROM (SELECT THREAD#, SEQUENCE#
FROM V$ARCHIVED_LOG
WHERE (THREAD#, FIRST_CHANGE#) IN
(SELECT THREAD#, MAX(FIRST_CHANGE#)
FROM V$ARCHIVED_LOG
GROUP BY THREAD#)
GROUP BY THREAD#, SEQUENCE#) ARCH,
(SELECT THREAD#, SEQUENCE#
FROM V$LOG_HISTORY
WHERE (THREAD#, FIRST_CHANGE#) IN
(SELECT THREAD#, MAX(FIRST_CHANGE#)
FROM V$LOG_HISTORY
GROUP BY THREAD#)) APPL
WHERE ARCH.THREAD# = APPL.THREAD#
ORDER BY 1;-- 停止mrp、打开数据库并启动mrp
alter database recover managed standby database cancel;
alter database open;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
13. 主库执行switchover检查
ALTER SYSTEM ARCHIVE LOG CURRENT;
alter database switchover to xdgdb verify;
三、常见错误及解决方案
场景1:log_file_name_convert设置有误
问题现象:
- RMAN-05535警告
- 日志文件路径不正确
解决方案:
- 检查日志文件状态:
set linesize 300
set pagesize 10000
col member for a120
col status for a10
col dbid format 999999999
select a.group#,a.sequence#,a.status,a.bytes/1024/1024/1024 from v$log a;
select a.thread#,b.group#,a.sequence#,a.status,a.bytes/1024/1024,b.member from v$log a,v$logfile b
where a.group#=b.group# order by 1;
select * from v$logfile;
select GROUP#,DBID,THREAD#,SEQUENCE#,BYTES,BLOCKSIZE,USED,ARCHIVED,STATUS from v$standby_log;
- 方案一: 使用alter database rename file
alter database rename file '/oracle/product/19.3/db/dbs/broken0' to '/oracle/product/oradata/XDGDB/onlinelog/redo01.log';
-- 类似操作重命名其他文件
- 方案二: 手动drop后创建redo
-- 查询文件大小
select MEMBERS ,BYTES/1024/1024 as MB from v$log;-- Drop日志文件
alter database drop logfile group 1;
alter database drop logfile group 2;
-- ...其他组-- 重建日志文件
mkdir -p /oracle/product/oradata/DGDB/
alter database add logfile thread 1 group 1 '/oracle/product/oradata/DGDB/redo01.log' size 100M;
alter database add logfile thread 1 group 2 '/oracle/product/oradata/DGDB/redo02.log' size 100M;
alter database add standby logfile thread 1 group 11 '/oracle/product/oradata/DGDB/redo11.log' size 100M;
alter database add standby logfile thread 1 group 12 '/oracle/product/oradata/DGDB/redo12.log' size 100M;
alter database open;
场景2:standby_file_management设置为MANUAL
问题: 主库扩表空间,备库无法正常同步
解决方案:
-- 停止mrp
alter database recover managed standby database cancel;-- 重新创建出错数据文件
alter database create datafile '/oracle/product/19.3/db/dbs/UNNAMED00009'
as '/oracle/product/oradata/product/oradata/DGDB/test_data04.dbf';-- 修改参数
alter system set standby_file_management=auto;-- 启动mrp
alter database recover managed standby database using current logfile disconnect from session;
场景3:service_names与主库不一致
问题: 切换后应用端需修改连接串中的服务名
解决方案: 确保备库参数*.service_names
与主库保持一致
总结
本文详细介绍了Oracle ADG通过Duplicate方式搭建的完整流程,包括参数配置、实施步骤、回退方案和常见问题处理。在实际实施过程中,需要注意参数配置的准确性、文件路径的正确性以及各项验证步骤的完整性,确保ADG环境搭建成功并稳定运行。
关键点:
- 参数配置要准确,特别是文件路径转换参数
- 确保主备库网络连通性
- 实施前后做好验证工作
- 掌握常见问题的处理方法
- 准备好回退方案以备不时之需