Oracle11g Active Data Guard搭建、管理

时间:2022-03-23 10:32:56

说明:參考网络众多人的笔记及思路,加上自己亲身实践之后的整理笔记。仅供參考。

Data Guard与RAC不同的是。在普通情况下。Standby仅仅有一个节点处于活动状态,全部的应用都连接到主server。

仅仅有当server发生问题时,才考虑切换到备用server。

在Oracle 11g曾经版本号中的的Data Guard物理备用数据库。能够以仅仅读的方式打开数据库。但此时MediaRecovery利用日志进行数据同步的过程就停止了,假设物理备用数据库处于恢复的过程中数据库就不能打开查询。也就是说日志应用和仅仅读打开两个状态是相互排斥的,而Oracle 11g Active Data Guard功能攻克了这个矛盾,在利用日志恢复数据的同一时候能够用仅仅读的方式打开数据库,用户能够在备用数据库上进行查询、报表等操作,这类似逻辑Data
Guard备用数据库的功能(查询功能方面),可是,数据同步的效率更高、对硬件的资源要求更低。这样能够更大程度地发挥物理备用数据库的硬件资源的效能。

Oracle 11g物理Active Data Guard实时查询(Real-time query)特性。备库在这样的特性的支持下,Oracle能够最大限度满足备库作为报表库或者查询分析类型数据库的需求。

利用oracle 11g的 Duplicate From Active Database技术,使用rman通过网络连接主库数据库进行复制。

一、环境介绍

1. 主数据库环境

操作系统版本号: OEL6.4 x64

数据库版本号 : Oracle 11.2.0.4.0x64

数据库sid名 : orcl

数据库db_unique_name:orcl_primary

2. 备库环境

操作系统版本号: OEL6.4 x64

数据库版本号 : Oracle 11.2.0.4.0x64 (仅仅安装oracle数据库软件,no netcadbca)

数据库sid名 : orcl

数据库db_unique_name:orcl_standby

配置hosts文件

# cat /etc/hosts

192.168.10.205 oradb205 oradb205.localdomain

192.168.10.206 oradb206 oradb206.localdomain

数据库须要开启归档模式(主、备库都改动)

SQL> shutdown immediate

SQL> startup mount

SQL> alter database archivelog;

SQL> alter database open;

SQL> archive log list;

DG的三种保护模式

Maximum Protection 最大保护 | MaximumPerformance最高性能(默认模式) | Maximum Availability 最高可用性

查看DG处于何种保护模式

SQL> selectdb_unique_name,protection_mode,protection_level from v$database;

设置保护模式(3中模式。可选)

SQL> alter database set standbydatabase to maximize performance;

SQL> alter database set standbydatabase to maximize availability;

SQL> alter database set standbydatabase to maximize protection;

二、SQL*NET 配置

在创建备库前,要确认两台server的数据库之间能通信,假设我们要用 RMAN
的 duplicate from active database 命令创建备库的话。

我们须要配置监听和 TNS 名。

尽管数据库会自己主动注冊监听,但假设要使用 RMAN的 duplicate 命令创建备库。备库必须首先处于 NOMOUNT 状态。在 NOMOUNT 状态下。数据库实例不会自己主动注冊监听。你必须配置静态监听。另外必需要注意的一点是。NOMOUNT 状态下的数据库必须使用专用模式(dedicated server)连接。

两台server上的 TNS 名字文件必须配置好,让主备库能用 LOG_ARCHIVE_DEST_N 和 FAL_SERVER 參数(稍后会介绍这些參数)中的服务名(Service Names)找到对方。详细配置应类似下例。

改动主备库listener.ora,tnsnames.ora文件例如以下,备库依据自身情况改动

SDU=32767 为DG优化网络传输參数

改动主库监听配置$ORACLE_HOME/network/admin/listener.ora

*********************
listener.ora *******************************

# listener.ora Network Configuration File:/data/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

# Generated by Oracle configuration tools.

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

(SDU=32767)

(GLOBAL_DBNAME = orcl_primary)

(ORACLE_HOME =/data/oracle/app/oracle/product/11.2.0/dbhome_1)

(SID_NAME = orcl)

)

)

LISTENER =

(DESCRIPTION =

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

)

ADR_BASE_LISTENER =/data/oracle/app/oracle

*********************listener.ora *******************************

改动备库监听配置同上,除了HOST地址更改为备库server地址

*********************
listener.ora *******************************

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(SDU=32767)

