Oracle Dataguard Real-time Apply

At 2011-02-08

转载请注明文章转载自:Dbabc.Net [http://dbabc.net]
本文链接:http://dbabc.net/archives/2011/02/08/oracle-dataguard-real-time-apply.shtml

Oracle Dataguard Real-time Apply

一、基本概念… 2
1.1 Oracle Dataguard 的三种保护模式… 2
1.1.1最大性能(maximize performance)模式… 2
1.1.2最大可用(maximize availability)模式… 2
1.1.3 最大保护(maximize protection)模式… 2
1.2 Oracle Dataguard两种日志传输方式… 2
1.2.1 Arch. 2
1.2.2 LGWR.. 2
二、操作步骤… 2
2.1设置主库为force logging. 3
2.1.2设置主库为归档模式:… 3
2.1.3设置dataguard的保护模式:… 3
2.2创建备库… 4
2.2.1 拷贝参数文件和密码文件… 4
2.2.2 拷贝数据文件… 4
2.2.3 拷贝控制文件… 4
2.2.4 Dataguard的启动… 4
3.设置自动传输归档… 5
3.1参数的修改… 6
3.1.1修改备库standby_archive_dest参数… 6
3.1.2修改主库上的log_archive_dest_2参数… 6
3.2.测试自动传输归档… 7
4.设置自动应该归档… 8
5.实时应用归档(Real-time Apply) 8
三、日常维护… 9
6.1.查看 standby的应用模式… 9
6.2.查看是否已经实时应用归档… 10
6.3.查看 standby redo logfile 状态… 10
6.4查看未归档的信息… 10
附:standby db的各种模式的启动与改变… 11

Oracle Dataguard Real-time Apply

一、基本概念

1.1 Oracle Dataguard 的三种保护模式

1.1.1最大性能(maximize performance)模式

最大性能(maximize performance)是data guard默认的保护模式。primay上的事务commit前不需要从standby上收到反馈信息,该模式在primary故障时可能丢失数据,但standby对primary的性能影响最小。

1.1.2最大可用(maximize availability)模式

在正常情况下,最大可用模式和最大保护模式一样;在standby不可用时,最大可用模式会自动降低成最大性能模式,所以standby故障不会导致primay不可用。只要至少有一个standby可用的情况下,即使primary down机,也能保证不丢失数据。

1.1.3 最大保护(maximize protection)模式

最大保护(maximize protection)是最高级别的保护模式。primay上的事务在commit前必须确认redo已经传递到至少一个standby上,如果所有standby不可用,则primary会挂起。该模式能保证零数据丢失。

1.2 Oracle Dataguard两种日志传输方式

1.2.1 Arch:传统的日志传送方式。现在只有在最大性能模式时才能采用。归档日志通过primary上的arch进程传送给standby的RFS进程。

1.2.2 LGWR:oracle9i开始可以使用LGWR即时将日志传送到standby,而不再需要等到归档操作时才传送,已减少可能的数据丢失。在三种保护模式下都可以使用该方式传送日志。使用LGWR方式传送,在standby库上必须先建立standby redo logfile。其中LGWR还分为LGWR ASYNC(异步)和LGWR SYNC(同步)两种。

二、操作步骤

说明:本次设计中采用的是最大性能(maximize performance)和异步 (LGWR ASYNC)传输模式。

首先要确保主库是归档、force logging模式。

2.1设置主库为force logging

检查主DB是否为force logging 模式,使用如下SQL:

select force_logging from v$database;如果结果为NO,则使用如下SQL改变为强制日志模式。

SQL> alter database force logging;

此操作的目的用于忽略nologging选项不记录redo的请求。也就是说强制日志模式,就是所有的操作都会记入日志。

(注意:取消foece logging的SQL为:alter database no force logging;)

2.1.2设置主库为归档模式:
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /data/dbabc/arch
Oldest online log sequence 5330
Next log sequence to archive 5332
Current log sequence 5332

如果不是归档模式请使用以下命令

SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;

然后再通过archive log list命令查看是否是归档模式。

2.1.3设置dataguard的保护模式:

默认是最大性能模式(maximize performance),我们在这里也是采用的最大性能模式,不需要做更改。

SELECT database_role, protection_mode, protection_level FROM v$database;
SQL> select DATABASE_ROLE,PROTECTION_MODE,PROTECTION_LEVEL from v$database;
DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
----------------------- ------------------------------ ------------------------
PRIMARY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE

2.2创建备库

建立一个与主库相同的数据库。创建完之后shutdown备库

2.2.1 拷贝参数文件和密码文件

将主数据库的目录下 $ORACLE_HOME/dbs (Windows是在database下)下的参数文件initsid.ora,和密码文件 PWDsid.ora (本例是initdbabc.ora, PWDdbabc.ora)拷贝到standby数据库相同目录的文件夹下。密码文件要确保一至,在自动传输归档的时候要确保主从库的sys密码相同,否则不能自动传输归档。(这里与REMOTE_LOGIN_PASSWORDFILE参数有关)

2.2.2 拷贝数据文件

使用 select file_name,tablespace_name from dba_data_files ;语句查看表空间对应的数据文件,记得在COPY过程中对照相应的数据文件不要漏掉。

在主DB上设置表空间为备份模式

select 'alter tablespace ' ||name||' BEGIN backup;' from v$tablespace;

将得到的结果copy到Toad/或者Sqlplus中执行,使得所有的表空间处于备份模式,在执行过程中 temp表空间会出现错误,略过即可。
将主库上的所有*.dbf文件copy到备库的相应目录下。(在这里你可以使用scp或者FTP等操作完成copy)
copy结束后,将主库上的表空间设置为正常模式。命令就是将上述的begin backup 修改为end backup。

2.2.3 拷贝控制文件

在主库上使用命令:

alter database create standby controlfile as '/u01/standby.ctl'

将生成的控制文件’standby.ctl’copy到备库上,并覆盖备库的所有控制文件(默认是3个,通常情况下,都设置4个,其中3个在默认在$ORACLE_BASE/oradata/,第四个在/data/$ORACLE_SID/下,这里的位置可以通过show parameter control_files来显示)。
即拷贝standby.ctl文件到Stand By DB 控制文件目录 ,并且复制三份 ,分别起名为control01.ctl, control02.ctl , control03.ctl
如果有多元化control文件请覆盖相应的control文件。

2.2.4 Dataguard的启动
SQL> startup nomount
SQL> alter database mount standby database
SQL> recover standby database
SQL> recover standby database;
ORA-00279: change 1037178658 generated at 01/14/2009 09:53:58 needed for thread 1
ORA-00289: suggestion : /data/dbabc/arch/1_1813.arc
ORA-00280: change 1037178658 for thread 1 is in sequence #1813
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

记住1_1813.arc 然后从主库上将这个归档以及大于这个序号的归档copy到备库上。然后输入 auto
auto
这样的话就会应用归档。应用完之后会提示如下

ORA-00308: cannot open archived log '/data/dbabc/arch/1_1813.arc'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
ORA-00308: cannot open archived log '/data/dbabc/arch/1_1813.arc'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3

提示Linux Error: 2: No such file or directory
到此,一个手动应用归档的dataguard创建完成了,不过这样的dataguard管理起来比较麻烦,需要手动copy归档文件、创建数据文件、应用归档。下面配置一个完全自动管理的dataguard。

3.设置自动传输归档

由于备库的创建跟主库相同,所以好多参数就不需要修改了。这里只需要修改几个参数(主库:log_archive_dest_2、 备库:standby_archive_dest、standby_file_management)就ok了。
其中:
STANDBY_ARCHIVE_DEST is used when logs are transmitted automatically from the primary database. We use this parameter to determine where these logs should be placed.
LOG_ARCHIVE_DEST_1 is the location where we look for logfiles by default when recovering the standby database. It is recommended to set the values of STANDBY_ARCHIVE_DEST and LOG_ARCHIVE_DEST to the same values in most cases.

3.1参数的修改

3.1.1修改备库standby_archive_dest参数

备库上的standby_archive_dest参数表示主库上的归档传到备库上的归档路径,默认值是?/dbs/arch,而通常情况下,归档路径我们都不是取的默认值,所以这个参数需要修改,要跟备库上的归档路径相同,查看备库上的归档路径也就是log_archive_dest_1的值。可以通过以下命令查看:

SQL> show parameter log_archive_dest_1
NAME               TYPE        VALUE
----------------------------- ----------- ----------------------------
log_archive_dest_1     string      LOCATION=/data/dbabc/arch
log_archive_dest_10    string

或者

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /data/dbabc/arch
Oldest online log sequence     1
Next log sequence to archive   3
Current log sequence           3

中的Archive destination 对应的值。
这样的话自动应用归档的时候,不需要人工作任何的干预了。
使用下面的命令进行备库上的standby_archive_dest参数

ALTER SYSTEM SET standby_archive_dest='/data/dbabc/arch' scope=both;

修改成功之后可以通过show parameter standby_archive_dest查看

SQL> show parameter standby_archive_dest
NAME                                 TYPE        VALUE
----------------------------------- ----------- ------------------------------
standby_archive_dest                 string      /data/dbabc/arch
SQL>

查看的信息如上所示表示执行成功。下面修改主库的log_archive_dest_2参数

3.1.2修改主库上的log_archive_dest_2参数

在主库上使用如下命令来修改参数值

ALTER SYSTEM SET log_archive_dest_2='SERVICE=standby' scope=both;

其中’SERVICE=standby’中的standby是PrimaryDB中的tnsnames.ora中设置的 standby的连接方式,如下所示:这里只是举个例子

STANDBY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ora.dbabc.net)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dbabc)
)
)

