Oracle DG主备架构的基本维护操作总结

Oracle DG主备架构的基本维护操作总结

一、计划内停止数据库(备库为单库环境)

1、停止主库

正常方式停止主库即可

如果是单库环境,可以参考我的文章《Oracle单库环境下计划内启停数据库的步骤》

如果是集群环境,可以参考我得文章《Oracle RAC集群环境下正常启停数据库》

2、停止备库
1)备库停止前,需要取消日志应用
复制代码
su - oracle
sqlplus "/as sysdba"
alter database recover managed standby database cancel;
确认日志应用进行已经停止(即MPR进程已经消失)
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM V$MANAGED_STANDBY where PROCESS like '%MRP%';
查询出来的结果应该没有任何行
2)停止备库
复制代码
su - oracle
sqlplus "/as sysdba"
shutdown immediate;

二、计划内启动数据库(备库为单库环境)

1、启动主库

正常方式启动主库即可

如果是单库环境,可以参考我的文章《Oracle单库环境下计划内启停数据库的步骤》

如果是集群环境,可以参考我得文章《Oracle RAC集群环境下正常启停数据库》

2、启动备库

1)启动备库

复制代码
su - oracle
sqlplus "/as sysdba"
startup read only;

2)启动日志应用

复制代码
alter database recover managed standby database using current logfile disconnect from session;
确认日志应用进行已经启动(即MPR进程已经存在)
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM V$MANAGED_STANDBY where PROCESS like '%MRP%';

3)简单同步验证

主库上可以做一些简单操作(例如创建一个空表),确认备库上可以同步过来

三、计划内停止数据库(备库为集群环境)

1、停止主库

正常方式停止主库即可

如果是单库环境,可以参考我的文章《Oracle单库环境下计划内启停数据库的步骤》

如果是集群环境,可以参考我得文章《Oracle RAC集群环境下正常启停数据库》

2、停止备库

1)备库停止前,需要取消日志应用

首先需要确认,日志应用进程在哪个集群节点;登录集群中的任意服务器查询(查询MPR进程在哪个集群节点中),如下

复制代码
su - oracle
sqlplus "/as sysdba"
SELECT INST_ID,PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM GV$MANAGED_STANDBY where PROCESS like '%MRP%';
查询结果类似如下:
   INST_ID PROCESS   STATUS          THREAD#  SEQUENCE#     BLOCK#     BLOCKS
---------- --------- ------------ ---------- ---------- ---------- ----------
         2 MRP0      APPLYING_LOG          2         22          1     102400
INST_ID=2表示该备库集群环境中,日志应用进程在节点二上运行,因此,取消日志应用,需要登录节点二上执行。

停止日志应用的方法如下:(登录MPR进行的所在节点)

复制代码
su - oracle
sqlplus "/as sysdba"
alter database recover managed standby database cancel;

2)停止备库

复制代码
su - oracle
srvctl stop database -d orcl -o immediate

四、计划内启动数据库(备库为集群环境)

1、启动主库

正常方式启动主库即可

如果是单库环境,可以参考我的文章《Oracle单库环境下计划内启停数据库的步骤》

如果是集群环境,可以参考我得文章《Oracle RAC集群环境下正常启停数据库》

2、启动备库

1)启动备库

复制代码
节点一上执行
su - oracle
srvctl start databaes -d orcl

2)启动日志应用

复制代码
alter database recover managed standby database using current logfile disconnect from session;
确认日志应用进行已经启动(即MPR进程已经存在)
SELECT INST_ID,PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM GV$MANAGED_STANDBY where PROCESS like '%MRP%';

3)简单同步验证

主库上可以做一些简单操作(例如创建一个空表),确认备库上可以同步过来

五、主备同步情况检查(建议定时检查一次)

1、从归档日志应用情况来检查主备同步情况

主库上查询

