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主备架构常用命令总结》