10g Data Guard physical standby的主备库角色转换测试(switchover & failover)

1、角色转换前的准备工作
1)主库上确认fal_server、db_file_name_convert、log_file_name_convert、standby_file_management、log_archive_dest_n的设置
fal_server=orcldg
db_file_name_convert='E:\oracle\product\10.2.0\oradata\ORCLDG\', 'E:\oracle\product\10.2.0\oradata\ORCL\'
log_file_name_convert='E:\oracle\product\10.2.0\oradata\ORCLDG\', 'E:\oracle\product\10.2.0\oradata\ORCL\'
standby_file_management=auto
SQL> show parameter log_archive_dest

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1                   string      location=E:\oracle\product\10.2.0\arch valid_for=(all_logfiles,all_roles) db_unique_name=ORCL
log_archive_dest_2                   string      service=7502 arch valid_for=(online_logfiles,primary_role) db_unique_name=ORCLDG

2)在主库创建standby redo log
alter database add standby logfile 'E:\oracle\product\10.2.0\oradata\ORCL\DGREDO01.log' size 50M;
alter database add standby logfile 'E:\oracle\product\10.2.0\oradata\ORCL\DGREDO02.log' size 50M;
alter database add standby logfile 'E:\oracle\product\10.2.0\oradata\ORCL\DGREDO03.log' size 50M;
alter database add standby logfile 'E:\oracle\product\10.2.0\oradata\ORCL\DGREDO04.log' size 50M;

3)备库上确认fal_server、db_file_name_convert、log_file_name_convert、standby_file_management、log_archive_dest_n的设置
fal_server=orcl
db_file_name_convert='E:\oracle\product\10.2.0\oradata\ORCL\', 'E:\oracle\product\10.2.0\oradata\ORCLDG\'
log_file_name_convert='E:\oracle\product\10.2.0\oradata\ORCL\', 'E:\oracle\product\10.2.0\oradata\ORCLDG\'
standby_file_management=auto
SQL> show parameter log_archive_dest

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1                   string      location=E:\oracle\product\10.2.0\arch2 valid_for=(all_logfiles,all_roles) db_unique_name=ORCLDG
log_archive_dest_2                   string      service=7501 arch valid_for=(online_logfiles,primary_role) db_unique_name=ORCL

4)备库创建online redo log
原先data guard刚配置好的时候,备库中只是在控制文件中记录了online redo log的信息,但是实际磁盘上并没有online redo log,在备库执行恢复的时候会去检测并创建,摘录alert日志如下:

Thu Mar 06 10:04:13 2014
alter database recover managed standby database disconnect from session
MRP0 started with pid=13, OS id=2684
Managed Standby Recovery not using Real Time Apply
Thu Mar 06 10:04:19 2014
Errors in file e:\oracle\product\10.2.0\admin\orcldg\bdump\orcldg_mrp0_2684.trc:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDG\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

Thu Mar 06 10:04:19 2014
Errors in file e:\oracle\product\10.2.0\admin\orcldg\bdump\orcldg_mrp0_2684.trc:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDG\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

Clearing online redo logfile 1 E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDG\REDO01.LOG
Clearing online log 1 of thread 1 sequence number 36
Thu Mar 06 10:04:19 2014
Errors in file e:\oracle\product\10.2.0\admin\orcldg\bdump\orcldg_mrp0_2684.trc:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDG\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

Thu Mar 06 10:04:19 2014
Completed: alter database recover managed standby database disconnect from session
Thu Mar 06 10:04:20 2014
Clearing online redo logfile 1 complete


5)确保备库处于archivelog和force logging模式
SQL> select log_mode,force_logging from v$database;
 
LOG_MODE     FORCE_LOGGING
------------ -------------
ARCHIVELOG   YES

6)确保备库存在和主库一致的临时文件
主库:
SQL> select name from v$tempfile;
 
NAME
------------------------------------------------------
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEMP01.DBF

备库:
SQL> select name from v$tempfile;
 
NAME
------------------------------------------------------
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDG\TEMP01.DBF

2、switchover(主库和备库角色互换,一般是主库在硬件升级或软件升级的时候进行switchover)
1)关闭备库,打开主库,并在主库上执行一些变更:
startup mount
alter system set log_archive_dest_2='service=7502 arch valid_for=(online_logfiles,primary_role) db_unique_name=ORCLDG' scope=spfile;
alter database set standby database to maximize performance;--现在data guard是最大性能保护模式
alter database open;
SQL> select * from hr.test;

        ID
----------
         1
         2
         3
         4

SQL> insert into hr.test values(5);

已创建 1 行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

在主库归档日志目录下产生一个归档日志,在备库上没有

SQL> insert into hr.test values(6);--id=6这条数据还在联机重组日志中

已创建 1 行。

SQL> commit;

提交完成。

2)主库上检查是否支持switchover,如果v$database.switchover_status列为to standby表示支持,不然就要重新检查下data guard的配置