(GLOBAL_DBNAME = orcl_standby)

(ORACLE_HOME =/data/oracle/app/oracle/product/11.2.0/dbhome_1)

(SID_NAME = orcl)

)

)

LISTENER =

(DESCRIPTION =

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

)

ADR_BASE_LISTENER =/data/oracle/app/oracle

*********************listener.ora *******************************

改动配置tnsname.ora文件(主、备库都都为例如以下)

说明:orcl_primary是主库的服务名,orcl_standby是备库的服务名。

$ vi$ORACLE_HOME/network/admin/tnsnames.ora

*******************
tnsnames.ora ****************************

# listener.ora Network Configuration File:/data/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

# Generated by Oracle configuration tools.

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(SDU=32767)

(GLOBAL_DBNAME = orcl_primary)

(ORACLE_HOME =/data/oracle/app/oracle/product/11.2.0/dbhome_1)

(SID_NAME = orcl)

)

)

LISTENER =

(DESCRIPTION =

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

)

ADR_BASE_LISTENER =/data/oracle/app/oracle

[oracle@oradb205 admin]$ cat tnsnames.ora

orcl_primary =

(DESCRIPTION =

(SDU=32767)

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

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = orcl_primary)

)

)

orcl_standby =

(DESCRIPTION =

(SDU=32767)

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

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = orcl_standby)

#(UR = A)

)

)

for_db =

(DESCRIPTION =

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

)

*******************tnsnames.ora ****************************

測试服务名连通性

$ tnsping orcl_primary

$ tnsping orcl_standby

如今主备库之间依然能够互相通信了

三、在主库上改动dataguard配置相关的各个參数

、开启force logging模式

SQL> alter database forcelogging;

SQL> select open_mode,log_mode,force_logging,flashback_on from v$database;

OPEN_MODE LOG_MODE FOR FLASHBACK_ON

---------- ------------ ---------------------------- ------------ --- ------

READ WRITE ARCHIVELOG YES NO

作用:无论什么操作都会生成redo日志,应该看到 force_logging 列为 YES。

特点:1.在数据库mount状态和open状态都能够启动forcelogging模式

2.暂时表空间和暂时回滚段动作不会生成redo日志

3. alter database noforce logging;关闭forcelogging

、设置 db_unique_name參数

主、备库都必须设置为唯一。这个是DG里的标识,假设没有。使用 alter system 进行设置:

SQL> show parameter db_unique_name;

SQL> alter system set db_unique_name=orcl_primaryscope=spfile;

主库设置名为orcl_primary,备库设置为orcl_standby

、让主库知道 Data Guard配置里的另外一个备库的名字

SQL>  alter system set log_archive_config = 'dg_config=(orcl_primary,orcl_standby)';

、配置归档位置和重做日志传输

SQL> alter system set log_archive_dest_1 = 'location=use_db_recovery_file_destvalid_for=(all_logfiles, all_roles) db_unique_name=orcl_primary';

这个命令指定高速恢复区作为归档位置。此归档位置用于在全部数据库角色下归档全部的日志文件。

官方文档里说使用 valid_for=(online_logfiles, all_roles),这将导致备库无法归档备用日志文件。由于它们不是在线日志。

但假设使用 all_logfiles 选项,主备库将都能归档在线以及备用日志。假设你想在备库进行备份。并同一时候备份归档日志的话,必须使用 all_logfiles。

、配置重做日志传输到备库

SQL> alter system set log_archive_dest_2 = 'service=orcl_standby lgwr sync valid_for=(online_logfile,primary_role)db_unique_name=orcl_standby';

这条语句说,假设这是主库,就使用服务名orcl_standby  传输在线日志。目标库名叫 orcl_standby 。

要注意STANDBY_ARCHIVE_DEST 參数不须要。已经被官方弃用。当调试时。不少人好心建议我设置此參数。但设置此參数后启动数据库,仅仅会报 ORA-32004: obsolete or deprecated parameter(s) specified for RDBMSinstance错。

、设置參数 FAL_SERVER

指定当日志传输出现故障时。备库到哪里去找缺少的归档日志。设置了这个參数,备库就会主动去寻找那些缺少的日志,并要求主库进行传输。

SQL> alter system set  fal_server='orcl_standby';

注意 FAL_CLIENT 參数在11g里已经弃用。

、当主库加入或删除数据文件时,这些文件也会在备库加入或删除。

