Oracle 9.2.0.4 DataGuard 总结

来源:互联网 发布:欢迎光临阳西网络问政 编辑:程序博客网 时间:2024/05/04 05:06
参考连接
Dataguard配置Step by Step
http://www.eygle.com/ha/dataguard-step-by-step.htm
DataGuard基本概念
http://www.itpub.net/715289.html
在RHEL3上配置oracle 10g data guard
http://wxy0327.itpub.net/post/16888/92718

DG三种模式
一、最大保护
二、最大可用性。采用lgwr日志传输模式,可以同和异步方式传redo,standby需要有在线日志redo存在,否则主机的在线日志会逐渐的添充到归档日志中,可是并不能完填充,这
样就会导灾难的后果。
LGWR transmission is specified through the log_archive_dest_n option LGWR:
log_archive_dest_2='service=to_standby lgwr'
If LGWR transmission is used, there should be a row having client_process=LGWR in v$managed_standby.
arch方式传输归档日志
log_archive_dest_2='service=to_standby arch'
三、最大性能
建立备用服务器有如下要求:
1、        主节点必须运行在归档模式下
2、        主节点与备用节点最好有相同的OS版本,一般beta号差一点还是可以的
3、        主节点与备用节点必须有相同的数据库版本和兼容版本
 

配置dataguard实现oracle双机热备,故障切换,把损失降到最小。
主要分为以下几个步骤
一、安装主备两台oracle9i数据库,目录保持一致。设置好主库的归档方式及归档路径。
二、把主节点的数据文件,重做日志复制到备机上面。在主节点生成备机的控制文件,参数文件并复制到备机上面。
三、配置主备机listener.ora 、tnsnames.ora
四、启动备机数据库
五、在主机上面设置归档路径到备机。
六、观察日志文件进行测试
七、DG归档日志处理
 
下面详细说明每步操作:
一、双机安装装备
主机:192.168.0.25    备机:192.168.0.127
1.1 双机安装oracle
两台机器安装oracle,如果原来已经有一台机器了,那么只需要在备机安装oracle及数据库,测试可以正常启动和关闭.

2.1准备把主机数据文件参数文件,控制文件,密码文件复制到备机。
在备机上面操作:
进入oracle数据文件所在目录,cd /opt/ora9/oradata/oradb/
删除目录下面所有文件。
cd /opt/ora9/product/9.2.0.4/dbs/
mv spfileoradb.ora spfileora.ora.bak  (这个操作的目录是使用备机在启动时使用在主机上生成参数文件来启动)
mv orapworadb orapworadb.bak   (同样为了使用主机上面的密码文件)
2.2
进入主机操作:
sql>startup 启动
SQL> archive log list;  修改好归档方式及路径
sql>alter database create standby controlfile as '/opt/standby.ctl';  生成控制文件
SQL> create pfile from spfile; 生成参数文件
SQL> !
[oracle@standby oracle]$ cd $ORACLE_HOME/dbs
[oracle@standby dbs]$ ls
initoradb.ora 看到这个文件就对了。

下面这些文件复制到备机上面并放在相应的目录
同步数据文件目录
rsync -ave ssh /opt/ora9/oradata/oradb/ 192.168.0.127:/opt/ora9/oradata/oradb/
复制参数文件
scp /opt/ora9/product/9.2.0.4/dbs/initoradb.ora 192.168.0.127:/opt/ora9/product/9.2.0.4/dbs/
复制密码文件
scp /opt/ora9/product/9.2.0.4/dbs/orapworadb 192.168.0.127:/opt/ora9/product/9.2.0.4/dbs/
复制控制文件
scp /opt/standby.ctl 192.168.0.127:/opt/ora9/oradata/oradb/
以上文件权限都要是oracle用户

在备机上面操作
修改参数文件
vi /opt/ora9/product/9.2.0.4/dbs/initoradb.ora
*.control_files='/opt/ora9/oradata/oradb/standby.ctl'  主要修改好控制文件名字
添加如下四行
*.standby_archive_dest='/opt/standby/arch'   (主机同步过的归档日志存放位置)      
*.fal_server='PRIMARY'
*.fal_client='STANDBY'
*.standby_file_management='AUTO'

三、配置主备机listener.ora、tnsname.ora
在主机上面操作
vi listener.ora  这个文件基本不用修改,lsnrctl start启动正常,端口处于监听。
主要修改tnsname.ora
vi tnsname.ora  添加如下内容

primary.test.com =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.25)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = oradb)
      (SERVER = DEDICATED)
    )
  )
standby.test.com =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.127)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = oradb)
      (SERVER = DEDICATED)
    )
  )
 
