Data Guard物理备库的通常切换

Data Guard物理备库的正常切换

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

它分成为逻辑备库(logical standby )和物理备库(physical standby) ,分别用在不同的应用场景中。

Oracle 10g  物理备库中,使用正常切换操作,可以将备库切换主库,而主库切换成备库,然后还能再切换回去。

它的应用场景包括数据库灾备的验证、数据库硬件维护的无缝切换、数据库换服务器的数据迁移等等。

这里顺便提一个案例,在以前数据迁移工作中,我使用数据库的备份和异地恢复,这样可以实现大数据库的异地迁移,并且切换时间也就几分钟。但该方案有一个缺点,如切换完成后,新环境出现其他故障如网络导致不能用,要再迁移回去则不可能了,因为新环境数据库已经写入数据。

但如果使用data gauard 来进行数据迁移,如果新环境不可用,则是可以快速切换回去的。

下面我就这种案例介绍一下物理备库的实现和切换过程。

 

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

 

第一部分,创建物理备库,实现 physical standby 模式

在主库上修改初始化参数,保护级别采用默认值即最大性能,重做日志传输方式采用ARCH  。这里是做数据迁移,如果是灾备需求,则需要设置成最大可用或最大保护,传输重做日志的方式为LGWR SYNC AFFIRM

alter system set log_archive_config='dg_config=(mikidb,mikidg)' scope=memory;

 

alter system set log_archive_dest_2='SERVICE=MIKIDB_STANDBY ARCH ASYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=MIKIDG' scope=memory;


主库的tnsnames.ora 文件中需要增加一个tnsname ,即log_archive_dest_2 中指定的mikidb_standby


mikidb_STANDBY =

   (DESCRIPTION =

     (ADDRESS_LIST =

       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.64.1)(PORT = 1521))

     )

     (CONNECT_DATA =

       (SID = mikidb)

     )

   )

 

在备库上修改初始化参数,设置db_unique_namefal_clientfal_server

如下:


*.db_unique_name='mikidg'

*.fal_client='mikidb_standby'

*.fal_server='mikidb_primary'


fal 用于探测主库和备库之间归档日志文件的间隔,称之为fetch archive log

另外,归档路径也做一个简单设置,用于保存从主库上传输过来的归档日志文件。


*.log_archive_config='dg_config=(mikidb,mikidg)'

*.log_archive_dest_1='LOCATION=+VG1/ valid_for=(all_logfiles,all_roles) db_unique_name=mikidg'


备库的tnsnames.ora 文件中需要增加两个tnsname ,即fal_clientfal_server 的值,分别是mikidb_standbymikidb_primary


mikidb_STANDBY =

   (DESCRIPTION =

     (ADDRESS_LIST =

       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.64.1)(PORT = 1521))

     )

     (CONNECT_DATA =

       (SID = mikidb)

     )

   )

mikidb_primary =

   (DESCRIPTION =

     (ADDRESS_LIST =

       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.89.1)(PORT = 1521))

     )

     (CONNECT_DATA =

       (SID = mikidb)

     )

   )


在主备库的初始化参数都设置好以后,我们在备库上恢复主库的备份,恢复使用控制文件需要主库特别生成,专门用于data guard 的备库应用。

rman 下执行backup current controlfile for standby ‘/tmp/ctl.standby’; 就可以。

恢复的数据文件备份集就使用已有的最新的备份集。

登录RMAN 管理工具界面,执行恢复操作。


rman target /

 

restore controlfile from '/tmp/ctl.standby';

sql ‘alter database mount’;

catalog start with ‘/backup/’;

restore database;

recover database;

 

恢复到出错后,退出。

再登录sqlplus  界面,启用备库重做日志不间断应用模式。

alter database recover managed standby database disconnect from session;

通常,主库新生成的数据就会源源不断地通过归档日志文件传输过来,达到了数据迁移的目的。

第二部分,主库和备库的角色互换

1 、关闭所有主库上的客户端连接,准备主库角色切换

2 、在主库上,将其切换成备库角色


SQL> alter database commit to switchover to physical standby;

Database altered.

SQL> shutdown immediate

ORA-01507: database not mounted

ORACLE instance shut down.


以备用模式启用原主库

 

SQL> startup nomount;

ORACLE instance started.

 

SQL> alter database mount standby database;

 

SQL> select name,open_mode,PROTECTION_MODE,DATABASE_ROLE from v$database;

 

 

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

 

 

3 、在备库上,切换成主库模式。


SQL> alter database commit to switchover to primary;

SQL> shutdown immediate;

ORA-01507: database not mounted

ORACLE instance shut down.

SQL> startup

SQL> alter system switch logfile;

System altered.

 

再将初始化参数按照第一部分做一些修改,就实现了新环境和老环境的对调。如果新环境出现了问题,咱们再切换一次,就让应用再次使用老环境了。即使新环境又新生成了数据,那么老环境也因为是data guard 的物理备库模式,也同步过去了新数据。

总而言之,这将是一个更加靠谱的数据库迁移方案。

但,我想,它还有是有缺陷的。有哪些缺陷呢?