在修改log_archive_dest_2之前,首先要确保 在主db上能够tnsping通standby。这样的话就需要在备库上启动监听,命令:lsnrctl start,从库上的监听启动之后在主db上用tnsping standby 查看是否ping的通,命令如下

ORA.DBABC.NET.</home/oracle>$tnsping standby
TNS Ping Utility for Linux: Version 9.2.0.7.0 - Production on 05-JAN-2009 10:22:09
Copyright (c) 1997 Oracle Corporation. All rights reserved.
Used parameter files:
/u01/product/oracle/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ora.dbabc.net)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = dbabc)))
OK (0 msec)

出现以上信息说明能够tnsping通。
配置备库参数:standby_file_management=auto,创建数据文件或者新的表空间的时候,如果数据库使用的是文件系统,那么不需要任何人为的干预。

3.2.测试自动传输归档

在主db上用使用以下sql

SQL> alter system switch logfile;

System altered.

通过alter system switch logfile对主库进行强制归档,生产arch文件,然后在standbydb上查看归档是否自动传输过来,传过来以后,在standby上执行recover standby database;手动应用归档.(使用auto)
需要注意的是通过自动传输归档要确保两个dataguard的所有数据库的sys密码相同(与主库上的REMOTE_LOGIN_PASSWORDFILE参数有关,此参数通常情况下的设置是),否则无法传输归档。从db上的归档如果自动传输过来了,就配置ok了。如果没传输成功的话,请注意以下几点:
a.       网络是否畅通
b.      Sys密码文件是否相同
c.       tnsping是否能够ping的通(这包括主db上的tnsnames.ora中的链接方式是否正确以及从db上的监听是否start)
按照以上的修改,如果一切正常的话,现在就可以实现自动传输归档了。若有问题请参照以上步骤是否设置的正确。