在备机上面做和上面同样操作,之后分别主备机上面做tnsping 测试
如:tnsping primary.test.com tnsping standby.test.com看到ok就行了。

四、启动备用数据库
sqlp " as sysdba "  登录
sql>startup nomount;
sql>alter database mount standby database;
sql>alter database recover managed standby database disconnect from session;
五、
在主机上操作,添加归档路径
SQL> alter system set log_archive_dest_2='service=standby.test.com mandatory reopen=60';

六、测试一下
在主机上面
create table test (varchar2 (20));
insert into test values ('aaaa');
commit;
SQL> alter system switch logfile;

在备用节点观察日志
tail -f /opt/ora9/admin/oradb/bdump/alert_oradb.log
Datafile 7: '/opt/ora9/oradata/oradb/odm01.dbf'
Starting datafile 8 recovery in thread 1 sequence 11
Datafile 8: '/opt/ora9/oradata/oradb/tools01.dbf'
Starting datafile 9 recovery in thread 1 sequence 11
Datafile 9: '/opt/ora9/oradata/oradb/users01.dbf'
Starting datafile 10 recovery in thread 1 sequence 11
Datafile 10: '/opt/ora9/oradata/oradb/xdb01.dbf'
Media Recovery Waiting for thread 1 seq# 11
Tue Jul 28 14:45:25 2026
Completed: alter database recover managed standby database di

把备机变成只读模式。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Database altered.
SQL> ALTER DATABASE OPEN READ ONLY;
Database altered.
sql> select * from test
应该看到和主库一样的内容
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; 
回到备机模式。

七、主机切换到备机
1.在主机192.168.0.25上面操作,创建恢复归档保存位置。
alter system set standby_archive_dest='/opt/standby/arch';
SQL> alter database commit to switchover to physical standby;
Database altered.
SQL> shutdown immediate
SQL> startup nomount;
SQL> alter database mount standby database;
SQL> select name,open_mode,PROTECTION_MODE,DATABASE_ROLE from v$database;
NAME OPEN_MODE PROTECTION_MODE DATABASE_ROLE
--------- ---------- -------------------- ----------------
PRIMARY MOUNTED MAXIMUM PERFORMANCE PHYSICAL STANDBY
上面信息中看到了主机已经变为了standby
sql>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
进入归档恢复。
2.在备机192.168.0.127上面操作.

SQL> alter database commit to switchover to primary;
切到主机模式。
SQL> shutdown immediate;
ORA-01507: database not mounted
SQL> startup
ORACLE instance started.
SQL> alter system set log_archive_dest_2='service=standby.test.com mandatory reopen=60';
 
测试一下,在原备机192.168.0.127也就是现在主机上面执行下面:
SQL> insert into test values ('dddd');
1 row created.
SQL> commit;

SQL> alter system switch logfile;
System altered.
 

查看原主机192.168.0.25也就是现在备机上面的日志:
tail -f /opt/ora9/admin/oradb/bdump/alert_oradb.log
Mon Aug 21 21:55:41 2006
Restarting dead background process QMN0
QMN0 started with pid=14
Mon Aug 21 21:57:46 2006
Media Recovery Log /opt/standby/arch/1_15.dbf
Media Recovery Waiting for thread 1 seq# 16
Media Recovery Log /opt/standby/arch/1_16.dbf
Media Recovery Waiting for thread 1 seq# 17

以只读模式打开数据库:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Database altered.
SQL> ALTER DATABASE OPEN READ ONLY;
Database altered.
SQL> select * from test;
NAME
------------------------------
aaa
bbbb
cccc
dddd

应该看到刚才插入的内容。
sql>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;变为归档恢复模式。
 
八、切换回原来的主机
在原备机192.168.0.127也就是刚才的主机上面操作:
SQL> alter database commit to switchover to physical standby;
Database altered.
SQL> shutdown immediate
ORA-01507: database not mounted

statORACLE instance shut down.
SQL> startup nomount;
ORACLE instance started.
SQL> alter database mount standby database;
Database altered.
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
Database altered.
tail -f /opt/ora9/admin/oradb/bdump/alert_oradb.log查看日志变化

在原主机192.168.0.25也就是刚才备机上面操作
SQL> alter database commit to switchover to primary;
Database altered.
SQL> shutdown immediate;
ORA-01507: database not mounted

ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area  236000356 bytes
Fixed Size                   451684 bytes
Variable Size             201326592 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
Database mounted.
Database opened.

这样就又原回到原来状态,完成自由切换,用上面的方法进行归档日志恢复测试。
 

从最大性能转换到最大可用性。
在 primary DB 上:
shutdown immediate;
startup mount;
alter database set standby database to maximize availability;
alter database open;
 
