0. 确认基础环境
opatch lspatches配置库SID的环境变量 ORACLE_SID,并确认好所有ORACLE相关的环境变量是否完备。
1. 查看备份集信息
/usr/openv/netbackup/bin/bplist -C ${NB_ORA_CLIENT} -t 4 -l -R / | more大概的输出是这样的
-rw-rw---- oracle asmadmin 57591552K Mar 23 08:20 /al_93480_1_1067934020
-rw-rw---- oracle asmadmin 373293056 Mar 22 17:37 /c-827387878-20210322-03
-rw-rw---- oracle asmadmin 373293056 Mar 22 17:36 /cntrl_93478_1_1067880993其中
c-开头:包含控制文件,spfile文件;cntrl_开头:控制文件的备份集,一般以最新的备份集为准
2. 启动参数文件
- 从源库拷一份pfile,用作后续步骤的启动参数,必要时可与生产库的pfile对比,确认关键配置,如:
*.db_name='XXXXDB'
*.db_unique_name='XXXXDB_1'
*.enable_pluggable_database=TRUE
*.dispatchers='(PROTOCOL=TCP) (SERVICE=XXXXDB)'- 若没有能拷贝的pfile,也可以从备份恢复,在RMAN执行。(没操作过,不是很推荐)
RMAN执行
run {
allocate channel ch01 TYPE 'SBT_TAPE';
SEND 'NB_ORA_CLIENT={客户端名}, NB_ORA_SERV={服务器名}';
restore spfile to pfile '/home/oracle/xxxxxx.ora' from '/c-827387878-20210322-03';
release channel ch01;
}
exit;
4. 测试到备份机的连接
测试到备份库的链接,进rman操作 rman target /,可指定操作日志输出到rman target / log=xxxxxx
---测试连接
run {
allocate channel ch01 TYPE 'SBT_TAPE';
SEND 'NB_ORA_CLIENT={客户端名}, NB_ORA_SERV={服务器名}';
release channel ch01;
}
exit;5. 启动到 NOMOUNT 状态
有了pfile,数据库可以进nomount模式。这步操作前,再次检查ORACLE_SID,避免操作错误的数据库。
进到 SqlPlus sqlplus / as sysdba
startup nomount pfile='/home/oracle/xxxxxx'
-- 启动成功后,可以立刻创建spfile,便于后续启动
create spfile from memory;6. 恢复控制文件
回RMAN继续恢复控制文件,控制文件路径要根据pfile里的内容进行调整,执行多次。
run {
allocate channel ch01 type 'sbt_tape';
SEND 'NB_ORA_CLIENT={客户端名}, NB_ORA_SERV={服务器名}';
restore controlfile to '/data/CORIS/controlfile/control01.ctl' from '/cntrl_296329_1_1223116563';
sql "alter database mount";
release channel ch01;
}
*.enable_pluggable_database=TRUE ,启动时会出现报错。虽然数据库会切换到mount模式,但这是不正确的。
此时数据库进mount模式
alter database mount; 7. restore+recover脚本
#!/bin/bash
set -e
ORACLE_SID=XXCDBECC_OMS
TIMESTAMP=$(date '+%Y.%m.%d.%H.%M%S')
NB_ORA_CLIENT=XXXXXX
NB_ORA_SERV=XXXXX
file_path=`readlink -f $0`
dir_path=`dirname $file_path`
rman target / log=${dir_path}/${ORACLE_SID}_restore_${TIMESTAMP}.log << EOF
run {
allocate channel ch01 type 'sbt_tape';
allocate channel ch02 type 'sbt_tape';
allocate channel ch03 type 'sbt_tape';
allocate channel ch04 type 'sbt_tape';
SEND 'NB_ORA_CLIENT=${NB_ORA_CLIENT}, NB_ORA_SERV=${NB_ORA_SERV}';
# 使用ASM管理的机器不需要这一步
SET NEWNAME FOR DATABASE TO '/database/${ORACLE_SID}/datafile/%b';
# 改为这一步
SET NEWNAME FOR DATABASE TO NEW;
# 这一步其实依赖数据库参数 db_create_file_dest 可以在数据库mount后用SQL设置:
# alter system set db_create_file_dest='+DATA01' scope=both;
restore database;
release channel ch01;
release channel ch02;
release channel ch03;
release channel ch04;
}
exit;
EOF
rman target / log=${dir_path}/${ORACLE_SID}_recover_${TIMESTAMP}.log << EOF
run {
allocate channel ch01 type 'sbt_tape';
allocate channel ch02 type 'sbt_tape';
allocate channel ch03 type 'sbt_tape';
allocate channel ch04 type 'sbt_tape';
SEND 'NB_ORA_CLIENT=${NB_ORA_CLIENT}, NB_ORA_SERV=${NB_ORA_SERV}';
recover database;
release channel ch01;
release channel ch02;
release channel ch03;
release channel ch04;
}
exit;
EOF
8. 打开数据库
确认SCN,并以resetlogs方式打开数据库,在SQLPLUS操作
select file#,to_char(checkpoint_change#) from v$datafile where rownum<2;
select file#, to_char(checkpoint_change#) from v$datafile_header where status ='ONLINE';
alter database open resetlogs;8. 确认状态
查看tempfile、logfile,SQL操作
select name from v$tempfile;
select member from v$logfile; 9. RAC备份到单机恢复的一些问题
由于RAC机架模式会有多个节点在运行,控制文件记录了其他节点的信息。所以在开库的时候会出现
alter database open resetlogs
*
ERROR at line 1: ORA-00392: log 23 of thread 3 is being cleared, operation not allowed
ORA-00312: online log 23 thread 3: '+DATAC1'
ORA-00312: online log 23 thread 3: '+RECOC1'
--- 开库时还会出现一种情况
> alter database open resetlogs;
ORA-01139: RESETLOGS option only valid after an incomplete database recovery
--- 进而使用
> alter database open;
ORA-19751: could not create the change tracking file
ORA-19750: change tracking file: '+DATAC1/XXXXX/CHANGETRACKING/ctf.4393.1083626395'
ORA-17502: ksfdcre:1 Failed to create file +DATAC1/XXXXX/CHANGETRACKING/ctf.4393.1083626395
ORA-17501: logical block size 4294967295 is invalid
ORA-29701: unable to connect to Cluster Synchronization Service
ORA-17503: ksfdopn:2 Failed to open file +DATAC1/XXXXX/CHANGETRACKING/ctf.4393.1083626395
ORA-15001: diskgroup "DATAC1" does not exist or is not mounted
ORA-15374: invalid cluster configuration显而易见也是因为RAC环境到单机的问题。切换一下位置
ALTER DATABASE DISABLE BLOCK CHANGE TRACKING;
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/database/XXXXX/ctf.ora';9. RAC备份到单机恢复logfile的占用问题
但一般来说我们恢复时不考虑redo日志,所以首先查看redo日志记录情况。
select * from v$logfile;
GROUP# TYPE MEMBER
---------- --------------------- --------------------------------------------------
1 ONLINE /database/XXXXX/onlinelog/o1_mf_1_nrxfog0x_.log
2 ONLINE /database/XXXXX/onlinelog/o1_mf_2_nrxfokbk_.log
3 ONLINE /database/XXXXX/onlinelog/o1_mf_3_nrxfonh3_.log
4 ONLINE /database/XXXXX/onlinelog/o1_mf_4_nrxfoqjp_.log
5 ONLINE /database/XXXXX/onlinelog/o1_mf_5_nrxfotjk_.log
6 ONLINE /database/XXXXX/onlinelog/o1_mf_6_nrxfoxg7_.log
7 ONLINE /database/XXXXX/onlinelog/o1_mf_7_nrxfp0fq_.log
21 ONLINE /database/XXXXX/onlinelog/o1_mf_21_nrxgo7z2_.log
22 ONLINE /database/XXXXX/onlinelog/o1_mf_22_nrxgog1q_.log
32 ONLINE /database/XXXXX/onlinelog/o1_mf_32_nrxgs4kw_.log
23 ONLINE /database/XXXXX/onlinelog/o1_mf_23_nrxh71f5_.log
31 ONLINE /database/XXXXX/onlinelog/o1_mf_31_nrxh78gn_.log
34 ONLINE /database/XXXXX/onlinelog/o1_mf_34_nrxh83kl_.log
select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARCHIVED STATUS
---------- ---------- ---------- ---------- ---------- ---------- --------- ---------------
1 1 1 4294967296 512 1 YES INACTIVE
2 1 2 4294967296 512 1 YES INACTIVE
3 1 3 4294967296 512 1 NO CURRENT
4 1 0 4294967296 512 1 YES UNUSED
5 1 0 4294967296 512 1 YES UNUSED
6 1 0 4294967296 512 1 YES UNUSED
7 1 0 4294967296 512 1 YES UNUSED
21 2 0 4294967296 512 1 YES UNUSED
22 2 0 4294967296 512 1 YES UNUSED
23 3 0 4294967296 4096 1 YES UNUSED
31 4 0 4294967296 4096 1 YES UNUSED
32 3 0 4294967296 512 1 YES UNUSED
34 4 0 4294967296 4096 1 YES UNUSED 这里的示例是已经是做了一些操作了:如果log位置还在ASM位置上的,需要做重建。
状态在CLEANING、CLEARING_CURRENT的,需要做处理。
最终目标是,只留Thread = 1的,其他要删掉。
部分操作是在open状态下执行的
alter database clear unarchived logfile group 21; -- 将 CLEANING、CLEARING_CURRENT 打回 UNUSED
alter database drop logfile group 1; -- 一般来说至少一个线程要有2个Group。所以删掉最后肯定删不掉。
--- 重建logfile到指定位置 RAC的blocksize为4K,单节点VM环境使用512.
--- 这一步也可以不指定位置,那么会自动根据parameter中的参数做创建。
alter database add logfile thread 1 group 4 ('/database') size 4096M blocksize 512;
alter system switch logfile; -- 切换CURRENT logfile
--- 禁用Thread,便于后续drop
alter database disable thread 2;
10. 锁用户
--- 把查出来拼接好的语句再执行一次。
SELECT 'alter user ' || U.USERNAME || ' account lock;'
FROM DBA_USERS U
WHERE U.ACCOUNT_STATUS != 'LOCKED'
AND U.DEFAULT_TABLESPACE NOT IN
('SYSAUX', 'SYSTEM', 'USERS', 'MONITOR', 'SPA')
AND U.USERNAME NOT IN ('SPA')
ORDER BY 1;
本文标题:ORACAL数据库恢复备忘
本文连接:https://blog.dextercai.com/archives/243.html
除另行说明,本站文字内容采用创作共用版权 CC-BY-NC-ND 4.0 许可协议,版权归本人所有。
除另行说明,本站图片内容版权归本人所有,未经许可前,严禁以任何形式的使用。
即日起视情况关闭全站评论区,您可以通过关于页面的电邮地址和我取得联系,谢谢