Oracle Dataguard Real-time Apply
TOC \o "1-3" \h \z \u 一、基本概念... PAGEREF _Toc219714405 \h 2
1.1 Oracle Dataguard 的三种保护模式... PAGEREF _Toc219714406 \h 2
1.1.1最大性能(maximize performance)模式... PAGEREF _Toc219714407 \h 2
1.1.2最大可用(maximize availability)模式... PAGEREF _Toc219714408 \h 2
1.1.3 最大保护(maximize protection)模式... PAGEREF _Toc219714409 \h 2
1.2 Oracle Dataguard两种日志传输方式... PAGEREF _Toc219714410 \h 2
1.2.1 Arch. PAGEREF _Toc219714411 \h 2
1.2.2 LGWR.. PAGEREF _Toc219714412 \h 2
二、操作步骤... PAGEREF _Toc219714413 \h 2
2.1设置主库为force logging. PAGEREF _Toc219714414 \h 3
2.1.2设置主库为归档模式:... PAGEREF _Toc219714415 \h 3
2.1.3设置dataguard的保护模式:... PAGEREF _Toc219714416 \h 3
2.2创建备库... PAGEREF _Toc219714417 \h 4
2.2.1 拷贝参数文件和密码文件... PAGEREF _Toc219714418 \h 4
2.2.2 拷贝数据文件... PAGEREF _Toc219714419 \h 4
2.2.3 拷贝控制文件... PAGEREF _Toc219714420 \h 4
2.2.4 Dataguard的启动... PAGEREF _Toc219714421 \h 4
3.设置自动传输归档... PAGEREF _Toc219714422 \h 5
3.1参数的修改... PAGEREF _Toc219714423 \h 6
3.1.1修改备库standby_archive_dest参数... PAGEREF _Toc219714424 \h 6
3.1.2修改主库上的log_archive_dest_2参数... PAGEREF _Toc219714425 \h 6
3.2.测试自动传输归档... PAGEREF _Toc219714426 \h 7
4.设置自动应该归档... PAGEREF _Toc219714427 \h 8
5.实时应用归档(Real-time Apply) PAGEREF _Toc219714428 \h 8
三、日常维护... PAGEREF _Toc219714429 \h 9
6.1.查看 standby的应用模式... PAGEREF _Toc219714430 \h 9
6.2.查看是否已经实时应用归档... PAGEREF _Toc219714431 \h 10
6.3.查看 standby redo logfile 状态... PAGEREF _Toc219714432 \h 10
6.4查看未归档的信息... PAGEREF _Toc219714433 \h 10
附:standby db的各种模式的启动与改变... PAGEREF _Toc219714434 \h 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/foxcom/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 (本例是initfoxcom.ora, PWDfoxcom.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/foxcom/arch/1_1813.arc
ORA-00280: change 1037178658 for thread 1 is in sequence #1813
Specify log: {=suggested | filename | AUTO | CANCEL}
记住1_1813.arc 然后从主库上将这个归档以及大于这个序号的归档copy到备库上。然后输入 auto
auto
这样的话就会应用归档。应用完之后会提示如下
ORA-00308: cannot open archived log '/data/foxcom/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/foxcom/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_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
*.db_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
。这里只需要修改几个参数(主库: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/foxcom/arch
log_archive_dest_10 string
或者SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /data/foxcom/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/foxcom/arch' scope=both;
修改成功之后可以通过show parameter standby_archive_dest查看
SQL> show parameter standby_archive_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
standby_archive_dest string /data/foxcom/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 = 10.194.18.18)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = foxcom)
)
)
在修改log_archive_dest_2之前,首先要确保 在主db上能够tnsping通standby。这样的话就需要在备库上启动监听,命令:lsnrctl start,从库上的监听启动之后在主db上用tnsping standby 查看是否ping的通,命令如下
FOXCOMDB.$tnsping standby
TNSPingUtility for Linux: Version9.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 = 10.194.18.18)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = foxcom)))
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 cancel;
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/foxcom/standby_log4.log') size50m,
group 5 ('/data/foxcom/standby_log5.log') size50m,
group 6 ('/data/foxcom/standby_log6.log’) size50m,
group 7 ('/data/foxcom/standby_log7.log') size50m;
同样删除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 noaffirm';
当然你也可以使用以下比较详细的参数,具体值的信息略。
alter system set log_archive_dest_2='SERVICE=standby lgwr async noaffirm VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=foxcom
上面的设置完成之后使用
在備庫上設置如下命令:
Alter database 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,status,thread#,sequence#, block#, blocks
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';
6.5查看未归档的信息
select dest_name,status,error from v$archive_dest;
附: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
1.设置闪回恢复区
SQL> alter system set db_recovery_file_dest_size=2G;
系统已更改。
SQL> alter system set db_recovery_file_dest='e:/oracle/back';
系统已更改。
2.取消备库的自动恢复状态
SQL> alter database recover managed standby database cancel;
数据库已更改。
3.创建一个还原点
SQL> create restore point restore_point_test guarantee flashback database;
还原点已创建。
4.在主库归档当前日志,确保前一步创建还原点的scn的归档日志已经传到备库
SQL> alter system archive log current;
系统已更改。
5.将主库到备库的归档目的地的状态设置为defer
SQL> alter system set log_archive_dest_state_2=defer;
系统已更改。
SQL> alter database activate standby database;
数据库已更改。
SQL> alter database open;
数据库已更改。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26524282/viewspace-1306443/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26524282/viewspace-1306443/