physical是直接应用归档日志的,而logical的方式则是需要把所有的归档转换成SQL语句再在logical standby database上执行它。这会占用大量的系统资源,如CPU,memory,I/O
等。
 
 
 

高级应用
参考:http://zbig.3322.org/bbs/dispbbs.asp?boardID=6&ID=50
 
四、采用Arch 进程传送归档日志的最大性
能模式
在默认情况下,Data guard就是最大性能模式,所以不需要采用其它额外的配置,我们只需
要修改主数据库的第二个归档路径即可。
SQL>alter system set log_archive_dest_2='SERVICE=dbstandby REOPEN=300' scope=both;
SQL>alter system set log_archive_dest_state_2=enable scope=both;
SQL>alter system archive log current;
其中reopen表示了如果发生归档失败后,第二次重复的时间间隔(秒),这种方式是从8i以
来一直采用的一种方式,具有比较稳定,不影响数据库的性能,如果发生网络失败等原因,
主数据库不会因为远程归档不成功而停下来。

五、采用Lgwr进程传递联日志机的最大性能模式
5.1关于LGWR传递Redo和Standby Redo Log
Data Guard除了以上传统的Arch日志传送过程外,还可以采用联机日志的传送,在备用端
建议创建一组备用日志,并保持与主数据库备用日志相同大小,而且最好比主数据库的联
机日志多一组以上。
如果采用联机日志传送,但是不在备用端创建备用日志的话,联机日志将自动写到备用端
的归档日志中。
在备用日志或者当前正在归档的日志中的内容是不能马上被应用的,必须当归档完成后才
由MRPn进程应用到备用数据库,所以说,恢复不是连续的,但是,传送过程可以是连续
的,在备用日志或当前归档日志中的内容,如果有需要,可以最终被指定应用到备用数据
库。
如果在Rac 环境下,Standby 上的redo 被所有instances 的LGWR 一起使用. 而没有按
instances 分开。
如果在创建数据库或者控制文件的时候,MAXLOGFILES参数指定过小,将影响到备用日
志的创建,这种情况下,必须重新创建控制文件才能解决相应问题。
5.2创建Standby Redo Log
在决定采用redo日志传送之前,先在备用数据库上创建备用日志
SQL>alter database add standby logfile
'/u01/oracle/oradata/tbdb/stdy_redo01.log' size 100m;
或者
SQL>alter database add standby LOGFILE
GROUP 4 ('/u01/oracle/oradata/tbdb/stdy_redo04.log') SIZE 102400K,
SQL>alter database add standby LOGFILE
GROUP 5 ('/u01/oracle/oradata/tbdb/stdy_redo05.log') SIZE 102400K,
SQL>alter database add standby LOGFILE
GROUP 6 ('/u01/oracle/oradata/tbdb/stdy_redo06.log') SIZE 102400K,
SQL>alter database add standby LOGFILE
GROUP 7 ('/u01/oracle/oradata/tbdb/stdy_redo07.log') SIZE 102400K,
5.4修改主库的归档路径
同前面介绍的用ARCH 进程传递archived log相比,只面作以下更改:
SQL>alter system set LOG_ARCHIVE_DEST_2=’SERVICE=dbstandby LGWR’
scope=both
另外,如果考虑到以后该库可能被切换到备用数据库,也可以创建同样的备用日志
组:
SQL>alter database add standby LOGFILE
GROUP 4 ('/u01/oracle/oradata/tbdb/stdy_redo04.log') SIZE 102400K,
GROUP 5 ('/u01/oracle/oradata/tbdb/stdy_redo05.log') SIZE 102400K,
GROUP 6 ('/u01/oracle/oradata/tbdb/stdy_redo06.log') SIZE 102400K,
GROUP 7 ('/u01/oracle/oradata/tbdb/stdy_redo07.log') SIZE 102400K;
备用日志的信息可以通过视图
V$STANDBY_LOG 与V$LOGFILE 获得
LGWR 直接将log buffer 中的事务数据异步(async 缺省)通过net8 传递给从库,从库的RFS
进程接收Redo data, 并写到Standby Redo Log中, 然后,当主库发生log switch时,从库
的ARC0,ARC1 进程将redo log写到archived log file 中,一旦archived log 可用,MRP0 马
上将归档日志应用到数据文件及控制文件中。
如果想最终应用备用日志中的日志,可以用命令(见失败切换过程)
alter database recover managed standby database finish;

