Oracle 19C 中使用sqlplus完成DG切换的注意事项

2021-09-23 00:00:00 检查 状态 日志 切换 归档

容灾环境切换演练是核心系统必备的日志运维工作,基本会在半年或者三个月做一次,此时切换是否成功显得十分重要,此时需要做一系列的前期检查,从而保证切换的成功,这里我们根据MOS的文章详细整理的这个过程,期间遇到的问题其实海需要扩展,比如日志状态异常,这个需要具体问题具体分析。

Oracle 19C 中使用sqlplus完成DG切换的注意事项
前提:
(一) 安装和配置检查内容:
1 主备的RDBMS版本是否一致.
2 告警日志是否有影响切换的异常告警.
3 通过v$database_block_corruption 和 v$nonlogged_block字典查看坏块
4 检查主备配置是否正常,确认没有redo同步和redo应用的错误。
如下所示
在主库:

检查远端redo状态, V$ARCHIVE_DEST.ERROR该字段会显示错误细节。

SQL> col DEST_NAME for a20
SQL> col DESTINATION for a25
SQL> col ERROR for a15
SQL> col ALTERNATE for a20
SQL> set lines 1000
SQL> select DEST_NAME,DESTINATION,ERROR,ALTERNATE,TYPE,status,VALID_TYPE,VALID_ROLE from V$ARCHIVE_DEST where STATUS <>'INACTIVE';

检查主库近的归档:

SQL> select thread#, max(sequence#) "Last Primary Seq Generated"
from gv$archived_log val, gv$database vdb
where val.resetlogs_change# = vdb.resetlogs_change#
group by thread# order by 1;

在备库:

检查来自主库的近的归档 (对于 RAC, 将分redo线程展示)

备库收到的新的 log sequence :

SQL> select thread#, max(sequence#) "Last Standby Seq Received"
from gv$archived_log val, gv$database vdb
where val.resetlogs_change# = vdb.resetlogs_change#
group by thread# order by 1;

备库新应用的 log sequence

SQL> select thread#, max(sequence#) "Last Standby Seq Applied"
from gv$archived_log val, gv$database vdb
where val.resetlogs_change# = vdb.resetlogs_change#
and val.applied in ('YES','IN-MEMORY')
group by thread# order by 1;

(二)确认参数配置
Verify Initialization Parameters
Mainly below parameter should have configured correctly

log_archive_config : 包含主备库的配置
fal_server : 获取归档的日志远端服务器地址
db_unique_name : DG环境的所有db unique name
log_archive_dest_n: 检查远端数据库的归档

(三)切换之前的检查
1 确认日志应用是正常的,且没有日志gap
在备库运行如下查询检查收到且应用的新归档日志序列号(所有线程)
SQL> select thread#, max(sequence#) "Last Standby Seq Applied"
from gv$archived_log val, gv$database vdb
where val.resetlogs_change# = vdb.resetlogs_change#
and val.applied in ('YES','IN-MEMORY')
group by thread# order by 1;

2 检查mrp进程状态,该集成负责应用日志到数据库
SQL> select * from gv$dataguard_process;

如果需要维护使用如下方式关闭或者启动mrp进程
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

切换之前保持少的归档日志应用延迟,可以减少切换时间。

(四)检查数据文件和临时文件的状态,保持主备一致且状态为online,如果有offline的文件将其online且恢复;
SQL> SELECT NAME FROM V$DATAFILE WHERE STATUS=’OFFLINE’;
SQL> ALTER DATABASE DATAFILE 'datafile-name' ONLINE;

SQL> select tf.name filename, bytes, ts.name tablespace from v$tempfile tf, v$tablespace ts where tf.ts#=ts.ts#;

(五)检查日志文件配置和状态
set lines 150
col member for a50
select a.thread#,a.group#,a.bytes,a.blocksize,b.type,a.status,b.member from v$log a,v$logfile b where a.group#=b.group#;

select s.thread#,s.group#,s.status,s.bytes,l.type,l.member from v$logfile l,v$standby_log s where s.group#=l.group#;
核心关注status字段

切换过程:

主库执行切换检查
SQL> ALTER DATABASE SWITCHOVER TO <standby db_name> VERIFY;
这里Oracle默认会检查日志是否同步,相关配置问题。根据提示处理报错。

切换步骤:
1 主库执行切换
SQL> ALTER DATABASE SWITCHOVER TO <standby db_name>;
2 在备库执行
SQL> ALTER DATABASE OPEN;
3 原来主库
若为ADG
SQL> STARTUP;
否则
SQL> STARTUP MOUNT;
4新主库,开启MRP开始应用日志
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

切换完成后检查工作
新主库:确认日志被传送到备库并且应用
SQL> alter system archive log current;
SQL>select dest_id,error,status from v$archive_dest where dest_id=<your remote log_archive_dest_<n>>;
SQL>select max(sequence#),thread# from v$log_history group by thread#;

下面根据log_archive_dest_n做检查,如果是log_archive_dest_2
SQL>select max(sequence#) from v$archived_log where applied='YES' and dest_id=2;

在备库
确认可以从主库获得归档且应用归档。
SQL>select max(sequence#),thread# from v$archived_log group by thread#;
SQL> select name,role,instance,thread#,sequence#,action from gv$dataguard_process;




相关文章