Oracle数据库DG切换

Oracle数据库切换

  • 检测是否有挂载磁盘
主库操作
  • 关闭主库监听

su - oracle
lsnrctl stop(只在主库操作)

  • 在主库端检查数据库可切换状态
sqlplus / as sysdba
SQL> select switchover_status from v$database;

如果SWITCHOVER_STATUS 的值为TO STANDBY 表示可以正常切换.

SQL>alter database commit to switchover to physical standby;

Database altered.

如果SWITCHOVER_STATUS 的值为SESSIONS ACTIVE:

SQL> alter database commit to switchover to physical standby with session shutdown;

Database altered.

tailf $ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log 查看日志

  • 修改新备库ip(原主库)如原主库服务器宕机可不在此操作
ping 10.100.0.201

sed -i 's/10.100.0.9/10.100.0.201/g' /etc/sysconfig/network-scripts/ifcfg-bond0
cat /etc/sysconfig/network-scripts/ifcfg-bond0

/etc/init.d/network restart

备库操作
  • 将目标备库转换为主库
如果SWITCHOVER_STATUS 的值为TO PRIMARY 则:

SQL> alter database commit to switchover to primary;

Database altered.
如果SWITCHOVER_STATUS 的值为SESSIONS ACTIVE 则:

SQL> alter database commit to switchover to primary with session shutdown;

Database altered.

SQL> select FILE_NAME,TABLESPACE_NAME,status from dba_temp_files;

tailf $ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log 查看日志

  • 新主库操作(原备库) 更换ip 此ip 为业务ip

sed -i 's/10.100.0.18/10.100.0.9/g' /etc/sysconfig/network-scripts/ifcfg-bond0

sed -i 's/10.100.0.18/10.100.0.9/g' $ORACLE_HOME/network/admin/listener.ora
cat /etc/sysconfig/network-scripts/ifcfg-bond0

/etc/init.d/network restart

  • 重启新主库监听(原备库)
lsnrctl stop
lsntctl start

Sql> shutdown immediate;
Sql> startup;

lsnrctl status 如果一直未注册到监听里面,需手动注册一下
Sql>ALTER SYSTEM REGISTER;

恢复DG同步状态

  • 修改新主备库tnsname.ora文件 (此文件主备库完全一样)
cat << EOF > $ORACLE_HOME/network/admin/tnsnames.ora.bak 
DB_WENDING =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.100.0.18)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = WENDING)
    )
  )
DB_PHYSTDBY =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.100.0.9)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = PHYSTDBY)
    )
  )
EOF

  • 修改新备库监听文件(原主库)
cat << EOF > $ORACLE_HOME/network/admin/listener.ora 
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /home/oracle/oracle10g/product/10.2.0/db_1)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.100.0.9)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )
EOF

  • 查看主备的/etc/hosts配置要正确

  • 动新备库库监听 (原主库)

lsnrctl start

重启新备库

Sql>shutdown immediate;

Sql> startup;

  • 新备库执行同步语句
SQL> alter database recover managed standby database disconnect from session; 

  • 备库查看主备文件同步情况
select sequence#,dest_id,first_time,next_time,archived,applied from v$archived_log  order by   sequence#;

  • 主库
set linesize 160 pagesize 999
col destination for a30;
col error for a60;
select status,destination,error from v$archive_dest;

  • 主备库都检查
