Data Guard服务:
REDO传输服务:控制redo数据的传输到一个或多个归档目的地。
LOG应用服务:应用redo数据到standby数据库,以保持与primary数据库的事务一致。
角色转换服务:Dg中只有两种角色:primary和standby。所谓角色转换是让数据库在这两个角色中切换,切换也分两种:switchover和failover
switchover:通常是由DBA手动触发用来转换primary数据库与standby数据库,这一般是在计划内的,操作也比较简单
failover:当primary数据库出现故障并且不能被及时回复时,可以使用这种failover将一个standby数据库转换为新的primary数据库,转换完成后再解决原primary数据库问题或干脆重建一个新的standby数据库。
在进行DG转换时一定要清楚DG的三种保护模式
1、最大保护(MAXIMIZE PROTECTION)
要求所有事务在提交前其redo不仅被写入本地的online redo log,还要同时提交到standby数据库的standby redo log,并确认redo数据至少在一个standby数据库可用,然后才会在primary数据库上提交。如果出现什么故障导致standby数据库不可用,primary数据库会被shutdown。
2、最高性能(MAXIMIZE PERFORMANCE)
这种模式提供在不影响primary数据库性能前提下最高级别的数据保护策略。事务可以随时提交,当前primary数据库的redo数据也需要至少写入一个standby数据库,不过可以不同步。
3、最高可用性(MAXIMIZE AVAILABILITY)
这种模式提供在不影响primary数据库可用前提下最高级别的数据保护策略。其实现方式与最大保护模式类似,也是要求所有事务在提交前必须保障redo数据至少在一个standby数据库可用,不过与之不同,如果出现故障导入无法同时写入standby数据库redo log,primary数据库并不会shutdown,而是自动转为最高性能模式,等standby数据库恢复后,再转为最高可用性。
因为这次试验是紧跟上次在同服务器创建物理standby上做的,所以下面试验介绍物理standby的switchover和failover。
一、 物理standby的switchover
1、 检查是否支持switchover操作--primary,standby数据库操作
SQL> select name,database_role,open_mode,protection_mode,switchover_status from v$database;
NAME DATABASE_ROLE OPEN_MODE PROTECTION_MODE SWITCHOVER_STATUS
--------- ---------------- ---------- -------------------- --------------------
DADWEB PRIMARY READ WRITE MAXIMUM PERFORMANCE TO STANDBY
SQL> select name,database_role,open_mode,protection_mode,switchover_status from
v$database;
NAME DATABASE_ROLE OPEN_MODE PROTECTION_MODE SWITCHOVER_STATUS
--------- ---------------- ---------- -------------------- --------------------
DADWEB PHYSICAL STANDBY READ ONLY MAXIMUM PERFORMANCE TO PRIMARY
大家可能看见SWITCHOVER_STATUS了,这列是标识出对应数据库角色的切换状态,一共有下面几种状态:
NOT ALLOWED 当前的数据库不是带有备用数据库的主数据库
PREPARING DICTIONARY 该逻辑备用数据库正在向一个主数据库和其他备用数据库发送它的重做数据,以便为切换做准备
PREPARING SWITCHOVER 接受用于切换的重做数据时,逻辑备用配置会使用它
RECOVERY NEEDED 备用数据库还没有接收到切换请求
SESSIONS ACTIVE 在主数据库中存在活动的SQL会话;在继续执行之前必须断开这些会话
SWITCHOVER PENDING 适用于那些已收到主数据库切换请求但是还没有处理该请求的备用数据库
SWITCHOVER LATENT 切换没有完成并返回到主数据库
TO LOGICAL STANDBY 主数据库已经收到了来自逻辑备用数据库的完整的字典
TO PRIMARY 该备用数据库可以转换为主数据库
TO STANDBY 该主数据库可以转换为备用数据库
如果你的状态不是TO PRIMARY或者TO STANDBY根据具体情况自己检查下自己的参数等设置。
2、 primary数据库开始切换
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
数据库已更改。
SQL> shutdown immediate;-- (如果是正式环境primary和standby在不同服务器上,关闭后暂不开启等把主库和备库的IP相互调换后再启动数据库)
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 1073741824 bytes
Fixed Size 1334992 bytes
Variable Size 283812144 bytes
Database Buffers 784334848 bytes
Redo Buffers 4259840 bytes
数据库装载完毕。
3、 standby数据库开始切换
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY
*
第 1 行出现错误:
ORA-16139: 需要介质恢复
出现这个错误的原因是因为在standby还没应用完redo就关闭redo应用了。
SQL> alter database recover managed standby database disconnect from session;--重新开启redo应用等应用完再切换
数据库已更改。
SQL> alter database commit to switchover to primary;
数据库已更改。
SQL> SHUTDOWN IMMEDIATE;(如果是正式环境关闭后暂不开启等把主库和备库的IP相互调换后再启动数据库)
SQL> STARTUP;
4、 查看两个库角色,并开启redo应用后测试同步情况
查看新primary数据库角色:
SQL> show parameter instance_name;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string dadls
SQL> select name,database_role,open_mode,protection_mode,switchover_status from
v$database;--表示已经成功切换成功
NAME DATABASE_ROLE OPEN_MODE PROTECTION_MODE SWITCHOVER_STATUS
--------- ---------------- ---------- -------------------- --------------------
DADWEB PRIMARY READ WRITE MAXIMUM PERFORMANCE SESSIONS ACTIVE
查看新standby数据库角色:
SQL> show parameter instance_name;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string dadweb
SQL> select name,database_role,open_mode,protection_mode,switchover_status from v$database;
NAME DATABASE_ROLE OPEN_MODE PROTECTION_MODE SWITCHOVER_STATUS
--------- ---------------- ---------- -------------------- --------------------
DADWEB PHYSICAL STANDBY MOUNTED MAXIMUM PERFORMANCE RECOVERY NEEDED
开启redo应用,测试同步情况:
SQL> alter database recover managed standby database disconnect from session;
数据库已更改。
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
35
SQL> alter system switch logfile;
系统已更改。
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
35
物理standby数据库switchover成功。
二、 物理standby的failover
使用到failover也就说明了primary数据库发生了不可预料的故障并且不可能马上解决,那么我们就只有使用failover了,当然我们的data guarg容灾的目的就在于此,能够把standby快速切换成primary使应用服务的损失降低到最小。这类切换并不需要primary做什么操作,因为说不定此时primary已经不能正常打开了。但是缺点就是做了failover后原primary就不再是DG的一部分了。同样要保证转换standby数据库导maximize performance模式,语句为:SQL>alter database set standby database to maxiMize performance;
步骤:
1、 检查standby数据库中的归档日志是否连续
SQL> select thread#,low_sequence#,high_sequence# from v$archive_gap;
未选定行
如果返回行了,就需要你手工到primary服务器中把缺失的归档日志拷贝到standby服务器中,并手工注册。
SQL>alter database register physical logfile 'e:\backup\dadls\ LOG1_40_793969428.ARC ';
2、 检查primary数据库和standby数据库的归档日志是否完整,很大可能primary已经打不开,那就只有祈祷了…..
SQL>select distinct thread#,max(sequence#)over(partition by thread#) a from v$archived_log;--保证primary和standby中的归档号相同
3、启动failover(standby执行)
SQL>alter database recover managed standby database finish force;
4、切换物理standby角色为primary
SQL>alter database commit to switchover to primary;
5、 开启新的primary,并查看角色
SQL>startup
SQL> select database_role,protection_mode,switchover_status from v$database;
DATABASE_ROLE PROTECTION_MODE SWITCHOVER_STATUS
---------------- -------------------- --------------------
PRIMARY MAXIMUM PERFORMANCE SESSIONS ACTIVE
剩下的就是重建新的standby数据库,在新建standby数据库同时记得修改新的primary数据库的相关参数(比如LOG_ARCHIVE_CONFIG)。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/27795470/viewspace-743485/
,如需转载,请注明出处,否则将追究法律责任。