DG分为主库和备库,我们也猜测其属于primary与standby 之间的互动,那么在primary 和standby 之间的切换:
然而切换又分为switchover和failovers,前者是无损切换,不会丢失数据,而后者则有可能会丢失数据,并且切换后原primary数据库也不再是该data guard配置的一部分了.。
针对不同standby(逻辑或物理)的处理方式也不尽相同。
角色转换前的准备工作:
1检查各数据库的初始化参数,主要确认对不同角色相关的初始化参数都进行了正确的配置。
2确保可能成为primary数据库的standby服务器已经处于archivelog模式。
3确保standby数据库的临时文件存在并匹配primary数据库的临时文件
4确保standby数据库的RAC实例只有一个处于open状态。(对于rac结构的standby数据库,在角色转换时只能有一个实例startup。其它rac实例必须统统shutdown,待角色转换结束后再startup)
Switchover;
无损转换,通常是用户手动触发或者有计划的让其自动触发,比如硬件升级,软件升级之类的。通常它给你带来的工作量非常小并且都是可预计的。其执行分两个阶段,第一步, primary数据库转换为tandby角色,第二步,standby数据库(之一)转换为primary角色,primary和standby只是简单的角色互换,
Failover:
不可预知原因导致primary 数据库故障并且短期内不能恢复就需要failover。如果是这种切换那你就要小心点了,有可能只是虚惊一场,但如果运气不好又没有完备的备份恢复策略而且primary 数据并非处于最大数据保护或最高可用性模式地话,这种情况下呢丢失数据有可能是难免的,并且如果其故障未能修复,那它甚至连快速修复成为standby 的机会也都失去了;
在执行failover 之前,尽可能将原primary 数据库的可用redo 都复制到standby 数据库。
注意,如果要转换角色的standby处于maximum protection模式,需要你首先将其切换为maximum performance模式
SQL> ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZEPERFORMANCE;
等standby 切换为新的primary 之后,你可以再随意更改数据库的保护模式。
maximum protection模式需要确保绝无数据丢失,因此其对于提交事务对应的redo 数据一致性要求非常高,另外,如果处于maximum protection模式的primary数据库仍然与standby数据库有数据传输,此时alter database语句更改standby数据库保护模式会失败,这也是由maximum protection 模式特性决定的。
一、物理standby的 Switchover
注意操作步骤的先后,很关键的哟。
1、检查是否支持switchover 操作--primary 数据库操作。
2、登陆primary 数据库,查询v$database 视图的switchover_status 列。
情况(一):存在gap问题
解决物理standby Gap问题
SQL> SELECT * FROM V$ARCHIVE_GAP;
THREAD#LOW_SEQUENCE# HIGH_SEQUENCE#
----------- ------------- --------------
1 7 10
--到主库查询,确认一下:
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1AND DEST_ID=1 AND SEQUENCE# BETWEEN 7 AND 10;
NAME
--------------------------------------------------------------------------------
/primary/thread1_dest/arcr_1_7.arc
/primary/thread1_dest/arcr_1_8.arc
/primary/thread1_dest/arcr_1_9.arc
--把这些归档copy到物理standby,并使用ALTERDATABASE REGISTER LOGFILE应用这些归档:
SQL> ALTER DATABASE REGISTER LOGFILE'/physical_standby1/thread1_dest/arcr_1_7.arc';
SQL> ALTER DATABASE REGISTER LOGFILE'/physical_standby1/thread1_dest/arcr_1_8.arc';
SQL> ALTER DATABASE REGISTER LOGFILE '/physical_standby1/thread1_dest/arcr_1_9.arc';
情况(二):没有gap
SQL>selects witchover_status from v$database;
SWITCHOVER_STATUS
----------------------------------------
TO STANDBY
如果该列值为"TO STANDBY"则表示primary数据库支持转换为standby角色,否则的话你就需要重新检查一下Data Guard配置,比如看看LOG_ARCHIVE_DEST_n之类参数值是否正确有效等等。
2、启动switchover --primary 数据库操作
首先将primary 转换为standby 的角色,通过下列语句:
情况一(1)没有出现错误ORA-01093
SQL> alter database commit to switchoverto physical standby
Database altered.
01:57:06 SQL>shutdown immediate;
ORA-01092: ORACLE instance terminated. Disconnection forced
SQL>startup mount;
ORACLE instance started.
Total System Global Area 417546240bytes
Fixed Size 2228944bytes
Variable Size 289410352bytes
Database Buffers 121634816bytes
Redo Buffers 4272128bytes
Database mounted.
情形二:出现ORA-01093错误的解决办法
(
17:05:14sys@felix SQL>alter database commit to switchover to physical standby;
alter databasecommit to switchover to physical standby
*
ERROR at line1:
ORA-01093:ALTER DATABASE CLOSE only permitted with no sessions connected
17:07:36sys@felix SQL>alter database commit to switchover to physical standby withsession shutdown;
Databasealtered.
)
语句执行完毕后,primary 数据库将会转换为standby 数据库,并自动备份控制文件到trace
4、检查是否支持switchover 操作--待转换standby 数据库操作
待原primary 切换为standby 角色之后,检查待转换的standby 数据库switchover_status 列,看看是否支持角色转换。
23:10:48 SQL>select status from v$instance;
STATUS
------------------------
MOUNTED
23:11:09 SQL>alter database open;
Database altered.
情况(1):
23:11:21 SQL>select switchover_status from v$database;
SWITCHOVER_STATUS
----------------------------------------
SWITCHOVERLATENT
(这种情况说明是需要进行redo应用,解决办法:开启MRP)
23:11:29 SQL>
23:13:51 SQL>alter database commit to switchover toprimary;
alter databasecommit to switchover to primary
*
ERROR at line 1:
ORA-16139: mediarecovery required
23:14:49 SQL>alter database recover managed standby database disconnect from session;
Database altered.
23:22:48 SQL> select database_role,switchover_status from v$database;
DATABASE_ROLE SWITCHOVER_STATUS
------------------------------------------------------------------------
PHYSICALSTANDBY SWITCHOVERPENDING
(可以注意到,状态变了,说明正在应用。。。。再等一下)
23:23:02 SQL>select database_role,switchover_status from v$database;
DATABASE_ROLE SWITCHOVER_STATUS
------------------------------------------------------------------------
PHYSICALSTANDBY SWITCHOVERPENDING
23:23:20 SQL>r
1* select database_role,switchover_status from v$database
DATABASE_ROLE SWITCHOVER_STATUS
------------------------------------------------------------------------
PHYSICALSTANDBY TO PRIMARY
(ok,到这里说明已经完全应用了,开始进行switchover standby库)
23:24:53 SQL>alter database commit to switchover to primary;
Database altered.
23:28:38 SQL>select status from v$instance;
STATUS
------------------------
MOUNTED
(细心的话可以注意到
(1)情况1,如果执行前standby数据库是打开状态的,执行切换备库命令之后,备库是处于mount状态下,然而主库执行切换命令后是直接关闭了数据库
(2)情况二:
注意:待转换的物理standby可以处于mount模式或open read only模式,但不能处于open read write模式。
情况(二):
23:23:20 SQL>r
1* select database_role,switchover_status from v$database
DATABASE_ROLE SWITCHOVER_STATUS
------------------------------------------------------------------------
PHYSICALSTANDBY TO PRIMARY
这种情形时最容易的,直接执行就可以成功:
23:24:53 SQL>alter database commit to switchover to primary;
Database altered.
6、完成转换,打开新的primary 数据库
SQL>alterdatabase open;
Database altered.
注:如果数据库处于openread-only 模式的话,需要先shutdown然后直接startup即可。
7.验证新的primary:
SQL>select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
36
SQL>r
1* alter system switch logfile
System altered.
Ok,主备库相同,说明切换成功!!
然后启动:MRP
**********************************
查看是否启用MRP
13:45:40 SQL>select process, status, thread#, sequence#, block#, blocks fromv$managed_standby;
PROCESS STATUS THREAD# SEQUENCE# BLOCK# BLOCKS
------------------ ---------------------------------- ---------- ---------- ----------
ARCH CONNECTED 0 0 0 0
ARCH CONNECTED 0 0 0 0
ARCH CLOSING 1 53 4096 1848
ARCH CLOSING 1 54 1 2
RFS IDLE 0 0 0 0
RFS IDLE 1 55 56255 1
RFS IDLE 0 0 0 0
MRP0 APPLYING_LOG 1 55 56255 102400
8 rows selected.
13:47:49 SQL>alter database recover managed standby database cancel;
Database altered.
13:48:23 SQL>select process, status, thread#, sequence#, block#, blocks fromv$managed_standby;
PROCESS STATUS THREAD# SEQUENCE# BLOCK# BLOCKS
------------------ ---------------------------------- ---------- ---------- ----------
ARCH CONNECTED 0 0 0 0
ARCH CONNECTED 0 0 0 0
ARCH CLOSING 1 53 4096 1848
ARCH CLOSING 1 54 1 2
RFS IDLE 0 0 0 0
RFS IDLE 1 55 56300 1
RFS IDLE 0 0 0 0
7 rows selected.
13:48:35 SQL>alter database recover managed standby database disconnect fromsession;
Database altered.
13:52:35 SQL>select process, status, thread#, sequence#, block#, blocks fromv$managed_standby;
PROCESS STATUS THREAD# SEQUENCE# BLOCK# BLOCKS
------------------ ---------------------------------- ---------- ---------- ----------
ARCH CONNECTED 0 0 0 0
ARCH CONNECTED 0 0 0 0
ARCH CLOSING 1 53 4096 1848
ARCH CLOSING 1 54 1 2
RFS IDLE 0 0 0 0
RFS IDLE 1 55 56589 1
RFS IDLE 0 0 0 0
MRP0 WAIT_FOR_LOG 1 55 0 0
8 rows selected.
查看当启用实时查询时会发现PROCESS列的mrp行的status状态是:APPLYING_LOG
当未启用实时查询时PROCESS列的mrp行的status状态是:WAIT_FOR_LOG
*******************************************************