failover切换
执行以下步骤完成Data Guard环境的Failover切换,为了使 failover过程尽量不丢失数据,在执行真正的切换是要尽量处理主数据库到standby数据库redo日志的传输问题,并将它们注册到standby数据库。
1: 处理缺失的redo
<1> 查找、传递和注册缺失的redo日志
这里假设主数据库出现故障宕机,执行以下步骤查看日志传输和应用情况,注册缺失的日志。
如果主数据库可以被加载mount状态,执行以下步骤,如果不能被加载则跳过下一步
sql> alter system flush redo to '<target_db_name>';
以上sql语句表明从主数据库发送未发送的redo日志到standby数据库,target_db_name是初始化参数配置的db_unique_name,名称要用单引号括起来,这个语句发送所有未发送的redo日志到standby数据库,并且等待应用完成,必须在mount模式没有打开主数据库的情况下执行。
如果一下语句不能成功完成,或者不愿意长时间等待执行过程,执行以下的步骤手动传递,注册缺失的日志。
①.在主数据库执行以下sql语句查询主数据库每个线程最大的redo日志序列号
SQL> select dest_id,thread#,max(sequence#) from v$archived_Log group by dest_id,thread# order by thread#;
DEST_ID THREAD# MAX(SEQUENCE#)
---------- ---------- --------------
1 1 92
2 1 90
DEST_ID : 1 表示主库,2 表示备库
sequence: seq一致表示主库所有的redo已经传到备库,如果备库值为58,说明58~62号日志没传到备库,需要手动传输过去;
如果这些序列号对应的文件在standby数据库中不存在,从主数据库拷贝缺失的归档redo到standby数据库。
也可以用一下语句查看
标志和解决任何归档redo日志的缺失
如果主数据库无法加载到mout状态,那么只有手动完成缺失redo日志的拷贝和注册过程。standby 数据库执行以下sql语句查询v$arvhive_gap, 查找在standby数据库任何缺失的redo日志文件。
sql>select thread#,low_sequence#,high_sequence# from v$archive_gap;
thread# low_sequence# high_sequence#
----------------------------------------------
1 90 92
从上面输出表明,缺失线程1的归档redo日志序列号为90,91,92的归档redo日志。从主数据库拷贝它们到standby数据库,并且在standby数据库 上注册。必须针对每个线程完成。
②. 在standby 数据库执行以下sql语句注册缺失的redo日志
SQL> alter database register physical logfile '/oradata/arch1_90_901562693.dbf';
SQL> alter database register physical logfile '/oradata/arch1_91_901562693.dbf';
SQL> alter database register physical logfile '/oradata/arch1_92_901562693.dbf';
如果归档日志文件发生缺失,那么实时应用的standby redo也是缺失的,还要从主数据库拷贝联机redo日志到standby数据库进行注册。
③. 查一下归档的完整性
SQL> select dest_id,thread#,max(sequence#) from v$archived_Log group by dest_id,thread# order by thread#;
DEST_ID THREAD# MAX(SEQUENCE#)
---------- ---------- --------------
1 1 92
2 1 92
2 standby数据库转换为主数据库
2.1: 执行以下sql语句停止redo应用服务
sql> alter database recover managed standby database cancel ;
2.2: 在standby数据库上执行以下sql语句发起故障转移操作
sql>alter database recover managed standby database finish force;
如果上面的sql执行失败,那么可以直接执行下面的sql
sql> alter database activate physical standby database;
但是这可能会导致部分数据丢失,执行完上面的sql语句后直接跳到步骤4打开数据库
2.3:执行以下的sql语句将standby数据库转换为主数据库
sql>alter database commit to switchover to primary;
2.4:执行以下sql语句打开转换后的主数据库
sql>alter database open ;
注意:如果之前以只读方式打开,必须重启数据库实例;
2.5 :执行以下sql查看转后的数据库角色
sql>select database_role from v$database;
database_role
--------------
primary
从上面的输出可以看出,standby数据库已经成功转换为主数据库
注意: 完成转换后需要立即执行一次数据库完全备份,然后将其他的standby数据库转换为日志应用模式;
------------------------------------------------------------------------------------------------------
failover将破坏dataguard模式,需要重新配置dataguard,也可以不用重新配置,一下是本人的实验虽然成功,但是有点小问题
3 : 恢复原有的主数据库为standby数据库
在没有任何数据丢失的failover的情况下,可以直接将原有的主数据库切换为 standby数据库,否则需要执行flashback database,将数据库恢复到
发生故障之前的时间点,再执行转换过程。尝试执行以下的步骤将原有的主数据库转换为standby数据库。
3.1 :执行以下sql,在现有的主数据库针对standby数据库创建控制文件
SQL> alter database create standby controlfile as '/tmp/standby.ctl';
Database altered.
3.2:将'/tmp/standby.ctl'控制文件传递到standby数据库默认的控制文件位置,确保与参数文件指定的路径和名称相同。
[oracle@node2 tmp]$ scp standby.ctl [email protected]:/oradata/node1
备份原来的控制文件
[oracle@node1 node1]$ mv control01.ctl control01.ctl.bak
[oracle@node1 node1]$ mv control02.ctl control02.ctl.bak
将创建的控制文件替换为现在用的控制文件
[oracle@node1 node1]$ cp standby.ctl control01.ctl
[oracle@node1 node1]$ cp standby.ctl control02.ctl
3.3: 将standby 数据库启动到mount模式
SQL> startup mount;
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.
Total System Global Area 839282688 bytes
Fixed Size 2257880 bytes
Variable Size 499125288 bytes
Database Buffers 335544320 bytes
Redo Buffers 2355200 bytes
Database mounted.
3.4: 执行以下sql将standby数据库设置为日志应用模式
sql>alter database recover managed standby database using current logfile disconnect from session ;
3.5: 查看数据库角色
sql>select database_role from v$database;
database_role
--------------
physical standby
从以上的输出可以看出,原有的主数据库已经成功转换为物理standb数据库。
ps:虽然成功也可以同步让然有点小问题,如果是生产库还不能这么玩;