六、决定归档的一些参数说明
6.1 ARCH与LGWR
采用归档日志传送还是联机日志传送,默认是归档进程
是否采用ARCH进程还是LGWR进程,很多时候依赖于保护的方式,下表可以看到在不同的
保护模式下,采用归档进程还是联机日志进程的情况。
最大保护最大可用最大性能
进程LGWR LGWR LGWR或ARCH
网络传输模式SYNC SYNC LGWR时设置ASYNC
磁盘写操作AFFIRM AFFIRM NOAFFIRM
备用日志Yes 物理备用需要LGWR和物理备用时需要
备用库类型物理物理或逻辑物理或逻辑
6.2 SYNC与ASYNC 和AFFIRM 与NOAFFIRM
SYNC与ASYNC决定了网络传输的同步与异步操作,默认ASYNC
AFFIRM与NOAFFIRM决定了归档日志磁盘写的同步与异步操作,默认NOAFFIRM。
这两个参数用来决定不同的保护模式。
网络I/O 性质归档日志磁盘I/O性质物理备用的性能保护的级别
SYNC AFFIRM Lowest Highest
SYNC NOAFFIRM Low High
ASYNC AFFIRM High Low
ASYNC NOAFFIRM Highest Lowest
6.3 DELAY 与NODELAY
是否延迟同步,默认不延迟,如果选择DELAY,默认30 分钟

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE NODELAY;
还可以设置在主数据库上
LOG_ARCHIVE_DEST_3=’SERVICE=stby1 DELAY=240’
LOG_ARCHIVE_DEST_STATE_3=ENABLE
延迟参数并不影响日志的传送
6.4 MANDATORY 与OPTIONAL
默认是OPTIONAL,如果设置MANDATORY,表示一定要归档成功,否则将引发主数据库
的归档等待。
Oracle建议采用OPTIONAL方式来传送日志。
18
6.5 REOPEN 与NOREOPEN 和MAX_FAILURE 与
NOMAX_FAILURE
REOPEN 与NOREOPEN 决定是否重试操作,默认是REOPEN,300 秒,表示如果失败后,
最小的重试的时间间隔
Noreopen表示不重试失败操作
MAX_FAILURE 与NOMAX_FAILURE 表示最大重试次数,默认是NOMAX_FAILURE,表
示一直重试,如果是MAX_FAILURE,则采用MAX_FAILURE=count 来决定重试的次数,
如果是MAX_FAILURE,则一定需要在REOPEN模式下
6.6 ALTERNATE 与NOALTERNATE
表示如果归档失败,是否转向新的归档路径,默认是的NO ALTERNATE
如采用如下配置
LOG_ARCHIVE_DEST_2=’LOCATION=/disk1 MANDATORY
ALTERNATE=LOG_ARCHIVE_DEST_3’
LOG_ARCHIVE_DEST_STATE_2=ENABLE
LOG_ARCHIVE_DEST_3=’LOCATION=/disk2 MANDATORY’
LOG_ARCHIVE_DEST_STATE_3=ALTERNATE
那么就是说,如果路径2 上归档失败的话,将切换到路径3继续归档。
七、验证备用服务器是否工作
我们可以通过视图查看日志应用情况
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME, APPLIED
FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIM NEXT_TIME
---------- --------- ---------
3 08-JUN-04 08-JUN-04 YES
4 08-JUN-04 08-JUN-04 YES
5 08-JUN-04 09-JUN-04 YES --新传过来的归档日志文件
或者查看alert日志文件,如有如下内容表示正在恢复,而且在等待下一个日志。
alter database recover managed standby database disconnect from session
Attempt to start background Managed Standby Recovery process
MRP0 started with pid=11
MRP0: Background Managed Standby Recovery process started
Starting datafile 1 recovery in thread 1 sequence 5
Datafile 1: '/u01/oracle/oradata/tbdb/system01.dbf'
Starting datafile 2 recovery in thread 1 sequence 5
Datafile 2: '/u01/oracle/oradata/tbdb/undotbs01.dbf'
19
Starting datafile 3 recovery in thread 1 sequence 5
Datafile 3: '/u01/oracle/oradata/tbdb/indx01.dbf'
Starting datafile 4 recovery in thread 1 sequence 5
Datafile 4: '/u01/oracle/oradata/tbdb/tools01.dbf'
Starting datafile 5 recovery in thread 1 sequence 5
Datafile 5: '/u01/oracle/oradata/tbdb/users01.dbf'
Media Recovery Waiting for thread 1 seq# 5
Wed Jun 9 02:20:04 2004
Completed: alter database recover managed standby database di
Wed Jun 9 02:28:18 2004
Media Recovery Log /u01/oracle/oradata/tbdb/archive/1_5.dbf
Media Recovery Waiting for thread 1 seq# 6
其它的备用数据库相关视图还有
V$MANAGED_STANDBY
(Physical Standby Databases Only) 会纪录当前从库的一些进程情况和进程的process id,如
rfs,mrp等
V$ARCHIVE_GAP
这里面会纪录当前从库mrp进程恢复需要的胆识还没有传到从库得日志
V$DATAGUARD_STATUS
备用库的状态与信息
V$STANDBY_LOG
备用数据库的备用日志的数量与当前状态等信息
八、最大保护模式
8.1 环境要求
Data Guard配置环境中,最大保护模式时至少有一个Standby DB满足以下最低要求:
Redo archival process :LGWR
Network transmission mode :SYNC
Disk write option :AFFIRM
Standby redo logs required? :Yes
Database type :Physical
在Maximum Protection Mode下,Oracle建议至少配置2个Standby, 因为如果其中一个不能从
主库接收日志,主库可继续运行.
8.2 配置最大保护模式
在备用数据库上
添加Standby Redo Log
20
SQL> alter database add standby logfile
GROUP 4 ('/u01/oracle/oradata/tbdb/stdy_redo04.log') SIZE 102400K,
GROUP 5 ('/u01/oracle/oradata/tbdb/stdy_redo05.log') SIZE 102400K,
GROUP 6 ('/u01/oracle/oradata/tbdb/stdy_redo06.log') SIZE 102400K,
GROUP 7 ('/u01/oracle/oradata/tbdb/stdy_redo07.log') SIZE 102400K;
启动到managed recovery模式
SQL> recover managed standby database disconnect from session;
保证备用库的监听正常,保证主数据库到备用数据库的连接正常。
修改归档参数
8.3 转换模式由最大性能到最大保护
在主库上,检查当前模式
SQL>select protection_mode from v$database;
PROTECTION_MODE
--------------------
MAXIMUM PERFORMANCE
SQL>shutdown immediate;
SQL>startup mount
SQL> alter system set log_archive_dest_2='SERVICE=dbstandby LGWR SYNC AFFIRM '
scope=both;
SQL>alter database set standby database to maximize protection;
SQL>alter database open;
SQL> select protection_mode from v$database;
PROTECTION_MODE
--------------------
MAXIMUM PROTECTION
模式切换的完全的语法如下
ALTER DATABASE SET STANDBY DATABASE TO
MAXIMIZE {PROTECTION | AVAILABILITY | PERFORMANCE}
注意:
1、在Data Guard环境中,如果要在最大保护模式下,必须至少一个Standby的设置满足以
下条件
alter system set log_archive_dest_2='SERVICE=dbstandby LGWR SYNC AFFIRM';
并将主库设置到Maximum Protection,备库可以在Maximum Performance,也可设置在
Maximum Protection.
2、最大保护模式下,Standby方的MRP0仍是需要等待Primary的当前日志归档后(由Log
switch触发)才能应用到database中。这在所有模式中均一样。在failover的时候,可以