复制代码
su - oracle
sqlplus "/as sysdba"
set linesize 20o pagesize 999
col standby_tns_name format a30
select inst_id,max(sequence#),max(name) standby_tns_name 
from gv$archived_log 
where standby_dest='YES' and applied='YES' group by inst_id order by 1;
select inst_id,max(sequence#) from gv$archived_log where standby_dest='NO' group by inst_id order by 1;

备注:

第一个查询语句,查询备库上已经同步的归档日志文件,max(sequence#)表示最后应用的日志文件序列号

第二个查询语句,查询主库上已经归档的的日志文件,max(sequence#)表示最后归档的日志文件序列号

通过比较查询的第二列,max(sequence#),是否有间隔,来判断主备同步情况

1)如果两个语句的max(sequence#)查询一致,则表示同步正常

2)如果检查结果相差在5以内(即备库有几个归档日志未同步),可以持续观察一下,如果备库的max(sequence#)查询结果一直不变,而主库的一直在增长,表示同步异常(主库的归档日志无法正常传递至备库主机)。

3)如果备库的max(sequence#)查询结果一直在增长,但是两者查询的差距一直持续变大,则表示同步延迟(例如主库太繁忙),但是主备库之间的同步传输并未问题。

2、通过SCN变更号来查询
复制代码
登录主库查询
sqlplus "/as sysdba"
select CURRENT_SCN from v$database;
登录备库查询
sqlplus "/as sysdba"
select CURRENT_SCN from v$database;
通过两个之间的差距来判断,主备同步情况,判断方法与归档日志的方法类似

六、DG架构的三种数据保护模式

保护模式是针对primary database进行设置的,这个设置告诉primary database必须要遵守的规则

保护模式设置语法,主库上执行

复制代码
Alter database set standby to maximize protection;
Alter database set standby to maximize availability;
Alter database set standby to maximize performance;
三种数据保护模式的总结

1、11g版本以后,最大保护模式(maximize protection)可以在数据库open状态下切换;10g版本则必须在数据库mount状态下切换(主库),其它两种模式,可以在主库open状态下切换。

2、选择哪种模式,完全由业务需求驱动

3、最大保护模式和最大可用模式,日志的传输参数,必须有一个备库以SYNC实时传递,类似如下:

复制代码
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=orcl_st LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_st';

4、主备数据必须要求一致的,选择最大保护模式,这种模式,主库上的日志,必须传递到备库,主库上的操作才算完成,否则,失败,主库自己选择挂掉(保护数据),慎重选择,这种情况下,备库的异常,会影响主库!!!

5、默认是最大性能模式,即,主库传递日志到备库,但是不管备库能否接受到,主库上的操作完全不会受到任何影响

6、最大可用模式,首先这种模式是运行在最大保护模式,如果有一次传递日志时,等待一个指定的时间内(net_timeout 由log_archived_dest参数中设定),没有收到任何反馈信息,那么,这个备库就会标记为failed状态,LGWR继续写日志,操作继续完成(第一次出现异常时,有等待时间)。后续,DG的保护模式自动下降至unpretected,一直到解决了日志GAP,primary才会继续发送redo给备库,并且恢复到最大可用模式。

7、保护模式的查询方法(主备都可以)

复制代码
select open_mode,database_role,protection_level,protection_mode,switchover_status,force_logging from v$database;

七、DG主备架构中,主库需要新增数据文件目录的维护操作

(一)案例需求

现有主库:数据文件存放目录为/oradata/orcl(主备一样)

新增需求:主库上需要增加一个目录/oradata1/orcl用于存放数据文件,备库也同时规划这个目录(主备一样)

(二)DG为单库环境,具体步骤
复制代码
1、
主备都新增目录/oradata1/orcl
mkdir -p /oradata1/orcl
chown -R oracle:oinstall /oradata1

2、主备都执行,数据文件转换参数,添加新加目录映射
su - oracle
sqlplus "/as sysdba"
alter system set db_file_name_convert='/oradata/orcl','/oradata/orcl','/oradata1/orcl','/oradata1/orcl' scope=spfile sid='*';         
至此完成!

3、验证
创建表空间验证
create tablespace tbs1 datafile '/oradata1/orcl/tbs1001.dbf' size 10m;
create table t2 (id number) tablespace tbs1;
insert into t2 values(5);
commit;
验证上面操作无问题,且可以正常同步

(三)DG为集群环境

如果是集群环境,需要新规划ASM磁盘(主备都需要),同时如果数据库是非OMF文件管理方式,例如数据文件以.dbf结束,基本就是非OMF管理。

1、这种情况下,需要备库上提前创建好目录,例如新规划+DATA1磁盘组,主库新建文件为+DATA1/orcl/tbs001.dbf,备库需要在ASM磁盘组中提前创建好+DATA1/orcl目录,如下

复制代码
备库上提前执行
su - grid
asmcmd mkdir +data1/orcl

2、修改数据文件转换参数,添加新加目录映射

复制代码
su - oracle
sqlplus "/as sysdba"
alter system set db_file_name_convert='/+DATA','/+DATA','/+DATA1','/+DATA1' scope=spfile sid='*';  

八、Oracle DG环境下修改redo和standby日志文件

参考文章《Oracle DG环境下修改redo和standby日志文件》

九、DG环境中主库增加日志文件组的调整

参考文章《Oracle DG环境下修改redo和standby日志文件》

十、DG主备架构常用命令总结

参考文章《DG主备架构常用命令总结》

相关推荐
东方佑1 小时前
FRSMASH v3.7:当门控机制成为长上下文的枷锁——一个极简修复背后的架构洞见
人工智能·架构
xieliyu.1 小时前
MySQL 六大基础约束详解:NOT NULL/DEFAULT/UNIQUE/ 主键 / 外键 / CHECK
android·数据库·sql·mysql
Niuguangshuo1 小时前
TTS 架构的六代演进(一):三段式链路与评测框架
架构
武子康2 小时前
调查研究-224 Prefill 与 Decode 分离:高并发 LLM Serving 的下一层架构
人工智能·ai·架构·llm·gpu·vllm·sglang
ting94520002 小时前
技术解析:Owl Alpha 底层架构与 OpenRouter 模型网关全链路实现(无营销、纯技术向)
人工智能·架构
JSON_L2 小时前
MongoDB文档关系详解
数据库·mongodb
Liora_Yvonne2 小时前
为什么你写了3年前端还是搭不好一个项目
前端·架构
郝学胜_神的一滴2 小时前
系统设计 019:分片拆分与副本容灾深度解析
后端·架构
卓怡学长2 小时前
w268基于springboot + vue 物流系统
java·数据库·vue.js·spring boot·spring·intellij-idea