启用此功能的方法例如以下:

SQL> alter system set standby_file_management=auto;

、加入备用日志(standby redo )

再次。我们要确认主库有备用日志文件(StandbyLog Files)。备库使用备用日志文件来来保存从主库接收到的重做日志。

主库上也建立备用日志文件有两个原因:一是主库可能转换成备库。备库须要备用日志,二是假设主库建了备用日志。备库会自己主动建。

备用日志应该跟在线日志一样大,组数应该至少跟在线日志一样多,或者很多其它。

我喜欢给备用日志一个跟在线日志不同范围的编号。比方在线日志组是1到6,备用日志就是11到16。

SQL> alter database add standby logfilegroup 11 ('/data/oracle/app/oracle/oradata/orcl/std_redo11.log') size100M;

SQL> alter database add standby logfilegroup 12 ('/data/oracle/app/oracle/oradata/orcl/std_redo12.log') size100M;

SQL> alter database add standby logfilegroup 13 ('/data/oracle/app/oracle/oradata/orcl/std_redo13.log') size100M;

查看redo 信息

SQL> select group#,type, member fromv$logfile;

、重新启动数据库

SQL> shutdown immediate

SQL> startup

、其他

SQL> alter system setlocal_listener='for_db';

、创建主库主库pfile參数文件

SQL> createpfile='/home/oracle/initdg.ora' from spfile;

、创建好了主库的 pfile后,将其拷贝到备库server

$ scp /home/oracle/initdg.ora 192.168.10.206:/home/oracle/

四、备库环境准备

、在备库改动传递过来的pfile文件,注意红色字体部分(根据备库机器配置不同。更改相关配置)

使用备库的 SID 改动其名字。

你须要对 pfile 做例如以下改动:

  • 依据你备库的配置和文件位置。你可能须要改动 AUDIT_FILE_DEST。CONTROL_FILES 和 DISPATCHERS 參数(或许还有其它须要改动的參数)。
  • LOG_ARCHIVE_DEST_1 參数中的 db_unique_name 改动为备库的相应唯一名(这里是 orcl_standby)。
  • LOG_ARCHIVE_DEST_2 參数,改动为主库相应的服务名和数据库唯一名(这里是 orcl_primary)。
  • FAL_SERVER 參数改动指向主库的服务名。
  • 添加例如以下參数:
    • db_unique_name=ORCL_standby
    • db_file_name_convert 和 log_file_name_convert。假设主备库的数据文件、日志文件位置不同,须要设置这两个參数。

$ vim /home/oracle/initdg.ora

******************************************************

orcl.__db_cache_size=2835349504

orcl.__java_pool_size=16777216

orcl.__large_pool_size=184549376

orcl.__oracle_base='/data/oracle/app/oracle'#ORACLE_BASEset from environment

orcl.__pga_aggregate_target=2516582400

orcl.__sga_target=3774873600

orcl.__shared_io_pool_size=0

orcl.__shared_pool_size=671088640

orcl.__streams_pool_size=0

*.audit_file_dest='/data/oracle/app/oracle/admin/orcl/adump'

*.audit_trail='db'

*.compatible='11.2.0.4.0'

*.control_files='/data/oracle/app/oracle/oradata/orcl/control01.ctl','/data/oracle/app/oracle/fast_recovery_area/orcl/control02.ctl'

*.db_block_size=8192

*.db_domain=''

*.db_name='orcl'

*.db_recovery_file_dest='/data/oracle/app/oracle/fast_recovery_area'

*.db_recovery_file_dest_size=20480M

*.db_unique_name='orcl_standby'

*.diagnostic_dest='/data/oracle/app/oracle'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'

*.fal_server='orcl_primary'

*.local_listener='for_db'

*.log_archive_config='dg_config=(orcl_primary,orcl_standby)'

*.log_archive_dest_1='location=use_db_recovery_file_destvalid_for=(all_logfiles, all_roles) db_unique_name=orcl_standby'

*.log_archive_dest_2='service=orcl_primary lgwrsync valid_for=(online_logfile,primary_role) db_unique_name=orcl_primary'

*.memory_target=6000M

*.open_cursors=300

*.processes=150

*.remote_login_passwordfile='EXCLUSIVE'

*.sessions=610

*.standby_file_management='AUTO'

*.undo_tablespace='UNDOTBS1'

******************************************************

、创建备用数据库的password文件

使用oracle帐号登录。设置的password要保证主库、备用库是同样。

