Chinaunix首页 | 论坛 | 博客
  • 博客访问: 788287
  • 博文数量: 185
  • 博客积分: 7434
  • 博客等级: 少将
  • 技术积分: 2325
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-29 14:01
文章分类

全部博文(185)

文章存档

2013年(1)

2012年(2)

2011年(17)

2010年(25)

2009年(36)

2008年(104)

分类: Oracle

2008-05-06 11:47:37

Oracle DataGuard standby库日常管理

网上大多是如何创建dataguard的文档,日常管理比较少见,这里记录一下

一、日常管理
1.1 备用服务器的管理模式与只读模式
1、启动到管理模式
SQL>shutdown immediate
SQL>startup nomount pfile=?/dbs/inittestdbsdby.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/inittestdbsdby.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/testdb/temp01.dbf' size 100M;
4、从只读方式到管理恢复方式
SQ>recover managed standby database disconnect from session;
1.2 备用服务器日志删除
备用服务器的日志删除也必须小心,因为如果有些日志还没有被备用服务器应用而该日志被删除的话,将引起备用数据库无法往下应用新的日志。
删除备用服务器的日志的脚本为:
$ more removearchive.sh
#!/bin/sh
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/920;export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;export PATH
ORACLE_SID=testdb; 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
1.3 日志延迟检查
备用服务器可能有这样的情况发生,因为日志块逻辑损坏,所以必须对日志应用进行检查,
防止日志应用被停止,防患于未然,当然我们可以手工检查,但是以下脚本则可以实现自动
检查(放到cron中),如果发现问题则并发送mail到指定邮箱
$ more checklog.sh
#!/bin/sh
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/920;export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;export PATH
ORACLE_SID=testdb; 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 "ls -t /u01/oracle/oradata/testdb/archive/*|head -1|sed -e 's/.*_1_//g' |sed -e 's/\.arc$//g'"`
echo "CHECK TIME:"${DATE}
echo "remote file:"$remotefile
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!" < $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!" < $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
#!/bin/sh
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/920;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=testdb; 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 <connect / as sysdba
alter database commit to switchover to physical standby with session shutdown;
shutdown
startup nomount pfile=?/dbs/inittestdbsdby.ora
alter database mount standby database;
recover managed standby database disconnect;
exit
EOF
lsnrctl stop
lsnrctl start listenerdb
3、修改主端的tnsnames.ora 将主库IP:192.168.1.1 与备库IP:192.168.1.2 对换
4、从standby切换到primary的脚本:
$ more switchprimary.sh
#!/bin/sh
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/920;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=testdb; 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 <connect / as sysdba
alter database commit to switchover to primary;
shutdown
startup pfile=?/dbs/inittestdb.ora
exit
EOF
lsnrctl stop listenerdb
lsnrctl start
5、修改备用端的tnsnames.ora 将主库IP:192.168.1.1 与备库IP:192.168.1.2 对换
这样切换的要求是主机和备机各有两个listener, listener 监听1521,listenerdb 监听1522(见上面的配置过程),
任何一个节点,在primary期间启动listener, standby 期间启动listenerdb。
连接data guard的客户端的tnsnames配置,这样就可以实现失败切换,对客户端是透明的:
testdb =
(DESCRIPTION =
(failover = on )
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 主)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 备)(PORT = 1521))
)
(CONNECT_DATA =
(SID = testdb)
)
)
三、备用库的失败切换
3.1失败切换
一般指主服务器已经不能使用,必须切换到备用服务器,所以,只操作备用服务器这一端,以下提供一切换脚本
$ more switchprimary.sh
ORACLE_BASE=/u01/oracle;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/920;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=testdb; 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 <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/inittestdb.ora
exit
EOF
lsnrctl stop listenerdb
lsnrctl start
最后改tnsnames.ora 将主库IP:192.168.1.1 与备库IP:192.168.1.2 对换
说明:
1、如果在备用端有活动的未归档的日志,或者有从主数据库拷贝过来的联机日志,可以采用如下的办法注册并恢复
SQL> ALTER DATABASE REGISTER LOGFILE '/u01/oracle/oradata/testdb/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,特别是对于用多个备
用服务器的时候,该服务器可以马上作为主服务器而不用重新创建备用服务器。
3.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/920;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=testdb; 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 <connect / as sysdba
alter system archive log current;
recover managed standby database cancel;
alter database activate standby database;
shutdown immediate
startup pfile=?/dbs/inittestdb.ora
exit
EOF
lsnrctl stop listenerdb
lsnrctl start
四、备用库的备份与恢复
4.1 从备用库上恢复主库的数据文件
在某些情况下,主服务器可能损坏一个或两个数据文件,如果从主数据库上的备份恢复,理论上也是可以的,
但是可能会因为需要应用到太多的日志,实际耗时太大,这个时候,
我们可以考虑从备份服务器上恢复该数据文件,因为备份服务器与主数据库一般只相差一个日志文件左右。
1、关闭备用数据库
recover managed standby database cancel;
shutdown immediate;
2、拷贝或FTP损坏的数据文件到主数据库
3、在主数据库recover database datafile ‘文件名’即可。
4.2在备用数据库上进行备份
如果想减轻主库的压力,可以在备用数据库上进行备份,因为备用控制文件的特性关系,在
对standby的rman备份中,不能修改rman的配置,所以没有办法自动备份控制文件。
可以采用如下的方法备份:
1、采用恢复目录备份standby数据库
2、如果采用控制文件做恢复目录,注意
Alter database backup controlfile to ‘file name’备份控制文件。
3、备份数据库,可以停止恢复进程,跳转到read only模式下,通过backup database来备份
数据库,这样的数据库处于一致性的模式下。
阅读(1189) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~