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_name ,fal_client 和fal_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_client 和fal_server 的值,分别是mikidb_standby 和mikidb_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 的物理备库模式,也同步过去了新数据。
总而言之,这将是一个更加靠谱的数据库迁移方案。
但,我想,它还有是有缺陷的。有哪些缺陷呢?