拿到备份文件的时候,对 oracle 还原备份一点概念没有,开启了踩坑之旅。
当时记录了所有的命令和问题对应的解决方法。
等几个月之后再次需要还原的时候,看见这些问题和解决方法,一脸懵,忘记了怎么个流程,导致的这个错误。
借这次恢复,记录整个流程,和每一步可能遇到哪些问题,和怎么解决。
最后我还是对每个问题单独列了下来,方便快速定位指定问题。
我对 oracle 的很多概念都不清楚,这里都是我自己的理解,也可能理解的不专业,但足以解决问题。
异机还原最大的问题,就是当时我不知道 db_name 是什么,对方安装的目录和你的不同也会出现问题,包括对方给的备份文件的很多信息,都不知道。所以在还原前,一定要确定 db_name,否则你就会遇到最下边其中提到的一个错误 ORA-01103: 控制文件中的数据库名 ''aaa'' 不是 ''bbb''
备份文件
首先说,我拿到的备份文件
一共有4个文件,如果你拿到的和我的不一样也是可能的,因为这个文件名字是写备份脚本的人命名的。
但是根据命名,或者你有备份脚本,可以看出这几个文件类型。
- ARCH_xxx_K33D4JLP_1_1,以 ARCH 前缀的归档文件,xxx是数据库SID
- C-1357453924-20241220-00,以 C 前缀的控制文件
- LEVEL_FULL_xxx_20241220_13952,LEVEL_FULL 数据文件
ARCH_xxx_K33D4JLP_1_1
C-1357453924-20241220-00
LEVEL_FULL_xxx_20241220_13952
LEVEL_FULL_xxx_20241220_13953
开始还原备份
我刚开始不知道 RMAN 是什么,我以为需要安装什么工具,通过搜索资料,知道了 RMAN 是 oracle 安装的时候自带的工具,通过 cmd 中输入 ramn,我确认了我的服务器中有 RMAN
通过以下命令连接到 oracle
rman TARGET /
第一步
停止oracle实例,进入非挂载模式,加载控制文件
进入挂载模式
shutdown immediate;
startup nomount;
restore controlfile from 'E:\dbbak\20241220\C-1357453924-20241220-00';
alter database mount;
第二步
通过 list backup of database;命令可以看出,段名的地址不对,通过下边的catalog start with命令,修改段名地址。
通过 crosscheck backup;rman 检查这些目录是否存在,如果不存在就设置为 expired
通过 delete expired backup; ramn 会删除这些失效的目录
所以删除结束后,可以通过 list backup of database;再次查看有没有问题,如果结果中没有了数据,说明地址全错了,都被删了。
catalog start with 'E:\dbbak\20241220';
crosscheck backup;
delete expired backup;
第三步
细心的会发现,输出的内容中除了段名,还有地址不对的。
当时我没发现,继续执行了restore database重建数据文件,就遇到了新的错误无法创建文件"D:\***\***.DBF"或者另一个我也碰到了dbf 文件目录不存在
所以需要通过下边的方式,把dbf 位置重定向到你的oracle 安装目录对应的文件
下边我只列举了一个 datafile,通过 list backup of database;或许可以看到很多个,复制多行,修改即可
RUN{
set newname for datafile 'D:\***\***.DBF' to 'E:\***.DBF';
RESTORE DATABASE;
switch datafile all;
switch tempfile all;
}
第四步
上边的命令执行完之后,需要进行 recover database恢复数据文件
我有遇到了新的问题 scn:介质恢复正在请求未知的线程 1 序列 117522 的归档日志以及起始 SCN 14730429485864
通过搜索资料可以通过下边的两种方式执行,我使用的是第一种方式,没有测试第二种,但是得留下来,说不定有用呢
第一种方式:
RECOVER DATABASE until scn 14730429485864;
第二种
# 查看归档号,在 run 中设置最大 seq
list backupset of archivelog all;
run{
set until sequence 13229 thread 1;
set until sequence 13229 thread 2;
recover database;
}
所以这里也可以把第四步写到第三步中,形成如下命令
RUN{
set newname for datafile 'D:\***\SYSAUX01.DBF' to 'E:\***\SYSAUX01.DBF';
RESTORE DATABASE;
switch datafile all;
switch tempfile all;
RECOVER DATABASE until scn 14730429485875;
}
第五步
此时,我继续执行遇到了新的问题 LOGFILE 找不到,才有的这里第五步
使用 sqlplus 执行下边的命令,查看 logfile 的位置
把 LOGFILE 重定向到你的 oracle 安装目录,对应的目录
sqlplus /nolog
conn /as sysdba;
select member from v$logfile;
ALTER DATABASE RENAME FILE 'D:\***\REDO01.LOG' TO 'E:\***\REDO01.LOG';
ALTER DATABASE RENAME FILE 'D:\***\REDO02.LOG' TO 'E:\***\REDO02.LOG';
ALTER DATABASE RENAME FILE 'D:\***\REDO03.LOG' TO 'E:\***\REDO03.LOG';
ALTER DATABASE RENAME FILE 'D:\***\REDO04.LOG' TO 'E:\***\REDO04.LOG';
ALTER DATABASE RENAME FILE 'D:\***\REDO05.LOG' TO 'E:\***\REDO05.LOG';
ALTER DATABASE RENAME FILE 'D:\***\REDO06.LOG' TO 'E:\***\REDO06.LOG';
ALTER DATABASE RENAME FILE 'D:\***\REDO07.LOG' TO 'E:\***\REDO07.LOG';
ALTER DATABASE RENAME FILE 'D:\***\REDO08.LOG' TO 'E:\***\REDO08.LOG';
ALTER DATABASE RENAME FILE 'D:\***\REDO09.LOG' TO 'E:\***\REDO09.LOG';
ALTER DATABASE clear logfile group 1;
ALTER DATABASE clear logfile group 2;
ALTER DATABASE clear logfile group 3;
ALTER DATABASE clear logfile group 4;
ALTER DATABASE clear logfile group 5;
ALTER DATABASE clear logfile group 6;
ALTER DATABASE clear logfile group 7;
ALTER DATABASE clear logfile group 8;
ALTER DATABASE clear logfile group 9;
在修改完 datafile 还需要修改 tempfile,否则出现问题TEMP01.DBF 不存在,也可能是不存在的日志文件, 数据文件或临时文件 "E:\***\TEMP01.DBF"或者由于验证测试失败而无法从文件 读取ORA-01110: 数据文件 201: 'E:\***\TEMP01.DBF'
我通过删除TEMP01,添加TEMP02的方式解决了问题,也可以通过第二个代码块重定向,但是我没成功,报错了
select * from v$tempfile;
alter database tempfile 'E:\***\TEMP01.DBF' drop;
alter tablespace temp add tempfile 'E:\***\TEMP02.DBF' size 200m;
select * from v$tempfile;
ALTER DATABASE RENAME FILE 'D:\***\TEMP01.DBF' TO 'E:\***\TEMP01.DBF';
第六步
终于到了最后一步 ALTER DATABASE OPEN RESETLOGS;
不出意外,又出问题了,database must be opened with UPGRADE option
通过查询资料,得出结论,数据库版本导致的问题,好像小版本都会有很大的问题,需要升级
通过sqlplus 执行下边的命令升级,最后一个命令超级慢,几个小时
alter database open resetlogs upgrade;
@?/rdbms/admin/utlu112i.sql
@?/rdbms/admin/catupgrd.sql
终于启动啦
stratup;
最终所有命令
rman TARGET /
shutdown immediate;
startup nomount;
restore controlfile from 'E:\dbbak\20241220\C-1357453924-20241220-00';
alter database mount;
catalog start with 'E:\dbbak\20241220';
crosscheck backup;
delete expired backup;
# 替换你的 oracle 安装目录
RUN{
set newname for datafile 'D:\***\SYSAUX01.DBF' to 'E:\***\SYSAUX01.DBF';
set newname for datafile 'D:\***\UNDOTBS01.DBF' to 'E:\***\UNDOTBS01.DBF';
......
RESTORE DATABASE;
switch datafile all;
switch tempfile all;
RECOVER DATABASE until scn 14730429485875;
}
sqlplus /nolog
conn /as sysdba;
select member from v$logfile;
# 依旧替换你的安装目录
ALTER DATABASE RENAME FILE 'D:\***\REDO01.LOG' TO 'E:\***\REDO01.LOG';
ALTER DATABASE RENAME FILE 'D:\***\REDO02.LOG' TO 'E:\***\REDO02.LOG';
ALTER DATABASE RENAME FILE 'D:\***\REDO03.LOG' TO 'E:\***\REDO03.LOG';
ALTER DATABASE RENAME FILE 'D:\***\REDO04.LOG' TO 'E:\***\REDO04.LOG';
ALTER DATABASE RENAME FILE 'D:\***\REDO05.LOG' TO 'E:\***\REDO05.LOG';
ALTER DATABASE RENAME FILE 'D:\***\REDO06.LOG' TO 'E:\***\REDO06.LOG';
ALTER DATABASE RENAME FILE 'D:\***\REDO07.LOG' TO 'E:\***\REDO07.LOG';
ALTER DATABASE RENAME FILE 'D:\***\REDO08.LOG' TO 'E:\***\REDO08.LOG';
ALTER DATABASE RENAME FILE 'D:\***\REDO09.LOG' TO 'E:\***\REDO09.LOG';
ALTER DATABASE clear logfile group 1;
ALTER DATABASE clear logfile group 2;
ALTER DATABASE clear logfile group 3;
ALTER DATABASE clear logfile group 4;
ALTER DATABASE clear logfile group 5;
ALTER DATABASE clear logfile group 6;
ALTER DATABASE clear logfile group 7;
ALTER DATABASE clear logfile group 8;
ALTER DATABASE clear logfile group 9;
select * from v$tempfile;
alter database tempfile 'E:\***\TEMP01.DBF' drop;
alter tablespace temp add tempfile 'E:\***\TEMP02.DBF' size 200m;
select * from v$tempfile;
ALTER DATABASE OPEN RESETLOGS upgrade;
@?/rdbms/admin/utlu112i.sql
@?/rdbms/admin/catupgrd.sql
stratup;
错误列表
ORA-01103: 控制文件中的数据库名 ''aaa'' 不是 ''bbb''
对待这种问题,我没有找怎么解决,对应我的数据库名,而是我把我的数据库名改了
select dbid,name from v$database;
# 登录 oracle
sqlplus /nolog
# 链接
conn /as sysdba
shutdown immediate
startup mount;
# 下边这个命令我没有执行成功,但是没有影响继续
nid target=system/system dbname=bbb
startup force nomount
alter system set db_name=bbb scope=spfile;
shutdown abort;
startup mount;
alter database open resetlogs;
alter user system identified by system;
dbf 文件目录不存在
# 通道 ORA_DISK_1: 正在读取备份片段 E:\***\LEVEL_FULL_***_20240413_12604
# 通道 ORA_DISK_1: ORA-19870: 还原备份片段 E:\***\LEVEL_FULL_***_20240413_12604 时出错
# ORA-19504: 无法创建文件"D:\***\APMEDSURGERY.DBF"
# ORA-27040: 文件创建错误, 无法创建文件
# OSD-04002: 无法打开文件
# O/S-Error: (OS 3) 系统找不到指定的路径。
RUN{
set newname for datafile 'D:\***\SYSAUX01.DBF' to 'E:\***\SYSAUX01.DBF';
RESTORE DATABASE;
switch datafile all;
}
已包括备份片段 E:*\LEVEL_FULL_*_20240413_12605
CATALOG BACKUPPIECE 'E:\***\LEVEL_FULL_***_20240413_12605';
TEMP01.DBF 不存在
alter database open resetlogs
ORA-01157: 无法标识/锁定数据文件 1 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 1: 'E:\***SYSTEM01.DBF'
select * from v$tempfile;
alter tablespace temp add tempfile 'E:\***\TEMP02.DBF' size 200m;
alter database tempfile 'E:\***\TEMP01.DBF' drop;
### 未测试命令
ALTER DATABASE RENAME FILE 'D:\***\TEMP01.DBF' TO 'E:\***\TEMP01.DBF';
alter database datafile 'E:\***\TEMP01.DBF' offline;
alter system check datafiles;
alter database datafile 'E:\***\TEMP01.DBF' offline drop;
database must be opened with UPGRADE option
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00704: bootstrap process failure
ORA-39700: database must be opened with UPGRADE option
alter database open resetlogs upgrade;
@?/rdbms/admin/utlu112i.sql
# 超级慢
@?/rdbms/admin/catupgrd.sql
# 重新连接 sql 启动
shutdown immediate
stratup;
### 以下未测试
@?/rdbms/admin/utlu112s.sql
@?/rdbms/admin/catuppst.sql
@?/rdbms/admin/utlrp.sql
当前 DBID *** 与目标装载数据库(***) 不匹配
# 退出 rman 重新连接
rman target /