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
问题解决