alter database recover managed standby database finish;
应用日志, 这样不会丢失数据.
3、最大保护模式下,处于最大保护模式下的备用数据库不能正常的关闭,必须要保持与主
库一致的模式,如果采用abort强行关闭或者系统与网络故障,在主数据库上进行的任何事
务,将导致主数据库的关闭,在alert日志中,会有如下的记载
Tue Jun 15 12:06:04 2004
Network asynch I/O wait error 3114 log 3 service 'dbstandby'
LGWR: All standby destinations have failed (16098)
******************************************************
WARNING: All standby database destinations have failed
WARNING: Instance shutdown required to protect primary
******************************************************
LGWR: terminating instance due to error 16098
Instance terminated by LGWR, pid = 25034
 
九、日常管理
9.1 备用服务器的管理模式与只读模式
1、启动到管理模式
SQL>shutdown immediate
SQL>startup nomount pfile=?/dbs/inittbdbsdby.ora
SQL>alter database mount standby database
SQL>alter database recover managed standby database disconnect from session;
2、启动到只读方式
SQL>shutdown immediate
SQL>startup nomount pfile=?/dbs/inittbdbsdby.ora
SQL>alter database mount standby database
SQL>alter database open read only
3、如果在管理恢复模式下到只读模式
SQL>recover managed standby database cancel;
SQL>alter database open read only;
这个时候,可以给数据库增加临时数据文件(这个在热备份的时候是没有备份过来的)

