1、 物理 standby的 Switchover
注意操作步骤的先后,很关键的哟。
1.1 检查是否支持 switchover 操作 --primary 数据库操作
登陆 primary 数据库,查询 v$database 视图的 switchover_status 列。
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO STANDBY
如果该列值为"TO STANDBY"则表示 primary 数据库支持转换为 standby 角色,否则的话你就需要重新检查一下 DataGuard 配置,比如看看 LOG_ARCHIVE_DEST_n之类参数值是否正确有效等等。
1.2 启动 switchover --primary 数据库操作
首先将 primary 转换为 standby 的角色,通过下列语句:
SQL>alter database commit to switchover to physical standby;
数据库已更改。
语句执行完毕后,primary 数据库将会转换为 standby 数据库,并自动备份控制文件到 trace。
1.3 重启动到 mount --原 primary 数据库操作
SQL> shutdown immediate
ORA-01507: 未装载数据库
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
1.4 检查是否支持 switchover 操作 --待转换 standby 数据库操作
待原 primary 切换为 standby 角色之后,检查待转换的 standby 数据库 switchover_status 列,看看是否支持角色转换。
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
此时待转换 standby 数据库 switchover_status 列值应该是"TO_PRIMARY",如否则检查其初始化参数文件中的设置,提示一下,比着原 primary 数据库的初始化参数改改。
1.5 转换角色到 primary --待转换 standby 数据库操作
通过下列语句转换 standby 到 primary 角色:
SQL> alter database commit to switchover to primary;
数据库已更改。
注意:待转换的物理 standby 可以处于 mount 模式或 open read only 模式,但不能处于 open read write模式。
1.6 完成转换,打开新的 primary 数据库
SQL> alter database open;
数据库已更改。
注:如果数据库处于 openread-only 模式的话,需要先 shutdown 然后直接 startup 即可。
1.7 验证一下
新的 primary 数据库
SQL> show parameter db_unique
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name string jsspdg
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
67
SQL> alter system switch logfile;
系统已更改。
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
68
新的 standby 数据库
SQL> show parameter db_unique
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name string jssweb
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
68
转换成功。
2、 物理 standby的 Failover
2.1在备库确认是否有日志没有同步:
SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
2.2如果此查询有记录,需要把这些日志从主库拷贝到备库,并注册到数据库中
ALTER DATABASE REGISTER PHYSICAL LOGFILE '拷贝过来的日志文件';
2.3 查询日志是否应用到最新状态:
select distinct thread#,max(sequence#) over(partition by thread#) a from v$archived_log;
2.4 在备库做失败切换:
alter database recover managed standby database finish force;
alter database commit to switchover to primary;
此时不再是dataguard环境了,需要根据现有的主库搭建一个新的dataguard环境
3.备库激活
alter database recover managed standby database cancel;
alter database recover managed standby database finish force;
alter database activate physical standby database;
alter database open;