Oracle11g Rman异机恢复备份备忘录及listener supports no services的解决办法

感谢 邦德DBA实战群-168797397 @夏晓,@康复孔院长,@smile等朋友的帮助。

0x00 环境说明:

1.oracle 版本11g R2,centos7.9 8core 16G RAM

2.为减少意外错误,本次恢复搭建的恢复测试环境尽量与源库一致

3.源库与目标库都开启了归档模式

4.源库rman备份脚本如下:

#!/bin/sh
##===========================================================
##   rmandb.sh
##   created by shaopeng
##   2015/09/16
##============================================================
source ~/.bash_profile

if [ "$RMAN_BK_DIR" = "" ]; then
  RMAN_BK_DIR=/home/data/dbbackup/data
fi
TODAY=`date +%Y%m%d`
BAK_DIR=${RMAN_BK_DIR}/${TODAY}
LOG_DIR=${RMAN_BK_DIR}/log
LOG_FILE=${LOG_DIR}/${TODAY}
export RMAN_BK_DIR TODAY BAK_DIR LOG_DIR LOG_FILE

if ! test -d ${BAK_DIR}; then mkdir -p ${BAK_DIR}; fi
if ! test -d ${LOG_DIR}; then mkdir -p ${LOG_DIR}; fi

echo "--------------------------------" >>${LOG_FILE}
echo "Rman Begin  to Working ........." >>${LOG_FILE}
echo "Begin time at:" `date`            >>${LOG_FILE}

#Startup rman to backup
#=============================================================================
$ORACLE_HOME/bin/rman msglog=${LOG_FILE} <<EOF
connect target /
run{
configure retention policy to recovery window of 7 days;
configure controlfile autobackup on;
configure controlfile autobackup format for device type disk to '${BAK_DIR}/%F';
configure device type disk parallelism 4 backup type to backupset;
configure channel device type disk format '${BAK_DIR}/%U.dbf' maxpiecesize 500 m;
configure channel device type disk format '${BAK_DIR}/%U.dbf' maxpiecesize 500 m;
configure channel device type disk format '${BAK_DIR}/%U.dbf' maxpiecesize 500 m;
configure channel device type disk format '${BAK_DIR}/%U.dbf' maxpiecesize 500 m;
delete noprompt obsolete;
crosscheck backup;
delete noprompt expired backup;
crosscheck archivelog all;
delete noprompt expired archivelog all;

backup as compressed backupset database skip inaccessible;

sql "alter system archive log current";

backup as compressed backupset format '${BAK_DIR}/%U.arc'
archivelog all delete input;

configure controlfile autobackup format for device type disk clear;
configure device type disk clear;
configure channel device type disk clear;
}
exit;
EOF

5.通过scp将备份文件和源库的参数文件init.ora spfile$ORACLE_SID.ora以及orapw$ORACLE_SID,拷贝至目标库主机的与源库相同的rman备份目录下

0x01 开始恢复

1.启动目标库至nomount阶段 -因为参数文件是复制过去的,因此不用恢复参数文件

sqlplus  / as sysdba

startup nomount

在此阶段,需要注意源目参数文件中sga以及pga的设置,如果sga及pga的值超过了目标库的物理内存大小,注意/etc/sysctl.conf文件中的shmall,ernel.shmall 参数是控制共享内存页数。该参数大小为物理内存除以pagesize,是会报out of memory错误的。

具体更改方法:物理内存(KB)/4 KB,得到页数,页数*4,得到这个数值,如果可以,建议测试环境的配置尽量和源库一致。这样拷贝过来的spfile就不会出现其他错误

具体设置项目如下:

#都为0时为手动管理,非0是动态管理
#MEMORY_MAX_TARGET可以设定的最大值
MEMORY_MAX_TARGET  
#操作系统上 Oracle 所能使用的最大内存值
MEMORY_TARGET 
#sga可以设定的最大值,可以指定m,g为单位
sga_max_size=
#设定sga可用的内存值,尽量是物理内存的一半
sga_target=
#设定pga可用的内存值,尽量是sga的0.1或0.2
pga_aggregate_target=