SQL> select database_role,open_mode,switchover_status from v$database;

DATABASE_ROLE    OPEN_MODE  SWITCHOVER_STATUS
---------------- ---------- --------------------
PRIMARY          READ WRITE SESSIONS ACTIVE

状态是sessions active,看联机文档的描述:
If the value in the SWITCHOVER_STATUS column is SESSIONS ACTIVE, perform the 
steps described in Section A.4, "Problems Switching Over to a Standby Database" on 
page A-4 to identify and terminate active user or SQL sessions that might prevent a 
switchover from being processed. If, after performing these steps, the SWITCHOVER_
STATUS column still displays SESSIONS ACTIVE, you can successfully perform a 
switchover by appending the WITH SESSION SHUTDOWN clause to the ALTER 
DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY statement 
described in Step 2.

--不过我当前是没有其他session连着的,不知道为什么是显示这个状态,不过可以使用with session shutdown这个选项

3)将主库转换为备库
SQL> alter database commit to switchover to physical standby with session shutdown;
alter database commit to switchover to physical standby with session shutdown
*
第 1 行出现错误:
ORA-16416: 切换目标与主目标不同步

因为我故意制造了主库和备库的日志间隙,备库重新同步后,应该没问题,可以顺利切换:
备库:
SQL> alter database recover managed standby database disconnect from session;

数据库已更改。

主库:
SQL> alter system switch logfile;--把第6条记录也同步过去

系统已更改。

备库上应用完毕后,主库上执行:
SQL> alter database commit to switchover to physical standby with session shutdown;--执行成功

数据库已更改。

SQL> select database_role,open_mode,switchover_status from v$database;
select database_role,open_mode,switchover_status from v$database
                                                      *
第 1 行出现错误:
ORA-01507: 未装载数据库

主库执行这个操作后,数据库被卸载,但是实例还是启动着的

摘录alert日志如下:
alter database commit to switchover to physical standby with session shutdown
Thu Mar 06 12:52:14 2014
Stopping background process CJQ0
Thu Mar 06 12:52:14 2014
Stopping background process QMNC
Thu Mar 06 12:52:15 2014
SMON: disabling tx recovery
Thu Mar 06 12:52:15 2014
Stopping Job queue slave processes
Thu Mar 06 12:52:15 2014
Job queue slave processes stopped
Active process 7396 user 'SYSTEM' program 'ORACLE.EXE (SHAD)'
Active process 4820 user 'SYSTEM' program 'ORACLE.EXE (SHAD)'
CLOSE: waiting for server sessions to complete.
CLOSE: all sessions shutdown successfully.
Thu Mar 06 12:52:17 2014
SMON: disabling cache recovery
Thu Mar 06 12:52:17 2014
Block change tracking service stopping.
Thu Mar 06 12:52:17 2014
Stopping background process CTWR
Thu Mar 06 12:52:18 2014
Shutting down archive processes
Archiving is disabled
Thu Mar 06 12:52:23 2014
ARCH shutting down
ARC1: Archival stopped
Thu Mar 06 12:52:28 2014
ARCH shutting down
ARC0: Archival stopped
Thu Mar 06 12:52:29 2014
Thread 1 closed at log sequence 40
Successful close of redo thread 1
Thu Mar 06 12:52:30 2014
ARCH: Noswitch archival of thread 1, sequence 40
ARCH: End-Of-Redo Branch archival of thread 1 sequence 40
ARCH: Archiving is disabled due to current logfile archival
Clearing standby activation ID 1353650526 (0x50af115e)
The primary database controlfile was created using the
'MAXLOGFILES 16' clause.
There is space for up to 13 standby redo logfiles
Use the following SQL commands on the standby database to create
standby redo logfiles that match the primary database:
ALTER DATABASE ADD STANDBY LOGFILE 'srl1.f' SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE 'srl2.f' SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE 'srl3.f' SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE 'srl4.f' SIZE 52428800;
Archivelog for thread 1 sequence 40 required for standby recovery
MRP0 started with pid=10, OS id=7948
Managed Standby Recovery not using Real Time Apply
Online logfile pre-clearing operation disabled by switchover
Media Recovery Log E:\ORACLE\PRODUCT\10.2.0\ARCH\ARC00040_0825872308.001
Identified End-Of-Redo for thread 1 sequence 40
Thu Mar 06 12:52:39 2014
Media Recovery End-Of-Redo indicator encountered
Thu Mar 06 12:52:39 2014
Media Recovery Applied until change 12315123290436
Resetting standby activation ID 1353650526 (0x50af115e)
Thu Mar 06 12:52:41 2014
Completed: alter database commit to switchover to physical standby with session shutdown

--在switchover的过程中会归档主库当前的联机重做日志

SQL> shutdown immediate
ORA-01507: 未装载数据库

ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  603979776 bytes
Fixed Size                  1250380 bytes
Variable Size             373296052 bytes
Database Buffers          222298112 bytes
Redo Buffers                7135232 bytes
数据库装载完毕。
SQL> select database_role,switchover_status from v$database;--主库已经成功switchover为备库