4.设置自动应用归档

在上述步骤中的StandbyDB是启动到mount状态(startup nomount  \  Alter database mount standby database)的,我们使用的是手动归档的方式来应用归档(alter database recover standby database)的
设置成自动应用归档的话需要使用以下sql:

alter database recover managed standby database disconnect from session;
(查看归档状态select recovery_mode from v$archive_dest_status where dest_id=2;)

5.实时应用归档(Real-time Apply)(oracle 9i无实时应用功能)

在基本概念中已经讲过通过LGWR可以实现即时传输归档,而不再需要等到归档操作时才传送,这样可最大话的减少数据的损失,要想实现实时应用归档(Real-time Apply),必须要采用LGWR的方式传输归档。在修改为LGWR传输日志方式的时候必须要在备库上添加standby redo logfile。下面我们来添加standby redo logfile。

5.1添加standby redo logfile
在添加standby redo logfile之前首先要停止上述第4步设置的standby自动应用归档状态

SQL> alter database recover managed standby database finish;
Database altered.

使用以上sql命令可以停止自动应用归档
如果没有停止自动恢复状态就添加standby logfile,会报错:

ORA-01156: recovery in progress may need access to files

然后添加standby redo logfile。
为备库添加standby logfile,这里要保证standby logfile与主库联机日志文件相同大小。
添加standby logfile的规则是:
备用日志最少应该比redo log 组多一个。推荐的standby logfile数目依赖于主库上的线程数。
官方公式(英文):

(maximum number of logfiles for each thread + 1) * maximum number of threads