本次测试设定sga为8G,pga设定为2g

那么如何修改sga和pga的值呢?通过sqlplus命令行创建静态参数文件

sqlplus / as sysdba
#通过spfile创建pfile并指定pfile路径
create pfile='/home/data/pfile1.ora' from spfile;
#修改pfile1.ora中sga和pga的值
vi /home/data/pfile1.ora
#通过新建的静态参数文件pfile1.ora来启动oracle
startup  pfile='/home/data/pfile1.ora';
#此时可能会报invalid specification for system parameter LOCAL_LISTENER错误,在pfile1.ora最后加上一行监听参数
# *.local_listener='(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ip)))' 其中ip就是目标库的ip地址
#启动oracle
startup pfile='/home/data/pfile1.ora';
#此时启动成功
#查看sga pga 以及max_size_target及max_target值

2.通过静态参数文件更新动态参数文件spfile

sqlplus / as sysdba

create spfile from pfile='/home/data/pfile1.ora';
#关库
shutdown immediate;
#启动到nomount阶段

startup nomount

select status from v$instance;
STARTED
#此时就启动到了nomount阶段

0x02 还原(restore)数据库

1.查看rman备份文件所在路径,注意权限更改为oracle用户可操作

#查看rman备份文件,进入到与源库一致的rman备份目录
cd /home/data/rmanbak
#查看权限
ll
#更改权限,root操作
chown -R oracle:ointall /home/data/rmanbak
#登入rman
rman target /#

#恢复控制文件,如果控制文件有多个,使用最新的,通过ls -lrth可以查看时间顺序
restore controlfile from '/home/data/rmanbak/控制文件'
#恢复成功后,需要更改数据库状态到mount阶段
sql 'alter database mount';
#重新注册备份文件信息到catalog,注意最后要加上/,注册前清空除了rman备份文件的其他文件,否则会一些错误。
catalog start with '/home/data/rmanbak/';
#根据提示输入yes
#还原数据库 
run
{
allocate channel ch1 type disk;
allocate channel ch2 type disk;
allocate channel ch3 type disk;
allocate channel ch4 type disk;
restore database;
release channel ch1;
release channel ch2;
release channel ch3;
release channel ch4;
 }
#漫长等待后还原成功

0x03 恢复(recover)归档和打开数据库,并重置sequence

 1.找到拷贝过来的归档的备份文件

catalog archivelog 'rman备份后直到停机前的归档日志文件';
#检查备份
crosscheck archivelog all;
#恢复数据库
recover database;
#此时如果报错:xxxx is from different database: id=854772666, db_name=PRODDB
#根据报错删除掉对应的redo日志文件,可能存在多个
#再次恢复
recover database;
#如果报错: media recovery requesting unknown archived log for thread 1 with sequence 62224 and starting SCN of 1581737737
#直接使用报错末尾的scn号恢复
recover database until  scn  1581737737

2.以resetlogs方式启动数据库

RMAN>sql 'alter database open resetlogs';

3.通过sqlplus查看数据库状态

sqlplus> select status from v$instance;
OPEN

4.查看归档日志状态

select  group#,status from v$log;

有2个UNUSED,说明数据库已经重申。

5.切换日志

alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
#多执行几次,再次查看
select group#,status from v$log;

查看监听lsnrctl status 发现报listener supports no services 错误

解决办法:

在$ORACLE_HOME/network/admin下找到listener.ora,编辑

添加一行

SID_LIST_LISTENER =  (SID_LIST =    (SID_DESC =    (GLOBAL_DBNAME = globe)  (SID_NAME = globe)  ))
#其中 globe是你的sid,记得修改
lsnrctl stop
lsnrctl start 
问题解决

 

posted @ 2022-09-07 15:10  BlackData  阅读(269)  评论(0编辑  收藏  举报