欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Data Guard之逻辑备库的正常切换(logical standby switchover)

程序员文章站 2022-05-08 12:34:59
...

Oracle Data Guard 用来保护Oracle数据,可提供*别的数据保护和可用性的同时,使Oracle数据库保持最卓越的性能。它的运行遵循一个原则:传输重做数据,然后应用重做数据。

它分成两种实现方式,分别为逻辑备库(logical standby)和物理备库(physical standby),用于不同的应用场景。如逻辑备库用于数据库的读写分离,物理备库用于数据库异地灾备。

 

在一运行logical standby 模式的Data Guard 环境中,主库是RAC 数据库,备用库是单实例的数据库。

 

Oracle 提供了两种将逻辑备库转换为主库的方式,分别为灾难转换failover 和正常转换switchover

 

Data Guard 之逻辑备库的故障切换(failover) (链接:  http://mikixiyou.iteye.com/blog/1530120 )一文中,我们介绍了如何在主库出现故障时将逻辑备库转换为主库的操作方法。

 

在本文中,我们将介绍正常地将逻辑备库转换为主库的操作方法。

 

( miki 西游 @mikixiyou 文档:原文链接 http://mikixiyou.iteye.com/blog/1542922 )

 

有这样一种需求,将数据库从A 服务器迁移至B 服务器,使用logical standby 方式迁移。在迁移完成后,可以检查B 服务器上的主库是否满足应用要求。如果不能,可以快速切回去。这点是failover 方式无法做到的,也是数据备份与恢复方式无法实现的。

我们马上介绍如何将单实例的逻辑备用库转换成正常的主库,而RAC 的数据库又转换成逻辑备用库的操作过程。

第一步,我们分析主库和备用库的环境。

主库是多节点的RAC 数据库,备库是单实例的逻辑灾备库,操作系统版本都是一致的,使用数据库文件存储方式都是ASM 。这点避免了一些文件转换的麻烦。在逻辑备用库的配置中,建议采用一致的存储方式。

 

第二步,我们开始做逻辑备库切换准备工作。

先将主库上所有的数据库客户端连接关闭。这里采用一种最有效的方式,关闭数据库。

srvctl stop database -d xxxdb -o immediate

再将实例1 启动起来,禁用其他实例的线程

alter database disable thread 2;

因为备用库只有一个线程,所以主库也要限制。在主库RAC 切换成备用库后,可以再启动起来。

Oracle 对此做了解释,如下:

If the primary database is a RAC database, ensure that all but one instance are shut down, and the corresponding threads are disabled before initiating the switchover. Similarly, if the logical standby database is a RAC database, ensure that all instances except the one where SQL Apply is running are shut down, and the corresponding threads are disabled before initiating the switchover. You can reenable the threads and start the instances once the switchover operation has completed successfully. Although the instances are shut down, the role change will be automatically propagated to these instances when they are restarted.

 

第三步,检查主库上SWITCHOVER_STATUS 的状态值,这里会有两种值,分别是  TO STANDBY   SESSIONS ACTIVE 。如果是其他的值,这里就要暂停一下,解决掉这个问题才能继续下一步。

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS

--------------------

SESSIONS ACTIVE

 

第四步,将主库设置为logical standby 的切换准备阶段

SQL>  ALTER DATABASE PREPARE TO SWITCHOVER TO LOGICAL STANDBY;

Database altered.

检查主库上SWITCHOVER_STATUS 的状态值,应该是PREPARING SWITCHOVER

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS

--------------------

PREPARING SWITCHOVER

 

第五步,将逻辑备库设置为主库的切换准备阶段

SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO PRIMARY;

Database altered.

执行结束后,V$DATABASE.SWITCHOVER_STATUS 的值应该是PREPARING SWITCHOVER

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS

--------------------

PREPARING SWITCHOVER

 

第六步,在主库上查询切换状态字段SWITCHOVER_STATUS 的值

在备库上做了切换准备工作后,主库上切换状态字段值应该变成了TO LOGICAL STANDBY

SQL> r

  1* SELECT SWITCHOVER_STATUS FROM V$DATABASE

SWITCHOVER_STATUS

--------------------

TO LOGICAL STANDBY

注意,到这一步,我们还有放弃的机会。如果这时决定放弃转换,可以执行下面的操作。

在主库和备库上都执行这个SQL

ALTER DATABASE PREPARE TO SWITCHOVER CANCEL;

 

第七步,将主库转换成逻辑备用库

在主库上执行切换操作

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO LOGICAL STANDBY;

Database altered.

 

第八步,检查备库的切换状态字段值,正确的值是TO PRIMARY

在备库上执行这个SQL

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

 

SWITCHOVER_STATUS

--------------------

TO PRIMARY

 

第九步,将备库切换成主库

在备库上执行这个SQL

A LTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

到这一步,我们已经完成了切换工作。主库变成了备库,备库变成了主库,已经是一个新的data guard 环境。

但是,要使这个DATAGUARD 环境真正运行起来,主库和备库的初始化参数需要做一些修改。

将原来的备库上的初始化参数修改一下, 修改为

alter system set fal_client='' scope=memory;

alter system set fal_server='' scope=memory;

alter system set log_archive_dest_1='location=+VG2/' scope=memory;

alter system set log_archive_dest_2='SERVICE=SWITCH_READER LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=XXXDB' scope=memory;

 

将原来的主库上的初始化参数修改一下, 修改为

alter system set fal_client='SWITCH_STANDBY' scope=memory;

alter system set fal_server='SWITCH_PRIMARY' scope=memory;

alter system set log_archive_dest_1='LOCATION=+VG2/ VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=XXXdB' scope=memory;

alter system set log_archive_dest_2='LOCATION=+LOGVG/ VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=XXXDB' scope=memory;

新的备库,就是原来的主库,要加上standby logfile

ALTER DATABASE ADD STANDBY LOGFILE group 21 ('+VG2/standby_redo21.log')  SIZE 52428800 reuse;

ALTER DATABASE ADD STANDBY LOGFILE group 22 ('+VG2/standby_redo22.log')  SIZE 52428800 reuse;

ALTER DATABASE ADD STANDBY LOGFILE group 23 ('+VG2/standby_redo23.log')  SIZE 52428800 reuse;

 

 

        这种转换方式,可以用于数据库的数据迁移工作。

 

本文链接: http://mikixiyou.iteye.com/blog/1542922 欢迎转载,请注明出处和作者,谢谢合作。