(每线程日志文件最大数目 + 1 ) * 线程数
通过以下命令来添加standby logfile,这里我们添加了4个standby logfile。
注意: 在为standby添加standby_logfile时,首先使用如下SQL查询standby_log的group#是否已经存在.

select * from v$standby_log;(或select group# from v$standby_log;),

然后再执行如下命令添加

alter database add standby logfile
group 4 ('/data/dbabc/standby_log4.log') size 50m,
group 5 ('/data/dbabc/standby_log5.log') size 50m,
group 6 ('/data/dbabc/standby_log6.log’) size 50m,
group 7 ('/data/dbabc/standby_log7.log') size 50m;

同样删除Standby logfile 通过以下sql

alter database drop standby logfile group 8;

注意standby logfile的group名不能和primary的redo logfile group重复,因为我的primay已经有3组日志了,这里添加的三组standby logfile从group 4开始。同时standby redo logfile的大小和primary的redo logfile保持一致。

添加完standby logfile之后再在primary上修改为用LGWR传送日志
修改日志的传输方式,使用以下命令

SQL> alter system set log_archive_dest_2='service=standby lgwr async affirm';

当然你也可以使用以下比较详细的参数,具体值的信息略。

alter system set log_archive_dest_2='SERVICE=standby lgwr async affirm VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=dbabc

上面的设置完成之后使用

recover managed standby database using current logfile disconnect from session;

这个命令启动实时应用归档。
下面通过这个sql来查看是否是Real-time Apply

SQL> select recovery_mode from v$archive_dest_status where dest_id=2;

RECOVERY_MODE

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

MANAGED REAL TIME APPLY

三、日常维护

Dataguard日常维护与点检

6.1.查看 standby的应用模式

SQL> select recovery_mode from v$archive_dest_status where dest_id=2;

RECOVERY_MODE

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

MANAGED REAL TIME APPLY

6.2.查看是否已经实时应用归档

SQL> select process,block#,blocks ,status ,sequence# from v$managed_standby;

PROCESS BLOCK# BLOCKS STATUS SEQUENCE#

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

ARCH 1 2 CLOSING 5348

ARCH 83969 853 CLOSING 5358

MRP0 2541 102400 APPLYING_LOG 5359

RFS 0 0 IDLE 0

RFS 2416 127 IDLE 5359

其中MRP 的SEQUENCE#与RFS的SEQUENCE# 相等,说明实时应用归档成功。

6.3.查看 standby redo logfile 状态

SQL> SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG;

GROUP# THREAD# SEQUENCE# ARCHIVED STATUS

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

4 1 5359 YES ACTIVE

5 1 0 NO UNASSIGNED

6 0 0 YES UNASSIGNED

7 0 0 YES UNASSIGNED

6.4查看未归档的信息

SQL> select name,creator,sequence#,applied,completion_time from v$archived_log where applied='NO';

附:standby db的各种模式的启动与改变

(1)启动到管理模式
SQL>shutdown immediate; #关闭数据库

SQL>startup nomount; #启动到nomount状态

SQL>alter database mount standby database; #启动到mount状态

SQL>alter database recover managed standby database disconnect from session; #启动自动应用归档状态。

以上命令是启用自动应用归档,但是并没有启动实时应用归档,要启用使用应用归档必须使用以下sql实现

recover managed standby database using current logfile disconnect from session;
(2)启动到只读方式
SQL>shutdown immediate;

SQL>startup nomount;

SQL>alter database mount standby database;

SQL>alter database open read only;
(3)如果在管理恢复模式下到只读模式
SQL>recover managed standby database cancel;

alter database recover managed standby database finish;

SQL>alter database open read only;
(4)从只读方式到管理恢复方式
SQL>recover managed standby database disconnect from session;

如果执行这条 命令出现如下错误,是由于standby 库在read only状态有session正在连接,请断开standby db的session 就ok了。

SQL> recover managed standby database disconnect from session;

ORA-01093: ALTER DATABASE CLOSE only permitted with no sessions connected

无觅相关文章插件,快速提升流量

Copyright © Dbabc.Net All Rights Reserved. 本站内容仅代表个人观点, 与其他任何组织或公司无关

-The End-

发表评论


*

为你保密









Copyright © Dbabc.Net All Rights Reserved. 本站内容仅代表个人观点, 与其他任何组织或公司无关

Powered by Wordpress and Theme by WPYOU