Oracle Dataguard Real-time Apply
转载请注明文章转载自: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