alter tablespace temp add tempfile '/u01/oracle/oradata/tbdb/temp01.dbf' size 100M;
4、从只读方式到管理恢复方式
SQ>recover managed standby database disconnect from session;
9.2 备用服务器日志删除
备用服务器的日志删除也必须小心,因为如果有些日志还没有被备用服务器应用而该日志被
22
删除的话,将引起备用数据库无法往下应用新的日志。
删除备用服务器的日志的脚本为:
$ more removearchive.sh
#!/bin/sh
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/9.2;export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;export PATH
ORACLE_SID=tbdb; export ORACLE_SID
grep "Media Recovery Log"
$ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_${ORACLE_SID}.log|/
awk '{print $4}'|sed -e 's/^/rm /' >$ORACLE_BASE/work/worksh/rmarchlog.sh
chmod +x $ORACLE_BASE/work/worksh/rmarchlog.sh
$ORACLE_BASE/work/worksh/rmarchlog.sh
cd $ORACLE_BASE/admin/$ORACLE_SID/bdump
cat alert_${ORACLE_SID}.log >>alert_${ORACLE_SID}.log.bak
echo ''>alert_${ORACLE_SID}.log
rm -f $ORACLE_BASE/work/worksh/rmarchlog.sh
9.3 日志延迟检查
备用服务器可能有这样的情况发生,因为日志块逻辑损坏,所以必须对日志应用进行检查,
防止日志应用被停止,防患于未然,当然我们可以手工检查,但是以下脚本则可以实现自动
检查(放到cron中),如果发现问题则并发送mail到指定邮箱
$ more checklog.sh
#!/bin/sh
#first u must set env
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/9.2;export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;export PATH
ORACLE_SID=tbdb; export ORACLE_SID
#start check
DATE=`date +%Y-%m-%d:%H:%M:%S`
filepath=$ORACLE_BASE/oradata/$ORACLE_SID/archive/
logpath=$ORACLE_BASE/admin/$ORACLE_SID/bdump
remotefile=`ssh oracle@10.0.29.164 "ls -t /u01/oracle/oradata/tbdb/archive/*|head -1|sed -e
's/.*_1_//g' |sed -e 's//.arc$//g'"`
echo "CHECK TIME:"${DATE}
echo "remote file:"$remotefile
23
cd $filepath
varfile=`ls -tl | grep "arch" | head -1|sed -e 's/.*_1_//g' |sed -e 's//.arc$//g'`
echo "archive file:"$varfile
cd $logpath
varlog=`grep "Media Recovery Log" alert_${ORACLE_SID}.log | tail -1 |sed -e 's/.*_1_//g' | sed
-e 's//.arc$//g'`
echo "applice file:"$varlog
vs1=$(($remotefile-$varfile))
vs2=$(($varfile-$varlog))
#if log is not be sended then mail to me
if [ $vs1 -ge 3 ]
then
echo "send error!"
mail -s "error!" chenjiping@itown.net.cn < $ORACLE_BASE/work/worksh/mail.txt
else
echo "send is ok!"
echo
fi
#if log is not be apped then mail to me
if [ $vs2 -ge 3 ]
then
echo "applice error!"
mail -s "error!" chenjiping@itown.net.cn < $ORACLE_BASE/work/worksh/mail.txt
else
echo "applice is ok!"
echo
fi
十、主库与备库的正常切换
注意:Swithover时只能先从Primary切到Standby,再从Standby切到Primary.
以下顺序不能颠倒,如果采用standby redo log 的需要注意在切换前在主数据库创建同样的
standby redo log。
1、切换之前先要准备init参数文件
最简单的办法就是把两个数据库的文件互换,在一个机器上同时保留主数据库的初始化文件
与备用数据库的初始化文件。
2、从Primary切换到standby的脚本:
[oracle@db worksh]$ more swithstandby.sh
24
#!/bin/sh
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/9.2;export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;export PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib; export
LD_LIBRARY_PATH
ORACLE_SID=tbdb; export ORACLE_SID
ORACLE_NLS=$ORACLE_HOME/ocommon/nls/admin/data; export ORACLE_NLS
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK; export NLS_LANG
NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss';export NLS_DATE_FORMAT
$ORACLE_HOME/bin/sqlplus /nolog <<EOF
connect / as sysdba
alter database commit to switchover to physical standby with session shutdown;
shutdown
startup nomount pfile=?/dbs/inittbdbsdby.ora
alter database mount standby database;
recover managed standby database disconnect;
exit
EOF
lsnrctl stop
lsnrctl start listenerdb
3、修改主端的tnsnames.ora 将主库IP:10.0.29.164 与备库IP:10.0.29.162 对换(即164 与
162 对的即可)
4、从standby切换到primary的脚本:
$ more switchprimary.sh
#!/bin/sh
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/9.2;export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;export PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib; export
LD_LIBRARY_PATH
ORACLE_SID=tbdb; export ORACLE_SID
ORACLE_NLS=$ORACLE_HOME/ocommon/nls/admin/data; export ORACLE_NLS
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK; export NLS_LANG
NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss';export NLS_DATE_FORMAT
$ORACLE_HOME/bin/sqlplus /nolog <<EOF
connect / as sysdba
alter database commit to switchover to primary;
shutdown
25
startup pfile=?/dbs/inittbdb.ora
exit
EOF
lsnrctl stop listenerdb
lsnrctl start
5、修改备用端的tnsnames.ora 将主库IP:10.0.29.164 与备库IP:10.0.29.162 对换(即164
与162 对的即可)
这样切换的要求是主机和备机各有两个listener, listener 监听1521,listenerdb 监听1522(见
上面的配置过程),任何一个节点,在primary期间启动listener, standby 期间启动listenerdb。
连接data guard的客户端的tnsnames配置,这样就可以实现失败切换,对客户端是透明的:
tbdb =
(DESCRIPTION =
(failover = on )
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 主)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 备)(PORT = 1521))
)
(CONNECT_DATA =
(SID = tbdb)
)
)
十一、备用库的失败切换
11.1失败切换
一般指主服务器已经不能使用,必须切换到备用服务器,所以,只操作备用服务器这一
端,以下提供一完美切换脚本
$ more switchprimary.sh
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/9.2;export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;export PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib; export
LD_LIBRARY_PATH
ORACLE_SID=tbdb; export ORACLE_SID
ORACLE_NLS=$ORACLE_HOME/ocommon/nls/admin/data; export ORACLE_NLS
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK; export NLS_LANG
NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss';export NLS_DATE_FORMAT
26
$ORACLE_HOME/bin/sqlplus /nolog <<EOF
connect / as sysdba
recover managed standby database cancel;
-- if standby have Standby redo logfile
--alter database recover managed standby database finish;
-- else
alter database recover managed standby database finish skip standby logfile;
-- switch
alter database commit to switchover to primary;
-- open
shutdown immediate
startup pfile=?/dbs/inittbdb.ora
exit
EOF
lsnrctl stop listenerdb
lsnrctl start
最后改tnsnames.ora 将主库IP:10.0.29.164 与备库IP:10.0.29.162 对换(即164 与162 对
的即可)
说明:
1、如果在备用端有活动的未归档的日志,或者有从主数据库拷贝过来的联机日志,可以采
用如下的办法注册并恢复
SQL> ALTER DATABASE REGISTER LOGFILE '/u01/oracle/oradata/tbdb/archive/1_87.dbf';
SQL>recover standby database;
2、如果有活动日志,必须用
alter database recover managed standby database finish;
否则用
alter database recover managed standby database finish skip standby logfile;
这样切换的备用服务器可以避免最小的数据丢失和不用resetlogs,特别是对于用多个备
用服务器的时候,该服务器可以马上作为主服务器而不用重新创建备用服务器。
11.2强行切换(激活)
这样的切换是以激和备用服务器来完成的,在重新启动数据库的时候,备用机会
resetlogs,这样会影响到其它备用服务器而且必须重新在主服务器上重新构造备用服务器,
一般不建议这样做。
$ more activeprimary.sh
#!/bin/sh
#swith to primary with cancel
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
27
ORACLE_HOME=$ORACLE_BASE/product/9.2;export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;export PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib; export
LD_LIBRARY_PATH
ORACLE_SID=tbdb; export ORACLE_SID
ORACLE_NLS=$ORACLE_HOME/ocommon/nls/admin/data; export ORACLE_NLS
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK; export NLS_LANG
#cancel and startup database
$ORACLE_HOME/bin/sqlplus /nolog <<EOF
connect / as sysdba
alter system archive log current;
recover managed standby database cancel;
alter database activate standby database;
shutdown immediate
startup pfile=?/dbs/inittbdb.ora
exit
EOF
lsnrctl stop listenerdb
lsnrctl start
十二、备用库的备份与恢复
12.1 从备用库上恢复主库的数据文件
在某些情况下,主服务器可能损坏一个或两个数据文件,如果从主数据库上的备份恢复,理
论上也是可以的,但是可能会因为需要应用到太多的日志,实际耗时太大,这个时候,我们
可以考虑从备份服务器上恢复该数据文件,因为备份服务器与主数据库一般只相差一个日志
文件左右。
1、关闭备用数据库
recover managed standby database cancel;
shutdown immediate;
2、拷贝或FTP损坏的数据文件到主数据库
3、在主数据库recover database datafile ‘文件名’即可。
12.2在备用数据库上进行备份
如果想减轻主库的压力,可以在备用数据库上进行备份,因为备用控制文件的特性关系,在
对standby的rman备份中,不能修改rman的配置,所以没有办法自动备份控制文件。
可以采用如下的方法备份:
1、采用恢复目录备份standby数据库
2、如果采用控制文件做恢复目录,注意
Alter database backup controlfile to ‘file name’备份控制文件。
3、备份数据库,可以停止恢复进程,跳转到read only模式下,通过backup database来备份
数据库,这样的数据库处于一致性的模式下
 
 
 
