我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

DATA GUARD物理STANDBY的FAILOVER切换

上一篇 / 下一篇  2007-12-02 00:00:00 / 个人分类:ORACLE

物理STANDBYFAILOVER切换会把当前的一个物理STANDBY切换为PRIMARY数据库。


m#~5A#R ^2x0

FAILOVER切换一般是PRIMARY数据库发生故障后的切换,这种情况是STANDBY数据库发挥其作用的情况。这种切换发生后,可能会造成数据的丢失。而且这个过程不是可逆的,DATA GUARD环境会被破坏。

由于PRIMARY数据库已经无法启动,所以FAILOVER切换所需的条件并不多,只要检查STANDBY是否运行在最大保护模式下,如果是的话,需要将其置为最大性能模式,否则切换到PRIMARY角色也无法启动。

为了模拟FAILOVER的特点,首先在主库上运行一个比较大的事务,然后通过SHUTDOWN ABORT来关闭PRIMARY数据库:

[oracle@yangtk ~]$ sqlplus yangtk/yangtk

SQL*Plus: Release 11.1.0.6.0 - Production on Mon Nov 5 13:11:14 2007

Copyright (c) 1982, 2007, Oracle. All rights reserved.

ITPUB个人空间s6C'D_[)C,C
Connected to:
L(To~0G0Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - ProductionITPUB个人空间 HM;@\(Ka,{4},rP
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> CREATE TABLE T_FAILOVER (ID NUMBER);

Table created.

SQL> DECLARE ITPUB个人空间I.C] ^_y8^fK
2 V_JOB NUMBER;
3Ofq7I N#xE!NB [:y0 3 BEGIN
M_f%X M2y*ta0 4 DBMS_JOB.SUBMIT(V_JOB, ITPUB个人空间 JX0c!O*Z']:d@
5 'BEGIN FOR I IN 1..10000000 LOOP INSERT INTO T_FAILOVER VALUES (I); COMMIT; END LOOP; END;', ITPUB个人空间#B{dg+]F(r.XAk
6 SYSDATE);
%RGR|5z[nN;}| L0 7 COMMIT;ITPUB个人空间T'H7b@V!c2t3G5h
8 END;ITPUB个人空间o'D)t6wn8N1i cv y.aH+J
9 /

PL/SQL procedure successfully completed.

SQL> ALTER SYSTEM SWITCH LOGFILE;

System altered.

SQL> CONN / AS SYSDBAITPUB个人空间(n iz3m;do [-[(g_"g)i
Connected.
WW R9kEu\0SQL> ALTER SYSTEM SWITCH LOGFILE;

System altered.

SQL> SHUTDOWN ABORTITPUB个人空间`/?[IaB
ORACLE instance shut down.

下面登陆STANDBY数据库:

[oracle@yangtk2 ~]$ sqlplus "/ as sysdba"

SQL*Plus: Release 11.1.0.6.0 - Production on Mon Nov 26 19:57:11 2007

Copyright (c) 1982, 2007, Oracle. All rights reserved.


E`'?G7\Q0Connected to:
*v(i5aQK}HB%G!n0Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
*m-P*O~4IxOC/X0With the Partitioning, OLAP, Data Mining and Real Application Testing options

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

no rows selected

检查是否存在GAP,如果存在拷贝相应的归档到STANDBY数据库,并注册,再次执行上面的查询,直到上面的查询不返回记录。

PRIMARY数据库和其他的数据库中检查是否存在本地没有的归档文件,拷贝并注册这些文件:

SQL> SELECT UNIQUE THREAD#, MAX(SEQUENCE#) OVER(PARTITION BY THREAD#) LAST FROM V$ARCHIVED_LOG;

THREAD# LAST
b{0s9{7F%P*A;NH0---------- ----------
H},~%f4B&op1T&`q$F/I*s9J0 1 228

把所有的归档都拷贝到STANDBY站点,使用ALTER DATABASE REGISTER PHYSICAL LOGFILE语句进行注册,然后停止应用归档:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

Database altered.

下面将STANDBY数据库切换为PRIMARY数据库:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;

Database altered.

SQL> SELECT DATABASE_ROLE FROM V$DATABASE;

DATABASE_ROLE
D+i"Jh-s} n0----------------ITPUB个人空间4@ u3e @!~}_R Q YH
PHYSICAL STANDBY

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

Database altered.

SQL> ALTER DATABASE OPEN;

Database altered.

检查数据库是否已经切换成功:

SQL> SELECT DATABASE_ROLE FROM V$DATABASE;

DATABASE_ROLE
)f+J"v+Q$d:?Kof3w!~S0----------------
8DE/hKhu0PRIMARY

至此,FAILOVER切换完成。这个时候应该马上对新的PRIMARY数据库进行备份。

归档是否都拷贝到本地,和志传输的方式,决定FAILOVER过程是否会丢失数据。这个例子中FAILOVER切换没有造成数据的丢失:

SQL> SELECT COUNT(*) FROM YANGTK.T_FAILOVER;

COUNT(*)
9_J u#t cD0----------ITPUB个人空间"B VY/a z y
77880

重启原来的PRIMARY数据库:

SQL> STARTUP
P5?K yeU u0ORACLE instance started.

Total System Global Area 267825152 bytes
/X%y)Mp4P-SsF0Fixed Size 1299316 bytes
&|*l.v0s5p S0Variable Size 167775372 bytesITPUB个人空间e6E:p Sdc:N-|@9cO
Database Buffers 96468992 bytesITPUB个人空间9B_ B-{*[C#{,{ nj)H
Redo Buffers 2281472 bytes
&|i@ iY DA!^0Database mounted.
b cs-@3S P0Database opened.ITPUB个人空间 QB;CT~ Z-Nz
SQL> SELECT COUNT(*) FROM YANGTK.T_FAILOVER;

COUNT(*)ITPUB个人空间l|:s e{l5c
----------
tC \)awYk _g(E0 77880


TAG:

casoul的个人空间 引用 删除 casoul   /   2008-08-01 18:04:54
5
hcl的个人空间 引用 删除 hcl   /   2008-05-18 21:04:50
5
引用 删除 Guest   /   2008-05-18 21:04:48
5
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar