近期有多套生产环境的数据库需要搭建ADG,数据库均有NBU实时备份,为了最大程度减少主库的操作以及节约时间,提升效率的同时降低风险,故均采用了通过NBU的备份来搭建ADG的方式。
主库:ora11204两节点RAC
备库:ora11204单机+ASM
1、备库服务器安装NBU客户端
2、主备库配置静态监听
配置备库静态监听(主/备库静态监听配置在grid/oracle下面$ORACLE_HOME/network/admin/listener.ora)
主库1节点:
LISTENER_DG = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.11)(PORT = 1521)))
ADR_BASE_LISTENER_DG = /home/db/oracle
SID_LIST_LISTENER_DG =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = testdb)
(SID_NAME = testdb)
(ORACLE_HOME = /home/db/oracle/product/11.2.0/dbhome_1)
)
)
主库2节点:
LISTENER_DG = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.12)(PORT = 1521)))
ADR_BASE_LISTENER_DG = /home/db/oracle
SID_LIST_LISTENER_DG =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = testdb)
(SID_NAME = testdb)
(ORACLE_HOME = /home/db/oracle/product/11.2.0/dbhome_1)
)
)
备库:
LISTENER_DG = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.10)(PORT = 1521)))
ADR_BASE_LISTENER_DG = /home/db/oracle
SID_LIST_LISTENER_DG =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = testdbdg)
(SID_NAME = testdb)
(ORACLE_HOME = /home/db/oracle/product/11.2.0/dbhome_1)
)
)
#启动静态监听
su - oracle
lsnrctl start LISTENER_DG
3、主备库配置连接串tnsnames.ora
TESTDB_PRM_DG =
(DESCRIPTION =
(FAILOVER = ON)
(LOAD_BALANCE = YES)
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.11)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.12)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = testdb)
)
)
TESTDB_STB_DG =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.10)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = testdbdg)
)
)">>$ORACLE_HOME/network/admin/tnsnames.ora
cat $ORACLE_HOME/network/admin/tnsnames.ora
#主备库tnsping互相测试
su - oracle
tnsping TESTDB_PRM_DG
tnsping TESTDB_STB_DG
4、复制密码文件
主库:
scp /home/db/oracle/product/11.2.0/dbhome_1/dbs/orapwtestdb1 10.10.10.10:$ORACLE_HOME/dbs
备库:
su - oracle
mv $ORACLE_HOME/dbs/orapwtestdb1 $ORACLE_HOME/dbs/orapwtestdb
5、修改备库参数文件(inittestdb.ora)
*.compatible=‘11.2.0.4.0’
*.control_files=’+DATA’#Restore Controlfile
*.db_file_name_convert=’+DATA/testdb’,’+DATA/testdbdg’
*.db_name=‘testdb’
*.db_unique_name=‘testdbdg’
*.deferred_segment_creation=FALSE
*.fal_client=‘TESTDB_STB_DG’
*.fal_server=‘TESTDB_PRM_DG’
*.log_archive_config=‘dg_config=(testdb,testdbdg)’
*.log_archive_dest_1=‘LOCATION=+ARCH’
*.log_archive_dest_2=‘SERVICE=TESTDB_PRM_DG LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=testdb’
*.log_archive_dest_state_2=‘enable’
*.log_archive_format=’%t_%s_%r.dbf’
testdb.log_archive_format=’%t_%s_%r.dbf’
*.log_archive_max_processes=4
*.log_archive_min_succeed_dest=1
*.log_archive_trace=0
testdb.log_archive_trace=0
*.log_file_name_convert=’+DATA/testdb’,’+DATA/testdbdg’
*.standby_file_management=‘auto’
*.pga_aggregate_target=21474836480
*.sga_target=85899345920
*.undo_tablespace=‘UNDOTBS1’
修改参数文件后,启动至nomount
startup nomount pfile=’$ORACLE_HOME/dbs/inittestdb.ora’;
6、恢复standby controlfile
#源端备份standby controlfile
alter database create standby controlfile as ‘/tmp/ctrl_2022.ctl’;
scp /tmp/ctrl_2022.ctl oracle@10.10.10.10:/home/oracle/
#目标端恢复standby controlfile
su - oracle
rman target /
restore controlfile from ‘/home/oracle/ctrl_2022.ctl’;
alter database mount standby database;
#这里停下数据库,在参数文件中修改*.control_files值为恢复的实际文件路径,再启动到mount
7、通过NBU备份恢复数据文件
vi /home/oracle/rman_restore2022.sh
rman target / msglog=//home/oracle/rman_restore2022.log << EOF
run {
allocate channel c1 type ‘sbt_tape’;
send ‘NB_ORA_CLIENT=testdb01’;
allocate channel c2 type ‘sbt_tape’;
send ‘NB_ORA_CLIENT=testdb01’;
allocate channel c3 type ‘sbt_tape’;
send ‘NB_ORA_CLIENT=testdb01’;
allocate channel c4 type ‘sbt_tape’;
send ‘NB_ORA_CLIENT=testdb01’;
restore database;
recover database;
release channel c1;
release channel c2;
release channel c3;
release channel c4;
}
exit;
EOF
#执行恢复库脚本
nohup sh /home/oracle/rman_restore2022.sh &
8、主库修改参数
su - oracle
rman target /
configure archivelog deletion policy to applied on all standby;
alter system set standby_file_management=auto;
alter system set fal_server=TESTDB_STB_DG;
alter system set fal_client=TESTDB_PRM_DG;
alter system set log_archive_config=‘dg_config=(testdb,testdbdg)’ sid=’*’;
alter system set log_archive_dest_2=‘service=“TESTDB_STB_DG”, LGWR ASYNC NOAFFIRM compression=enable db_unique_name=“testdbdg” valid_for=(all_logfiles,primary_role)’ sid=’*’;
alter system set log_archive_dest_state_2=enable;
9、备库开启日志应用
alter database recover managed standby database using current logfile disconnect;
#如缺少归档日志,仍可通过NBU恢复归档
RUN {
ALLOCATE CHANNEL ch00 TYPE ‘SBT_TAPE’ parms=‘ENV=(NB_ORA_CLIENT=testdb01,NB_ORA_POLICY=testdb01-ORALOG-testdbBackup)’;
ALLOCATE CHANNEL ch01 TYPE ‘SBT_TAPE’ parms=‘ENV=(NB_ORA_CLIENT=testdb01,NB_ORA_POLICY=testdb01-ORALOG-testdbBackup)’;
set archivelog destination to ‘+ARCH’;
restore archivelog from logseq 28628 thread 1;
restore archivelog from logseq 28628 thread 2;
RELEASE CHANNEL ch00;
RELEASE CHANNEL ch01;
}
–其中testdb01为主机名,testdb01-ORALOG-testdbBackup为NBU归档备份策略名
10、同步检查
#查看同步状态
set line 999
select inst\_id,thread#,process,pid,status,client\_process,client\_pid,sequence#,block#,active\_agents,known\_agents from gv$managed\_standby;
#同步检查
set echo off
set lines 300 pages 50
set heading on
set verify off
col name for a30
col value for a30
col TIME\_COMPUTED for a20
col datum\_time for a20 heading ‘LAST\_RECEIVED\_TIME’
col inst\_id for 99 heading ‘ID’
break on inst\_id
alter session set nls\_date\_format=‘yyyy-mm-dd hh24:mi:ss’;
select inst\_id,name,value,time\_computed,DATUM\_TIME,sysdate from gv$dataguard\_stats order by inst\_id;
11、创建spfile至共享存储
create spfile=’+DATA’ from pfile=’$ORACLE_HOME/dbs/inittestdb.ora’;
vi $ORACLE_HOME/dbs/inittestdb.ora
SPFILE=’+data/testdbdg/parameters/xxx’
12、开启数据库
alter database recover managed standby database cancel;
alter database open read only;
alter database recover managed standby database using current logfile disconnect;
13、配置归档删除脚本crontab