七、DG归档日志处理
转:
定期删除DG归档日志的脚本· 作者 小荷||【转载时请务必以超链接形式标明文章原始出处和作者信息】
· 永久链接: http://www.oracleblog.cn/useful-script/shell-for-delete-standby-arch/


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

Dataguard的维护稍微麻烦点,不能删除尚未applied的归档日志,但是每次手工去核对就比较麻烦了,今天在pub上看到这样一个要求:“哪位有 standby数据库 定期删除已经apply的archive的shell脚本?”于是就写了个脚本,基本可以满足题目的要求:

1、已经在standby库apply的;

2、2天以上的

脚本如下(具体的脚本和初始化路径可见文章最后的下载tar包,在这里对这个脚本的内容进行下说明):
OS:

[oracle@standby1 etc]$ cat redhat-release
Enterprise Linux Enterprise Linux AS release 4 (October Update 4)
DB:

BANNER
----------------------------------------------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
PL/SQL Release 9.2.0.4.0 - Production
CORE    9.2.0.3.0       Production
TNS for Linux: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production
脚本部署路径为:/oracle/del_appl_arc/bin
脚本生成的日志路径:/oracle/del_appl_arc/log

#!/bin/sh
#########################################################################
#         This shell is for primary and standby database                #
#         to rm applied archivelog that before some day ago.            #
#                                                                       #
#       You can define "some day" in variables ${day_before}            #
#            This shell can be put in crontab for auto run              #
#                                                                       #
#            2008-01-18   writen by www.oracleblog.cn                   #
#########################################################################