也能够复制主库password文件到备库。

$ rm $ORACLE_HOME/dbs/orapw$ORACLE_SID

$ orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=sysoracle entries=4

备注:

假设你不是使用 SSL 做重做日志传输验证(一般来说不会),那么你须要使用password文件做验证。你必须创建password文件,而且设置參数 REMOTE_LOGIN_PASSWORDFILE 为 EXCLUSIVE 或 SHARED。一般数据库默认就有password文件。而且此參数默觉得 EXECUSIVE。

先检查下这两项。假设不是默认。设置方法例如以下:

SQL> alter system set remote_login_passwordfile=exclusive scope=spfile;

測试远程登录

$ sqlplus sys/sysoracle@orcl_primary as sysdba

$ sqlplus sys/sysoracle@orcl_standby as sysdba

、将备库启动到nomount状态,然后连接主库进行RMAN duplicate操作

SQL> conn /as sysdba

SQL> create spfile frompfile='/home/oracle/initdg.ora';

SQL> startup nomount

备注:

若启动出现 ORA-32004: obsoleteor deprecated parameter(s) specified for RDBMS instance,则查看日志。

文本格 式的alert文件在哪里呢?看一下动态视图V$DIAG_INFO吧。

SQL> select * from v$diag_info ;

$ tail -f /data/oracle/app/oracle/diag/rdbms/orcl_standby/orcl/trace/alert_orcl.log

看看有无类似过期參数提示:

WARNING: The background_dump_dest init.ora parameter has beendeprecated.

、RMAN同一时候连接主库与备库

在备库机器上运行(主库为启动startup。备库为nomount状态)

$ rman target sys/sysoracle@orcl_primary auxiliary sys/sysoracle@orcl_standby

Recovery Manager: Release 11.2.0.4.0 -Production on Tue May 20 11:45:02 2014

Copyright (c) 1982, 2011, Oracle and/or itsaffiliates. All rights reserved.

connected to target database: ORCL(DBID=4079000510)

connected to auxiliary database: ORCL (notmounted)

RMAN> 

、RMAN通过网络在线duplicate复制主库数据到备库

RMAN> duplicate target database for standby nofilenamecheck from active database;

Starting Duplicate Db at 20-MAY-14

using target database control file insteadof recovery catalog

allocated channel: ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: SID=315 devicetype=DISK

…… 省略

Finished Duplicate Db at 20-MAY-14

RMAN> exit

Recovery Manager complete.

、将备库置于active dataguard模式下

在Oracle 11g之前。物理备库(physical Standby)在应用redo的时候,数据库须要处于mount状态。从11g開始,应用redo的时候。物理备库能够处于read-only模式,这就称为Active Data Guard 。通过Active Data Guard。能够在物理备库进行查询或者导出数据,从而降低对主库的訪问和压力。

$ sqlplus /nolog

SQL> conn /as sysdba

查看状态

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

OPEN_MODE DATABASE_ROLE DB_UNIQUE_NAME

-------------------- ----------------------------------------------

MOUNTED PHYSICAL STANDBY orcl_standby  

)打开备库(Dataguard仅仅能启动备库到readonly模式)

SQL> alter database open;

)启用实时重做应用

选项“USING CURRENT LOGFILE”的含义是当备库收到日志后,尽快完毕恢复。

SQL> alter database recover managed standby database using current logfile disconnect from session;

取消备库的自己主动恢复

取消Redo Apply

SQL> alter database recover managed standby database cancel;

)查看状态

状态“READ ONLY WITH APPLY”即表示此时备库处于Read Only状态的同一时候能够接受主库传过来的日志进行恢复,以便达到备库能够即时查看到主库变化的目的。

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

OPEN_MODE DATABASE_ROLEDB_UNIQUE_NAME 

-------------------- ----------------------------------------------

READ ONLY WITH APPLY PHYSICAL STANDBY orcl_standby

查看日志状态

SQL> select status from v$standby_log;

STATUS

----------

ACTIVE

ACTIVE

UNASSIGNED

 

SQL> select member from v$logfile;

MEMBER

--------------------------------------------------------------------------------

/data/oracle/app/oracle/fast_recovery_area/ORCL_STANDBY/onlinelog/o1_mf_3_9qon4l1s_.log

/data/oracle/app/oracle/fast_recovery_area/ORCL_STANDBY/onlinelog/o1_mf_2_9qon4hjg_.log

