Oracle11g Active Data Guard搭建、管理

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

Data Guard与RAC不同的是,在一般情况下,Standby只有一个节点处于活动状态,所有的应用都连接到主服务器。只有当服务器发生故障时,才考虑切换到备用服务器。

在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 配置

在创建备库前,要确认两台服务器的数据库之间能通信,如果我们要用 RMAN 的 duplicate from active database 命令创建备库的话。我们需要配置监听和 TNS 名。

      虽然数据库会自动注册监听,但如果要使用 RMAN的 duplicate 命令创建备库,备库必须首先处于 NOMOUNT 状态。在 NOMOUNT 状态下,数据库实例不会自动注册监听,你必须配置静态监听。另外必须要注意的一点是,NOMOUNT 状态下的数据库必须使用专用模式(dedicated 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地址更改为备库服务器地址

********************* 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配置相关的各个参数

1、开启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

2、设置 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

 

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

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

 

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

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。

 

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

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错。

 

6、设置参数 FAL_SERVER

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

SQL> alter system set  fal_server='orcl_standby';

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

 

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

启用此功能的方法如下:

SQL> alter system set standby_file_management=auto;

 

8、添加备用日志(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;

9、重启数据库
SQL> shutdown immediate
SQL> startup

10、其它
SQL> alter system setlocal_listener='for_db';

 11、创建主库主库pfile参数文件
SQL> createpfile='/home/oracle/initdg.ora' from spfile;

12、创建好了主库的 pfile后,将其复制到备库服务器
$ scp /home/oracle/initdg.ora 192.168.10.206:/home/oracle/

四、备库环境准备

13、在备库修改传递过来的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'
******************************************************

 

14、创建备用数据库的密码文件

使用oracle帐号登录,设置的密码要保证主库、备用库是相同。也可以复制主库密码文件到备库。
$ rm $ORACLE_HOME/dbs/orapw$ORACLE_SID
$ orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=sysoracle entries=4

备注:

如果你不是使用 SSL 做重做日志传输验证(一般来说不会),那么你需要使用密码文件做验证。你必须创建密码文件,并且设置参数 REMOTE_LOGIN_PASSWORDFILE 为 EXCLUSIVE 或 SHARED。一般数据库默认就有密码文件,并且此参数默认为 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

15、将备库启动到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.

16、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> 

17、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.

18将备库置于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  

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

SQL> alter database open;

 

2)启用实时重做应用

选项“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;

 

3)查看状态

状态“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)主库上创建表空间、用户以及表并初始化数据

(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

 

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

(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循序为:

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

$ sqlplus / as sysdba

SQL> startup



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

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

 

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

1、检查主、备库的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在主库设置为最大可用模式不能实现时,自动降级为最大性能模式。这样的结果使得日志同步不再实时。



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

1、根据最大可用模式的最低要求,将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;

 

2、查看备库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

 

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

1、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)

 

2、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状态



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

检查数据库的flashback database模式和闪回日志存放的目录。

SQL> select  flashback_on from v$database;

SQL> show parameter db_recovery_file

 

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

SQL> select process,status fromv$managed_standby;
SQL> recover managed standby database cancel;
SQL> create restore point test_scn guarantee flashback database;

 

准备主数据库

3、归档当前日志文件。

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

SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;

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

 

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

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

 

激活物理备数据库

在物理备数据库上,执行下述步骤:

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

SQL> ALTER DATABASE ACTIVATE STANDBY DATABASE;

SQL> ALTER DATABASE OPEN;

 

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

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

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

 

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

在你完成测试之后,你需要重新与主数据库同步激活的数据库。在激活的数据库上执行

下面语句以快速闪回它到保障的还原点并将它重新与主数据库同步:

1、备库执行

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;

 

2、重新允许归档到物理备数据库目的地

在主数据库上,执行下面语句来重新允许归档到物理备数据库:
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值