Oracle数据库 ADG主备切换

本文详细介绍了OracleDataguard中的Switchover(无损切换)和Failover(灾难性恢复)过程,包括步骤、检查点和注意事项。着重于物理Standby模式下的角色转换以及数据同步的验证。

前言

Oracle Dataguard的角色转换包含两类:Switchover和Failover。Switchover指主备之间角色转换,主库降为备库,备库升级为主库。而failover则是指主库出现问题时,备库切换为主库。
正文
一、物理Standby的Switchover(无损切换)

Switchover,无损切换一般是用用户手动触发或有计划的进行触发来进行主从库切换,比如软硬件升级等需求。
其执行分为两个阶段。第一步,primary库转换为standby角色;第二步,standby库转换为primary角色。

1.在主库(ruiadg1)执行
查询此时数据库的角色:

SQL> select name,DATABASE_ROLE from v$database;

NAME      DATABASE_ROLE
--------- ----------------
RUIADG    PRIMARY

检查归档日志有没有中断:

SQL> select status, GAP_STATUS from v$archive_dest_status where dest_id=2;

STATUS    GAP_STATUS
--------- ------------------------
VALID      NO GAP

检查Primary库是否支持Switchover操作:

SQL> select switchover_status from v$database;

SWITCHOVER_STATUS
--------------------
TO STANDBY

若得到“SESSION ACTIVE”或“TO STANDBY”信息就表明Primary库支持转换为Standby角色,否则就需要检查参数文件。

切换当前主库为备库:
切换完成后,数据库会被关闭

SQL> alter database commit to switchover to physical standby;

启动数据库到mount状态:
当前已经变成备库

SQL> startup mount

查询切换状态:
此时状态发生变化

SQL> select switchover_status from v$database;

SWITCHOVER_STATUS
--------------------
RECOVERY NEEDED

查询此时数据库的角色:
角色为:PHYSICAL STANDBY

SQL> select DATABASE_ROLE from v$database;

DATABASE_ROLE
----------------
PHYSICAL STANDBY

2.在备库(ruiadg2)执行
查数据库的角色:
在切换之前数据库的角色是:PHYSICAL STANDBY

SQL> select name,DATABASE_ROLE from v$database;

NAME      DATABASE_ROLE
--------- ----------------
RUIADG    PHYSICAL STANDBY

检查Standby库是否支持转换为Primary角色:
此时因为原来的主库已经切换到的备库,所以这个备库可以切换到主库了,状态为:TO PRIMARY

SQL> select switchover_status from v$database;

SWITCHOVER_STATUS
--------------------
TO PRIMARY

此时待转换的Standby库switchover_status列值应该是“TO PRIMARY“如果不是就需要检查初始化参数文件。

切换备库到主库:
一旦切换到主库,数据库此时为mount状态

SQL> alter database commit to switchover to primary;

查数据库的角色:

SQL> select name,DATABASE_ROLE from v$database;

NAME      DATABASE_ROLE
--------- ----------------
RUIADG      PRIMARY

打开数据库:

SQL> alter database open;

3.在新的备库(ruiadg1)执行
打开新的备库到只读:

SQL> alter database open;

在新的备库开启日志的应用:(启用Real-Time)

SQL> alter database recover managed standby database using current logfile disconnect from session;

再次查询数据库的打开模式:
是:READ ONLY WITH APPLY

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ ONLY WITH APPLY

主备切换完成,在新的主库做数据变更,在新的备库做数据校验,是否同步。

4.主备库同步检查
在主库(ruiadg2)建表并插入数据

SQL> create table test1 (name varchar(20),age int);
SQL> insert into test1 values ('rui',20);
SQL> commit;

在主库(ruiadg2)手动切log

SQL> alter system switch logfile;

在备库(ruiadg1)查看数据同步状况

在主备库查看log是否同步

SQL>select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)
--------------

此处检查两个结果值是否一致。
也可以直接到/home/oracle/arch_log下查看新生成的归档日志是否一致。

 
二、物理Standby的Failover(灾难性恢复)

Failover一般表示Primary数据库瘫痪或至少无法启动,这种转换已不能在Primary数据库上做任何操作,只要更改Standby数据库的角色为primary

注意:
1)Failover之后原primary数据库默认不再是Data Guard配置的一部分。
2)对于多Standby的情況,其他standby数据库不直接参与Failover的过程,因此这些数据库不需要做任何操作。
3)一般情況下,新的primary数据库配置后,要建立新的Standby数据库。

1.在主库(ruiadg2)执行
把主库关闭,模拟为主库损坏:

SQL> shutdown immediate;

2.在备库(ruiadg1)执行
检查确认是否有日志没有同步:

SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;

no rows selected

沒有返回结果就说明归档日志是连续的。
如果此查询有记录,需要把这些日志从主库拷贝到备库,并注册到数据库(加入到数据字典)中:

SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'xxx';

查询日志是否应用到最新状态:

SQL> select distinct thread#,applied,max(sequence#) over(partition by thread#) a from v$archived_log;

   THREAD#      APPLIED    A
---------- ----------
         1        YES    44

查看主备库日志序列号是否一致,若无法查询主库,就只能使用当前的归档日志文件了。

在备库做失败切换:

SQL> alter database recover managed standby database finish ;

SQL> alter database recover managed standby database finish force;