set linesize 160 pagesize 999
col destination for a30;
col error for a60;
select dbid,database_role from v$database;
select max(sequence#) from v$archived_log; 
select max(sequence#) from v$archived_log where applied='YES';

  • 备库
select process,status,sequence#from v$managed_standby;

检查新主库脚本

  • 检查rman 备份脚本,以及磁盘挂载目录
  • 检查rman备份监控脚本
    备份放在哪台服务器上,监控脚本就放在哪台服务器上。数据量比较大的备份最好放在备库上备份。监控脚本不要放在存储上。
  • check_rman_backup.sh

status=`sqlplus -silent  "/as sysdba " <<eof
set feedback off
set verify off
set heading off
set echo off
set pagesize 0
SELECT /*+ rule */ DECODE (
             TRUNC (SYSDATE - start_time),
             0, DECODE (
                   status,
                    'COMPLETED',  '0',
                    'COMPLETED WITH WARNINGS ', '1',
                    '2'),
              '2')
          backup_status
  FROM v\\$rman_backup_job_details
 WHERE start_time = (SELECT MAX(start_time) FROM v\\$rman_backup_job_details);
exit;
eof`
output=`sqlplus -silent  "/as sysdba " <<eof
set feedback off
set verify off
set heading off
set echo off
set pagesize 0
SELECT /*+ rule */ DECODE (
          TRUNC (SYSDATE - start_time),
          0, DECODE (status,
                      'COMPLETED',  'ccod:备份成功!',
                      'COMPLETED WITH WARNINGS',  'ccod:备份有警告,请检查!',
                      'ccod:备份失败,请检查!'),
           'ccod:无备份!')
          backup_status
  FROM v\\$rman_backup_job_details
 WHERE start_time = (SELECT MAX (start_time) FROM v\\$rman_backup_job_details);
exit;
eof`
hostip=$IP
checkname=Rman_Backup_$SID
if [ -z "$status" ]||[ "$status" != 0 ]
then
/bin/logger -p local0.crit "result=ERROR described:$status $output  ccod: 请及时RMAN检查备份情况"
fi

  • 10.3检查dg 健康状态脚本
    • 主库是oracle_wending_check.sh
#!/bin/bash

. ~/.bash_profile

##指标1:alert日志文件告警##
b=`cat /home/oracle/b.log`
c=`grep -c ORA- /home/oracle/oracle10g/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log`
if [[ $c -gt $b ]];
then
echo "OraAlarm=false"
else
echo "OraAlarm=true"
fi
##将最新的值更新到b.log文件,用于下次比对##
echo $c >/home/oracle/b.log


##指标2:dg同步监控##
var=`sqlplus -s / as sysdba <<EOF
set trimspool on
set linesize 2000
set pagesize 0
set newpage 1
set heading off
set feedback off 
set term on
select (select max(SEQUENCE#) from v\\$archived_log where applied='NO')-(select max(SEQUENCE#) from v\\$archived_log where applied='YES') from dual;
EOF`

if [ -z "$var" ]||[ "$var" -gt 1 ]
then
echo "OracleDG=false"
elif [ "$var" -le 1 ]
then
echo "OracleDG=true"
fi

##指标3:监控数据库状态##
STA=`sqlplus -s / as sysdba <<EOF
set trimspool on
set linesize 2000
set pagesize 0
set newpage 1
set heading off
set feedback off 
set term on
select status from v\\$instance;
EOF`
##传输数据库状态至网管监控##
echo "OracleSID=$STA"

##指标4:监控连接数使用情况##
##获取当前会话数##
CONS=`sqlplus -s / as sysdba <<EOF
set trimspool on
set linesize 2000
set pagesize 0
set newpage 1
set heading off
set feedback off 
set term on
select count(*) from V\\$SESSION;
EOF`
##获取参数配置情况##
PROS=`sqlplus -s / as sysdba <<EOF
set trimspool on
set linesize 2000
set pagesize 0
set newpage 1
set heading off
set feedback off 
set term on
select value from v\\$parameter where name = 'processes';
EOF`
##获取连接数使用情况##
num=`expr $CONS \* 100 / $PROS`
##传输连接数使用情况至网管监控##
echo "OracleCON=$num"

  • 备库是oracle_phystdby_check.sh
#!/bin/bash
. ~/bash_profile
##指标1:alert日志文件告警##
b=`cat /home/oracle/b.log`
c=`grep -c ORA- /home/oracle/oracle10g/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log`
if [[ $c -gt $b ]];
then
echo "OraAlarm = false"
else
echo "OraAlarm = true"
fi
##将最新的值更新到b.log文件,用于下次比对##
echo $c >/home/oracle/b.log

  • 有需要布置check_dg.sh
#!/bin/bash
. /home/oracle/.bash_profile
##指标1:alert日志文件告警##
b=`cat /home/oracle/b.log`
c=`grep -c ORA- /home/oracle/oracle10g/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log`
if [[ $c -gt $b ]];
then
echo "OraAlarm=false"
/bin/logger -p local0.crit "OraAlarm=false described:OraAlarm=false  ccod: 请及时检查alert日志情况"
else
echo "OraAlarm=true"
fi
##将最新的值更新到b.log文件,用于下次比对##
echo $c >/home/oracle/b.log

##指标2:dg同步监控##
var=`$ORACLE_HOME/bin/sqlplus -s / as sysdba <<EOF
set trimspool on
set linesize 2000
set pagesize 0
set newpage 1
set heading off
set feedback off 
set term on
select (select max(SEQUENCE#) from v\\$archived_log where applied='NO')-(select max(SEQUENCE#) from v\\$archived_log where applied='YES') from dual;
EOF`

if [ -z "$var" ]||[ "$var" -gt 1 ]
then
echo "OracleDG=false"
/bin/logger -p local0.crit "DG=ERROR described:OracleDG=false  ccod: 请及时DG同步情况"
elif [ "$var" -le 1 ]
then
echo "OracleDG=true"
fi
$ORACLE_HOME/bin/sqlplus -s / as sysdba <<EOF
set trimspool on
set linesize 2000
set pagesize 0
set newpage 1
set heading off
set feedback off 
set term on
spool /home/oracle/oracle_gap.log
select * from v\$archive_gap;
exit
EOF
Gap=`cat /home/oracle/oracle_gap.log|wc -l`
if [ "$Gap" != 0 ];
then
echo "OracleDG=false"
/bin/logger -p local0.crit "DG=ERROR described:OracleDG=false  ccod:存在gap, 请及时DG同步情况"
else
echo "OracleDG=true"
fi
##指标3:监控数据库状态##
sqlplus -s / as sysdba <<EOF
set trimspool on
set linesize 2000
set pagesize 0
set newpage 1
set heading off
set feedback off 
set term on
spool /home/oracle/sta.log
select status from v\$instance;
EOF
STA=`cat /home/oracle/sta.log`
##传输数据库状态至网管监控##
echo "OracleSID=$STA"
if [ "$STA" = "OPEN" ]
then
echo "OracleSID=true"
else
echo "OracleSID=false"
/bin/logger -p local0.crit "ERROR described:OracleSID=false  ccod:数据库状态不是open"
fi


##指标4:监控连接数使用情况##
##获取当前会话数##
sqlplus -s / as sysdba <<EOF
set trimspool on
set linesize 2000
set pagesize 0
set newpage 1
set heading off
set feedback off 
set term on
spool /home/oracle/con.log
select count(*) from V\$SESSION;
EOF
CONS=`cat /home/oracle/con.log`
##获取参数配置情况##
sqlplus -s / as sysdba <<EOF
set trimspool on
set linesize 2000
set pagesize 0
set newpage 1
set heading off
set feedback off 
set term on
spool /home/oracle/pros.log
select value from V\$parameter where name = 'processes';
EOF
PROS=`cat /home/oracle/pros.log`
##获取连接数使用情况##
num=`expr $CONS \* 100 / $PROS`
##传输连接数使用情况至网管监控##
echo "OracleCON=$num"
if [ "$num" -gt 60 ]
then
echo "OracleCON=false"
/bin/logger -p local0.crit "ERROR described:OracleCON=false  ccod:数据库连接数超过阈值"
else
echo "OracleCON=true"
fi


  • 10.4检查清理归档脚本
  • 主库del_appl_standy_arc_wending.sh
#!/bin/bash
#########################################################################
#         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
. /home/oracle/.bash_profile

## Path Define
main_path=$ORACLE_BASE/del_appl_arc
bin_path=${main_path}/bin
log_path=${main_path}/log
arc_path=$ORACLE_BASE/arch1/WENDING

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=7

## Db info
dbuser=system
dbpwd=oracle
dbsid=db_WENDING

### Create shell for rm applied archive that before some day ago
sqlplus -s "/ as sysdba"<<EOF>/dev/null
set feedback off
set pages 0
set head off
set timing off
set echo off
spool app_arc_name.tmp
select 'rm -f '||name from v\$archived_log 
where DEST_ID=1 and name like '%.dbf' 
and SEQUENCE#<(select max(SEQUENCE#) from v\$archived_log where applied='YES')
and COMPLETION_TIME<=sysdate-${day_before};
spool
exit
EOF
## clear delete expired archivelog all;

## Exec the shell in background mode
cat app_arc_name.tmp |grep -v spooling>app_arc_name.sh
./app_arc_name.sh
chmod -x 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 


##clear alter log
export BACKUP_DATE=`date +%y%m%d`
cd $ORACLE_BASE/admin/$ORACLE_SID/bdump

if  [ -f alert_$ORACLE_SID.log ];  then
cat alert_$ORACLE_SID.log >> alert_$ORACLE_SID.$BACKUP_DATE
cat /dev/null > alert_$ORACLE_SID.log
fi

echo 0 > /home/oracle/b.log

  • 备库del_appl_standy_arc_phystdby.sh
#!/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
. /home/oracle/.bash_profile

## Path Define
main_path=$ORACLE_BASE/del_appl_arc
bin_path=${main_path}/bin
log_path=${main_path}/log
arc_path=$ORACLE_BASE/arch1/PHYSTDBY

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=7


### Create shell for rm applied archive that before some day ago
sqlplus -s "/ as sysdba"<<EOF>/dev/null
set feedback off
set pages 0
set head off
set timing off
set echo off
spool app_arc_name.tmp
select 'rm -f '||name from v\$archived_log 
where DEST_ID=1 and name like '%.dbf' 
and SEQUENCE#<(select max(SEQUENCE#) from v\$archived_log where applied='YES')
and COMPLETION_TIME<=sysdate-${day_before};
spool
exit
EOF
## clear delete expired archivelog all;



## Exec the shell in background mode
cat app_arc_name.tmp |grep -v spooling>app_arc_name.sh
./app_arc_name.sh
chmod -x 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 

##clear alter log
export BACKUP_DATE=`date +%y%m%d`
cd $ORACLE_BASE/admin/$ORACLE_SID/bdump

if  [ -f alert_$ORACLE_SID.log ];  then
cat alert_$ORACLE_SID.log >> alert_$ORACLE_SID.$BACKUP_DATE
cat /dev/null > alert_$ORACLE_SID.log
fi

echo 0 >/home/oracle/b.log



新主库启动后如有以下错误,请参考解决方法

  • ORA-30012: undo tablespace 'UNDOTBS1' does not exist or of wrong type Fri Apr 20 21:17:12 2018
解决方法: 
SQL> show parameter undo  
NAME                                 TYPE        VALUE  
------------------------------------ ----------- ------------------------------  
undo_management                      string      AUTO  
undo_retention                       integer     900  
undo_tablespace                      string      UNDOTBS1 

 SQL> select name from v$tablespace where name like '%UNDO%'; 
NAME  
------------------------------  
UNDOTBS3  

sql > create pfile from spfile;

cd $ORACLE_HOME/dbs

vi init$ORACLE_SID.ora
修改undo_tablespace=UNDOTBS3

然后startup mount pfile=$ORACLE_HOME/dbs/init$ORACLE_SID.ora  (此处请写绝对路径)

sql > create spfile from pfile;

sql> shutdown immediate;

sql> startup

  • 数据库启动后,如应用报如下错误 ORA-01187 ORA-01110,或避免报次错,请预先检查一下临时表空间状态
SQL> select TABLESPACE_NAME,FILE_NAME,STATUS from dba_temp_files;

TABLESPACE_NAME            FILE_NAME              STATUS
------------------------------ ------------------------------ ---------
TEMP                   /oradata/ygdb/temp01.dbf       AVAILABLE

如果不是AVAILABLE,请执行以下语句
alter tablespace TEMP add tempfile '/oradata/ygdb/temp02.dbf' size 100m autoextend on;
alter tablespace TEMP drop tempfile '/oradata/ygdb/temp01.dbf';

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容