/data/oracle/app/oracle/fast_recovery_area/ORCL_STANDBY/onlinelog/o1_mf_1_9qon4f3v_.log

/data/oracle/app/oracle/fast_recovery_area/ORCL_STANDBY/onlinelog/o1_mf_11_9qon4nh8_.log

MEMBER

--------------------------------------------------------------------------------

/data/oracle/app/oracle/fast_recovery_area/ORCL_STANDBY/onlinelog/o1_mf_12_9qon4s8k_.log

/data/oracle/app/oracle/fast_recovery_area/ORCL_STANDBY/onlinelog/o1_mf_13_9qon4y3c_.log

6 rows selected

五、改动dataguard的数据保护模式为最高可用性模式

依据oracle文档的解释。最高可用性数据保护模式须要先满足下面几个条件

Table 6-1 Required Redo Transport Attributes for DataProtection Modes

Maximum Availability

Maximum Performance

Maximum Protection

AFFIRM or NOAFFIRM

NOAFFIRM

AFFIRM

SYNC

ASYNC

SYNC

DB_UNIQUE_NAME

DB_UNIQUE_NAME

DB_UNIQUE_NAME

Minimum Requirements for Maximum Protection Mode

Redo Archival Process

LGWR

Network Transmission Mode

SYNC

Disk Write Option

AFFIRM

Standby Redo Logs?

Yes

Standby Database Type

Physical Only

For example:

log_archive_dest_2='service=testdb_standby LGWR SYNC AFFIRM'

主库上查看DG状态

SQL> select db_unique_name,protection_mode,protection_level from v$database;

DB_UNIQUE_NAME PROTECTION_MODEPROTECTION_LEVEL 

-------------------------------------------------- --------------------

ORCL_PRIMARY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE

备库上查看DG状态

SQL> select db_unique_name,protection_mode,protection_level from v$database;

DB_UNIQUE_NAME PROTECTION_MODEPROTECTION_LEVEL

-------------------------------------------------- --------------------

orcl_standby MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE

在主库上设置DG保护模式为最高可用性模式

SQL> alter database set standby database to maximize availability;

再次查看主库、备库,发现DG保护模式都已经变了。

主库

SQL> select db_unique_name,protection_mode,protection_level from v$database;

DB_UNIQUE_NAME PROTECTION_MODEPROTECTION_LEVEL 

-------------------------------------------------- --------------------

ORCL_PRIMARY MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

备库

SQL> select db_unique_name,protection_mode,protection_level from v$database;

DB_UNIQUE_NAME PROTECTION_MODEPROTECTION_LEVEL 

-------------------------------------------------- --------------------

orcl_standby MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

将备库shutdown后,主库和备库的PROTECTION_LEVEL将变为RESYNCHRONIZATION

SQL> select db_unique_name,protection_mode,protection_level from v$database;

DB_UNIQUE_NAME PROTECTION_MODEPROTECTION_LEVEL 

-------------------------------------------------- --------------------

orcl_standby MAXIMUM AVAILABILITY RESYNCHRONIZATION

备库运行

取消Redo Apply

SQL> alter database recover managedstandby database cancel;

SQL> shutdown immediate

SQL> selectdb_unique_name,protection_mode,protection_level from v$database;

六、体验实时查询(Real-timequery)特性 (可选)

)主库上创建表空间、用户以及表并初始化数据

(1)创建表空间并查看表空间创建结果和状态

SQL> create tablespace test_tbs datafile '/data/oracle/app/oracle/oradata/orcl/test_tbs01.dbf' size 10m;

SQL> select * from v$tablespace where name = 'TEST_TBS';

SQL> select ts#,status,bytes,name fromv$datafile where ts# = 8;

(2)创建用户并授权

SQL> create user islandstar identifiedby 123456 default tablespace test_tbs;

SQL> grant dba to islandstar;

(3)创建表并初始化数据

$ sqlplus /nolog

SQL> conn islandstar/123456

SQL> create table t (x varchar2(8));

SQL> insert into t values ('islandstar');

SQL> commit;

SQL> select * from t;

X

--------

Secooler

)验证主库所创建表空间、用户以及表并初始化数据是否在备库应用成功

(1)查看备库表空间

SQL> select * from v$tablespace where name = 'TEST_TBS';

TS# NAME INCBIG FLA ENC

---------- --------------------------------- --- --- ---

8SECOOLER_TBS YES NO YES

