Oracle DataGuard学习笔记(3)物理Standby主从角色切换

Oracle DataGuard学习笔记(3)物理Standby主从角色切换


    关于Oracle DataGuard的主从角色切换,可以参考官方在线文档:
    http://docs.oracle.com/cd/E11882_01/server.112/e41134/role_management.htm#SBYDB00615


1.主备库角色切换方式:
    主备库角色切换有份两种:
    Switchovers: 一般是用户有计划的手工触发角色切换,主库切换为备库,被库切换为主库.
    Failover:    一般是数据库故障短期无法恢复时,需要切换备库为主库.


2.主备库角色切换前的准备工作.
    检查下数据库的初始化参数,归档模式等等是否都正确配置。


    在主库上验证主备传输是否有错误或裂隙.
    select status, gap_status from v$archive_dest_status where dest_id = 2;


    在备库上执行,查看日志应用情况.
    select name, value, datum_time from v$dataguard_stats;


3.Switchovers切换.
    (1).在主库检查是否可以切换(primary database).
    select switchover_status from v$database;
    结果为TO STANDBY或SESSIONS ACTIVE时表示可以转换为standby role.


    (2).在原主库执行切换语句(primary database),切换为备库(standby database).
    alter database commit to switchover to physical standby with session shutdown;
    shutdown abort;
    startup nomount;
    alter database mount standby database;
    alter database open read only;


    (3).在原备库上执行切换语句(standby database),切换为主库(primary database).
    alter database commit to switchover to primary with session shutdown;
    alter database open;


    (4).在新备库上启动redo实时应用(standby database).
    alter database recover managed standby database using current logfile disconnect from session;


    (5).查看切换是否成功.
    select process,status,thread#,sequence#, block#, blocks from v$managed_standby;
    ***** 主备库切换后,如果主机的IP调换一下,则客户端的TNS连接不需要修改即可连接新的主库.


4.Failover切换.
    (1).将备库保护级别设置为最高性能模式
    startup nomount;
    alter database mount standby database;
    alter database open read only;
    alter databse set standby database to maximize performance;  -- standby database


    (2).如果主库无法打开但可以加载(mount),则将主库的日志刷到备库,在主库执行语句:
    alter system flush redo to ;  -- primary database
    target_db_name即备库的DB_UNIQUE_NAME,如果语句可以成功执行,则可以实现数据零丢失.
    alter system flush redo to 'sales_dg';


    (3).如果主库无法加载(mount):
    查找备库的视图v$archived_log,找到最大的归档日志序列.
    select unique thread# as thread, max(sequence#) over (partition by thread#) as last from v$archived_log;
    select thread#, sequence#, name from v$archived_log where thread# = 1 and sequence# = 33;


    If possible, copy the most recently archived redo log file for each primary database redo thread to the standby database if it does not exist there, and register it. This must be done for each redo thread.
    如果可以的话,将主库中最近的归档日志复制到备库,如果备库中没有这个文件,这在备库中注册文件,每个thread都要这样做.zai
    alter database register physical logfile 'filespec1';   -- standby database


    (4).解决归档日志裂隙:
    select thread#, low_sequence#, high_sequence# from v$archive_gap;   -- standby database


    如果可以的话,将主库中最近的归档日志复制到备库,如果备库中没有这个文件,这在备库中注册文件,每行裂隙都需要处理.
    alter database register physical logfile 'filespec1';    -- standby database
    如果全部都能解决,则可以不丢失数据.


    (5).停止redo实时应用:
    alter database recover managed standby database cancel;  -- standby database


    (6).执行恢复操作:
    alter database recover managed standby database finish;  -- standby database
    如果出现错误则继续(3),(4)步骤,解决归档和裂隙.


    如果问题无法解决,则执行以下语句强制激活数据库(将会丢失数据),并打开数据库,
    alter database activate physical standby database;       -- standby database
    alter database open;
    如果强制激活数据库,此时已切换为主库,不需要后续的切换动作.


    (7).切换角色,将备库切换为主库:
    如果前面的归档恢复操作正常,则可以进行下面的动作.
    查看是否可以角色切换,switchover_status状态为TO PRIMARY或SESSIONS ACTIVE时表示可以切换.
    select database_role,switchover_status from v$database;


    将备库切换为主库,打开数据库.
    alter database commit to switchover to primary with session shutdown;
    alter database open;


    (8).备份新主库.


    (9).如果有其它备库则启用redo实时应用:
    alter database recover managed standby database using current logfile disconnect from session;  -- standby database

你可能感兴趣的:(Oracle,DataGuard)