Force关键字会停止当前活动的RFS进程,以便立即执行Failover。

切换备库的角色为primary:

SQL> alter database commit to switchover to primary;

启动新的主库(ruiadg1):

SQL> alter database open;

查看新主库的当前角色:

SQL> select name,DATABASE_ROLE from v$database;

NAME      DATABASE_ROLE
--------- ----------------
RUIADG    PRIMARY

3.Failover后的检查

将恢复后的原故障主库调整为备库

启动恢复后的原主库:

SQL> startup

说明:
如果此时在主库插入数据,然后手动切换log,会发现archive log会传至备库,但是未被应用。
而且进行如下查询,结果如下:

SQL> select name,DATABASE_ROLE from v$database;

NAME      DATABASE_ROLE
--------- ----------------
RUIADG    PRIMARY

SQL> select status, GAP_STATUS from v$archive_dest_status where dest_id=2;

STATUS    GAP_STATUS
--------- ------------------------
ERROR     RESOLVABLE GAP

SQL> select switchover_status from v$database;

SWITCHOVER_STATUS
--------------------
FAILED DESTINATION

SQL>  alter database commit to switchover to physical standby;
 alter database commit to switchover to physical standby
*
ERROR at line 1:
ORA-16416: No viable Physical Standby switchover targets available

正确处理方式如下:

--启动数据库至nomount状态
SQL> shutdown immediate

SQL> startup nomount

--同步数据
$  rman target sys/rui@ruiadg1 auxiliary sys/rui@ruiadg2

RMAN> DUPLICATE TARGET DATABASE for standby FROM ACTIVE DATABASE nofilenamecheck;

--启动数据库
SQL> alter database open;

SQL> alter database recover managed standby database disconnect from session;

--查看数据库当前角色
SQL> select name,DATABASE_ROLE from v$database;

NAME      DATABASE_ROLE
--------- ----------------
RUIADG    PHYSICAL STANDBY

4.数据同步测试
在主库(ruiadg1)建表并插入数据

SQL> create table test1 (name varchar(20),age int);
SQL> insert into test1 values ('rui',23);
SQL> commit;

在主库(ruiadg1)手动切log

SQL> alter system switch logfile;

在备库(ruiadg2)查看数据同步状况

在主备库查看log是否同步

SQL>select max(sequence#) from v$archived_log;

经测试,可实现数据同步

### Oracle ADG 切换步骤及常用命令 Oracle Active Data Guard (ADG) 提供了高可用性和灾难恢复的解决方案,切换是其核心功能之一。以下是详细的切换过程及相关命令: #### 一、切换前检查 在进行切换之前,必须确保系统状态正常,避免切换失败或数据丢失。 1. **检查传输通道和GAP** 确保库和库之间的日志传输没有中断。 ```sql SQL> show parameter log_archive_dest_state_2; ``` 如果存在GAP,可以使用以下命令应用缺失的日志: ```sql SQL> alter database recover managed standby database using current logfile disconnect; ``` 2. **检查延迟时间** 确认库之间的延迟是否在可接受范围内。 ```sql SQL> select sequence#, applied, archived from v$archived_log order by sequence# desc; ``` 3. **检查库的切换状态** 查询库的 `SWITCHOVER_STATUS`,确保其值为 `TO STANDBY` 或 `SESSIONS ACTIVE`。 ```sql SQL> select name, open_mode, switchover_status from v$database; ``` #### 二、开始切换 完成上述检查后,可以开始切换。 1. **切换库** 在库上执行以下命令,将切换库。 ```sql SQL> alter database commit to switchover to physical standby with session shutdown; ``` 2. **重启原库到MOUNT状态** 关闭并重启原库至MOUNT状态。 ```bash [oracle@primarynode dbs]$ shutdown immediate [oracle@primarynode dbs]$ startup mount ``` 3. **查询库的切换状态** 再次确认库的切换状态。 ```sql SQL> select switchover_status from v$database; ``` 4. **切换库** 在库上执行以下命令,将切换库。 ```sql SQL> alter database commit to switchover to primary; ``` 5. **打开新库** 打开新的库以使其处于OPEN状态。 ```sql SQL> alter database open; ``` 6. **在新库启动MRP进程** 在原来的库(现在作为库)上启动MRP进程。 ```sql SQL> alter database recover managed standby database using current logfile disconnect; ``` #### 三、切换后检查 切换完成后,需要对库的状态进行验证。 1. **检查进程情况** 确认库的进程是否正常运行。 ```sql SQL> select process, status, thread#, sequence# from v$managed_standby; ``` 2. **检查库的日志传输通道** 确保库的日志传输通道没有错误。 ```sql SQL> show parameter log_archive_dest_state_2; ``` 3. **检查库的传输和应用延迟** 验证库的日志传输和应用是否正常。 ```sql SQL> select sequence#, applied, archived from v$archived_log order by sequence# desc; ``` --- ### 常用命令总结 | 功能 | 命令 | |------|------| | 查询切换状态 | `select name, open_mode, switchover_status from v$database;`[^3] | | 切换库为库 | `alter database commit to switchover to physical standby with session shutdown;`[^4] | | 切换库为库 | `alter database commit to switchover to primary;`[^5] | | 打开数据库 | `alter database open;`[^3] | | 启动MRP进程 | `alter database recover managed standby database using current logfile disconnect;`[^5] | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值