SQL> select ts#,status,bytes,name from v$datafile where ts# = 8;

       TS# STATUS BYTES

---------- ------- ----------

NAME

--------------------------------------------------------------------------------

         8 RECOVER 10485760

/data/oracle/app/oracle/oradata/orcl/test_tbs01.dbf

创建成功。可是此时备库数据文件的状态是“RECOVER”。

(2)查看备库用户及数据是否存在

方法同主库

主库上的变化已经即使的在备库上得到应用。

这便是Oracle 11g物理Active Data Guard实时查询(Real-time query)特性的体现。

****************** Active Data Guard  维护篇 **************************

Data Guard 启动\关闭顺序:

启动顺序:先standby ,后primary;

关闭顺序:先primary 后standby;

主库没有遗漏

SQL> select * from v$archive_gap;

查看日志能否正确从主库同步到备用库,查看主备库

SQL> col standby_dest for a12

SQL> col archived for a10

SQL> col applied for a10

SQL> col status for a10

SQL> select sequence#,standby_dest,archived,applied,status from v$archived_log;

仅仅须要保证2边sequence序列号一致且最新的app返回YES了,就说明备库接收到应用且恢复了。

正常操作关闭DG时。再次启动DG循序为:

、先启动备库,再启动主库

$ sqlplus / as sysdba

SQL> startup

、在备库运行命令:打开实时应用状态模式

SQL> alter database recover managed standby database using current logfile disconnect from session;

非正常情况下关闭DG后,重新启动DG时须要操作

、检查主、备库的protection_level值,若当中一点为RESYNCHRONIZATION,说明实时同步已经有问题。

SQL> select db_unique_name,protection_mode,protection_level from v$database;

DB_UNIQUE_NAME PROTECTION_MODEPROTECTION_LEVEL 

-------------------------------------------------- --------------------

ORCL_PRIMARY MAXIMUM AVAILABILITY RESYNCHRONIZATION

Oracle的data guard在主库设置为最大可用模式不能实现时。自己主动降级为最大性能模式。

这种结果使得日志同步不再实时。

解决方法(在主库运行):

、依据最大可用模式的最低要求,将log_archive_dest_2调整为lgwr sync affirm。

SQL> show parameter log_archive_dest_2

若包括有lgwr sync affirm ,则运行

SQL> alter system switch logfile;