## load profile file
. /oracle/.bash_profile

## Path Define
main_path=/oracle/del_appl_arc      <----------------部署的主路径
bin_path=${main_path}/bin      <--------------------脚本所在路径
log_path=${main_path}/log      <---------------------脚本日志所在路径
arc_path=/oracle/arch      <-------------------------归档日志所在路径

cd ${bin_path}

## Initial script
touch app_arc_name.sh
chmod +x app_arc_name.sh

## rm applied archivelog that before ${day_before} day ago
day_before=1      <-------------------------------------假设删除1天前已经规定的日志,这个变量设置为1,你可以设置成其他。 

## Db info
dbuser=test
dbpwd=test
dbsid=primary

########## Main shell start here ##########
## load exisit archlog list to db      <------------------------从此处开始利用sqlldr将arch文件列表load到数据库中。
sqlplus ${dbuser}/${dbpwd}@${dbsid}<<EOF >/dev/null
drop table ${dbuser}.arc_log_list;
CREATE TABLE ${dbuser}.arc_log_list (arc_name VARCHAR2(2000));
exit;
EOF

ls -l ${arc_path}|awk '{print $9}' |grep arc >arc_log_list.tmp

echo "load data">>arc_log.ctl
echo "infile 'arc_log_list.tmp'">>arc_log.ctl
echo "replace into table arc_log_list">>arc_log.ctl
echo "fields terminated by X'09'">>arc_log.ctl
echo "(arc_name)">>arc_log.ctl

sqlldr ${dbuser}/${dbpwd}@${dbsid} control=arc_log.ctl log=sqlldr_run.log bad=sqlldr_badfile.bad

### Create shell for rm applied archive that before some day ago
sqlplus -s ${dbuser}/${dbpwd}@${dbsid}<<EOF>/dev/null      <-------------利用load数据库中的arch列表和
set feedback off                                     <-------------数据库中v$archived_log,找出符合条件可以删除的arch,同时生成删除脚本。
set pages 0
set head off
set timing off
set echo off
spool app_arc_name.tmp
select 'rm -f '||'${arc_path}/'||arc_name from test.arc_log_list
intersect
select 'rm -f '||name from v/$archived_log
where DEST_ID=1 and name like '%.arc'
and SEQUENCE#<(select max(SEQUENCE#) from v/$archived_log where applied='YES')
and COMPLETION_TIME<=sysdate-${day_before};
spool
exit
EOF

## Exec the shell in background mode
cat app_arc_name.tmp |grep -v spooling>app_arc_name.sh
./app_arc_name.sh
mv app_arc_name.sh rm_appl_arc_`date +"%Y%m%d%H%M"`.log

mv rm_appl_arc*.log ${log_path}
rm app_arc_name.tmp arc_log.ctl sqlldr_run.log arc_log_list.tmp
完成脚本后,你可以把脚本放入crontab中定期运行,以达到自动删除n天以前且已经applied的归档日志。注意crontab的部署把primary和standby的时间错开,如果同时进行,会对arc_log_list表有争用。

原创粉丝点击