DATABASE_ROLE    SWITCHOVER_STATUS
---------------- --------------------
PHYSICAL STANDBY TO PRIMARY

4)备库上检查是否支持switchover,如果v$database.switchover_status列为to primary表示支持,不然就要重新检查下data guard的配置
下面在备库上进行操作
SQL> select switchover_status from v$database;

SWITCHOVER_STATUS
--------------------
SESSIONS ACTIVE

5)将备库转换为主库
SQL> alter database commit to switchover to primary with session shutdown;

数据库已更改。

SQL> select database_role,switchover_status from v$database;

DATABASE_ROLE    SWITCHOVER_STATUS
---------------- --------------------
PRIMARY          SESSIONS ACTIVE

此时备库已经变为新的主库,打开新的主库
SQL> alter database open;

数据库已更改。

SQL> select * from hr.test;--数据是同步过来的,没有丢失

        ID
----------
         1
         2
         3
         4
         5
         6

已选择6行。

6)验证新的主库的功能
SQL> insert into hr.test values(7);

已创建 1 行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

归档日志已经写入新的主库和新的备库归档目的地,备库开启恢复后,数据同步成功
新的备库:
SQL> alter database recover managed standby database disconnect from session;

数据库已更改。

SQL> alter database recover managed standby database cancel;

数据库已更改。

SQL> alter database open;

数据库已更改。

SQL> select * from hr.test;

        ID
----------
         7
         1
         2
         3
         4
         5
         6

已选择7行。

--至此,switchover演示完毕

3、failover(failover之后,原主库不再是data guard配置的一部分,failover一般就是指主库遭遇故障,启动不起来,需要切换为备库的情况)
在上述的switchover之后,原备库orcldg(网络服务器名为7502)变为新的主库,原主库orcl(网络服务器名为7501)变为新的备库

sqlplus sys/oracle@7502 as sysdba
SQL> select database_role from v$database;

DATABASE_ROLE
----------------
PRIMARY

sqlplus sys/oracle@7501 from v$database;
SQL> select database_role from v$database;

DATABASE_ROLE
----------------
PHYSICAL STANDBY

1)将备库关闭,主库打开,在主库上执行一些修改:
SQL> select * from hr.test;

        ID
----------
         7
         1
         2
         3
         4
         5
         6

已选择7行。

SQL> insert into hr.test values(8);

已创建 1 行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into hr.test values(9);

已创建 1 行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into hr.test values(10);

已创建 1 行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into hr.test values(11);--id=11这条数据所在的日志未切换,未归档,还在联机重做日志文件中

已创建 1 行。

SQL> commit;

提交完成。

在主库的归档目录(E:\oracle\product\10.2.0\arch2)下产生了42、43、44这三个归档日志文件,主库当前联机重做日志文件的sequence number为45,这些日志在备库上不存在

2)现在将主库shutdown abort,模拟故障

3)在备库上确认归档文件与主库是否连续,如果不连续,需要将主库上的归档日志文件复制到备库,并注册到备库控制文件中

将备库启动到mount状态,查询v$archive_gap视图,返回0条记录,但是实际上备库和主库是存在归档间隙的,可能因为主库目前是关闭状态,所以这个视图查询不出来,但我们知道,主库和备库之间差42、43、44这三个归档日志文件。
将主库的归档目录(E:\oracle\product\10.2.0\arch2)下的42、43、44这三个归档日志文件,复制到备库的归档目录(E:\oracle\product\10.2.0\arch)下,并将这些日志注册到备库的控制文件中:
SQL> alter database register physical logfile 'E:\oracle\product\10.2.0\arch\ARC00042_0825872308.001';

数据库已更改。

SQL> alter database register physical logfile 'E:\oracle\product\10.2.0\arch\ARC00043_0825872308.001';

数据库已更改。

SQL> alter database register physical logfile 'E:\oracle\product\10.2.0\arch\ARC00044_0825872308.001';

数据库已更改。

4)在备库上应用这些归档日志
SQL> alter database recover managed standby database finish force;

数据库已更改。

5)切换备库为主库
SQL> alter database commit to switchover to primary;

数据库已更改。

SQL> select database_role from v$database;

DATABASE_ROLE
----------------
PRIMARY

SQL> alter database open;

数据库已更改。

SQL> select * from hr.test;

        ID
----------
         7
         1
         2
         3
         4
         5
         6
         8
         9
        10

已选择10行。

--可以看到,备库已经顺利failover为主库(原主库已经不是data guard的一部分),但是看到hr.test表中只有10条数据,id=11那条数据已经丢失了,所以说在maximum performance保护模式下,如果主库异常宕机,需要切换为备库的话,会造成一定数据的丢失(丢失联机重做日志中的数据)。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26524307/viewspace-1102698/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26524307/viewspace-1102698/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值