强制日志切换。不一定就归档当前的重做日志文件(若自己主动归档打开,就归档前的重做日志。若自己主动归档没有打开,就不归档当前重做日志。

若无lgwr sync affirm ,则运行例如以下两句命令

SQL> alter system setlog_archive_dest_2 = 'service=orcl_standby lgwr sync affirm valid_for=(online_logfile,primary_role) db_unique_name=orcl_standby';

SQL> alter system switch logfile;

、查看备库open_mode是否为“READ ONLY WITH APPLY”。否则运行后面一条语句,打开实时应用状态模式

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

OPEN_MODE DATABASE_ROLEDB_UNIQUE_NAME 

-------------------- ----------------------------------------------

READ ONLY WITH APPLY PHYSICAL STANDBY orcl_standby

SQL> alter database recover managed standby database using current logfile disconnect from session;

******************  主备库切换 Switchover  **************************

物理Data Guard角色转换步骤

Step 1 验证主库能否运行角色转换到备库(原主库运行):

1.查看switchover状态

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS

--------------------

TO STANDBY

附:A:switchover_status出现session active/not allowed

Step 2 開始把物理主库改变为物理备库(原主库运行)

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;

注:假设有活动的session能够使用此选项,否则转换会遇到ORA-01093错误,也能够杀掉活动会话或等活动会话后进行转换

当出现session active的时候表示还有活动的session,则执行

SQL> Alter database commit to switchover tophysical standby with session shutdown;

Step 3 关闭并重新启动主库(原主库运行)

SQL> SHUTDOWN IMMEDIATE;

SQL> STARTUP MOUNT;

Step 4 验证备库能否运行角色转换到主库(原备库运行)

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS

--------------------

TO PRIMARY

Step 5 開始把物理备库转换成物理主库(原备库运行)

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

--假设报ORA-16139: mediarecovery required,可能是因为未应用日志引起,可先运行

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

Step 6 打开备库。然后关闭重新启动.(原备库运行)

SQL> ALTER DATABASE OPEN;

SQL> SHUTDOWN IMMEDIATE;

SQL> STARTUP;

Step 7 验证是否转换成功(原备库运行)

SQL> ALTER SYSTEM SWITCH LOGFILE;

Setp 8 应用归档日志(原主库上运行)

SQL> ALTERDATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

此步若提示报错:

ORA-01153: an incompatible media recoveryis active

则先运行

SQL> alter database recover managed standby database cancel;

再运行

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

最后。重新启动一下数据库(原备库运行)

SQL> shutdownimmediate;

SQL> startup

******************  网络优化  **************************

、Oracle Net Session DataUnit (SDU) Size

Oracle Net在将数据进行网络传输的时候,先将数据放在SDU中,该參数在10gR2默觉得2k,适当添加大小。能够提高网络性能和利用率。

Oracle推荐该參数取值为32767(最大值),有两种办法调整该參数。

配置listener.ora和tnsnames.ora,添加SDU描写叙述。须要注意。在connect descriptor中配置SDU并不正确动态服务注冊生效,通过动态注冊服务的connect,将继承sqlnet.ora中的DEFAULT_SDU_SIZE配置。添加例如以下:

(SDU=32767)

、Network Device QueueSizes

为了避免tcp上的缓存溢出,须要添加网络设备的队列大小。

以Linux为例,存在两种队列:transmit queue(传送队列)/receive queue(接收队列)。

发送队列由txqueuelen控制。接收队列由netdev_max_backlog控制。

改动/etc/sysctl.conf,添加例如以下:

# for Oracle data guard optimize

net.core.netdev_max_backlog = 20000

改动/etc/rc.local 。添加例如以下:

# for Oracle data guard optimize

echo 1 > /proc/sys/net/ipv4/route/flush

ifconfig eth0 txqueuelen 10000

******************  闪回数据库在data guard中的使用  **************************

可用于暂时开发数据查询、測试。

測试完成再恢复备库到正常DG状态





、物理备库须要先开启闪回数据库

检查数据库的flashback database模式和闪回日志存放的文件夹。

SQL> select  flashback_on from v$database;

SQL> show parameter db_recovery_file

、取消备库日志应用,并创建一个激活之前的还原点

SQL> select process,status fromv$managed_standby;

SQL> recover managed standby database cancel;

SQL> create restore point test_scn guarantee flashback database;

准备主数据库

、归档当前日志文件。

在主数据库上,切换日志使得还原点(在步骤 1 中创建)的 SCN 将在物理备数据库上被归档:

SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;

当使用备重做日志文件时。这个步骤是必须的以确保数据库能被正确地闪回到还原点。

、延迟指向将被激活的备的日志归档目的地。

SQL> ALTER SYSTEM SETLOG_ARCHIVE_DEST_STATE_2=DEFER;

SQL> show parameter log_archive_dest_state_2

NAME TYPE VALUE

----------------------------------------------- ------------------------------

log_archive_dest_state_2 string DEFER

激活物理备数据库

在物理备数据库上。运行下述步骤:

、激活物理备数据库并打开到open状态

SQL> ALTER DATABASE ACTIVATE STANDBY DATABASE;

SQL> ALTER DATABASE OPEN;

一旦备数据库已经被激活,你能执行报表工具或执行其他測试并激活几天甚至几周,独立于主数据库。

警告:当数据库被激活时。它不从主数据库接收重做数据库并不能提供灾难保护。建议至少有

两个物理备数据库參与配置,使得主数据库保持对数据丢失的保护。

恢复激活的数据库回到物理备数据库

在你完毕測试之后。你须要又一次与主数据库同步激活的数据库。在激活的数据库上运行

以下语句以高速闪回它到保障的还原点并将它又一次与主数据库同步:

、备库运行

SQL> shutdown immediate

SQL> startup mount

SQL> flashback database to restore point  test_scn;

SQL> alter database convert to physical standby;

SQL> select status from v$instance;

SQL> shutdown immediate

SQL> startup mount

SQL> recover managed standby database disconnect;

、又一次同意归档到物理备数据库目的地

在主数据库上,运行以下语句来又一次同意归档到物理备数据库:

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE

參考文章:

http://ylw6006.blog.51cto.com/470441/841815

http://kyle.xlau.org/posts/oracle-data-guard-part1.html

http://www.idevelopment.info/data/Oracle/DBA_tips/Data_Guard/DG_3.shtml

http://blog.csdn.net/dba_waterbin/article/details/8640249

http://blog.sina.com.cn/s/blog_69e7b8d7010154d9.html