Table of Contents
RMAN 异机恢复教程(Windows为例)
一、查询源库相关信息
1、dbid
SQL> select dbid from v$database;
DBID
----------
1580017382
2、数据文件
SQL> select file_id, file_name from dba_data_files;
FILE_ID ---------- FILE_NAME
---------------------------------------------------------------------
4 E:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF
3 E:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS01.DBF
2 E:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF
1 E:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF
5 E:\APP\ADMINISTRATOR\PRODUCT\11.2.0\DBHOME_1\DATABASE\TEST1.DBF
6 E:\APP\ADMINISTRATOR\PRODUCT\11.2.0\DBHOME_1\DATABASE\TEST2.DBF
3、日志文件
SQL> select member from v$logfile;
MEMBER
----------------------------------------------
E:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG
E:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG
E:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG
4、控制文件
SQL> show parameter control_files;
NAME TYPE VALUE
------------------------------------
control_files string E:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL01.CTL, E:\APP\ADMINISTRATOR\FAST_RECOVERY_AREA\ORCL\CONTROL02.CTL
5、参数文件
SQL> show parameter spfile;
NAME TYPE VALUE
------------------------------------
spfile string E:\APP\ADMINISTRATOR\PRODUCT\11.2.0\DBHOME_1\DATABASE\SPFILEORCL.ORA
6、临时文件
SQL> select file_id,tablespace_name, file_name from dba_temp_files;
ILE_ID TABLESPACE_NAME FILE_NAME
-----------------------------------------------------------------------
1 TEMP E:\APP\ADMINISTRATOR\ORADATA\ORCL\TEMP01.DBF
2 BDCJY01_TEMP E:\APP\ADMINISTRATOR\ORADATA\ORCL\DB_TEST01_TEMP.DBF
二、完整备份源数据库
要把数据文件、控制文件、归档日志都备份
rman target /
backup incremental level=0 database include current controlfile format 'D:\rman_backup\level0_%d_%s_%p_%u.bak' plus archivelog format 'D:\rman_backup\log_%d_%s_%p_%u.bak';
把备份文件拷贝到恢复库,暂定目录为D:\rman_backup\
三、恢复库基础环境搭建
1、建空实例
oradim -new -sid ORCL -startmode auto -srvcstart system
2、设置dbid
rman>set dbid 1580017382;
3、spfile to pfile
由复制过来的SPFILEORCL.ORA创建pfile文件,并修改对应的地方。
如果对应目录没有文件,需要建目录
SQLplus / as sysdba
(进入空实例)
SQL>create pfile= 'D:\pfile.ora ' from spfile= 'D:\SPFILEORCL.ORA ';
这些目录需对比源库和恢复库的URL进行修改,修改为恢复库的目录。恢复库没有的目录,需要手动建立。恢复库的目录和源库的目录可以不相同。
4、pfile to spfile
SQL>create spfile='D:\SPFILEORCL.ORA' from pfile='D:\pfile.ora';
把spfile文件拷贝到恢复库的$ORACLE_HOME\database
下。
SQL>startup nomount; //利用参数文件把数据库启动到nomount状态
注意:如果没复制spfile,这样操作:
创建一个初始pfile.ora文件,如下:
audit_file_dest=' D:\app\Administrator\admin\ORCL\adump'
compatible='11.2.0'
control_files='D:\app\Administrator\oradata\ORCL\CONTROL01.CTL','D:\app\Administrator\oradata\ORCL\CONTROL02.CTL'
db_block_size=8192
db_name='ORCL'
log_archive_dest=' D:\app\Administrator\archivelog'
log_archive_format='log_%t_%s_%r.arc'
remote_login_passwordfile='EXCLUSIVE'
memory_target=0
undo_management='AUTO'
undo_tablespace='UNDOTBS1'
然后由pfile to spfile
PS:另外还可以从备份片中恢复,一般备份集中最小的文件为参数文件。恢复库的路径最好是跟原库一样,就可以不用修改参数。
先用默认的参数文件启动到startup nomount
状态,然后在rman
中执行
restore spfile to 'D:\SPFILEORCL.ORA' from 'D:\backup\DB_LEVEL0_ORCL_20240801_1131_3B2FL7UQ.BAK'
然后再按照上面的方法转换成pfile。
四、恢复库恢复控制文件
rman target / nocatalog
rman>restore controlfile from 'D:\rman_backup\xxx.bak';
需要指定控制文件的备份文件,一般是最小的备份文件,但是控制文件也可能跟参数文件分开在两个备份片里,所以最小的无法恢复的话,尝试第二小的文件。
等待控制文件恢复完成
控制文件会恢复到pfile指定的目录下
SQL>alter database mount; //利用恢复的控制文件把数据库启动到mount状态
五、恢复数据文件
1、检查备份集
rman>list backup;
会发现还记录着源库的备份信息,状态: AVAILABLE
。但实际上这些备份信息在恢复库是没用,因此需要交叉检查备份信息
rman>crosscheck backup;
会发现原备份信息的状态为过期 状态: EXPIRED
2、注册拷贝过来的备份集
rman>catalog start with 'D:\rman_backup\';
提示是否导入,输入yes,进行备份集的导入。
再交叉检查备份集
rman>crosscheck backup;
rman>list backup;
3、修改恢复数据文件的路径
注:该步骤用在恢复库和源库的目录不一致的情况
1)查看数据文件原路径(查询结果和源数据库数据文件一致)
SQL>select file# , name from v$datafile;
file/grp#----------NAME
-------------------------------------------------------------------------
1 E:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF
2 E:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF
3 E:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS01.DBF
4 E:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF
5 E:\APP\ADMINISTRATOR\PRODUCT\11.2.0\DBHOME_1\DATABASE\TEST1.DBF
6 E:\APP\ADMINISTRATOR\PRODUCT\11.2.0\DBHOME_1\DATABASE\TEST2.DBF
(推荐)或直接在rman中执行restore database;
尝试还原,根据报错的信息查看数据文件编号与其对应的位置
2)指定数据文件在恢复库中的路径
建议先在文本文档写好,再在rman运行
run{
set newname for datafile 1 to 'D:\app\Administrator\oradata\ORCL\SYSTEM01.DBF';
set newname for datafile 2 to 'D:\app\Administrator\oradata\ORCL\SYSAUX01.DBF';
set newname for datafile 3 to 'D:\app\Administrator\oradata\ORCL\UNDOTBS01.DBF';
set newname for datafile 4 to 'D:\app\Administrator\oradata\ORCL\USERS01.DBF';
set newname for datafile 5 to 'D:\app\Administrator\oradata\ORCL\TEST1.DBF';
set newname for datafile 6 to 'D:\app\Administrator\oradata\ORCL\TEST2.DBF';
restore database;
switch datafile all;
}
复制到rman窗口运行
等待数据文件恢复完成
如果要恢复到某个时间点
SQL>alter session set nls_date_format= 'yyyy-mm-dd hh24:mi:ss'
RMAN>recover database until time '2024-8-1 14:00:00';
或者恢复到备份集里最新的scn
recover database;
RMAN-03002: recover 命令 (在 08/02/2024 08:36:48 上) 失败
RMAN-06054: 介质恢复正在请求未知的线程 1 序列 105776 的归档日志以及起始 SCN 62897768726
根据报错信息查看备份集里最新的scn号再进行不完全恢复
recover database until scn 62897768726;
3)修改临时文件的路径
以下开始在 sqlplus 执行,非 rman 执行
查询现在的路径
sqlplus / as sysdba
select name from v$tempfile;
修改为期望的路径
alter database rename file 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\TEMP01.DBF' to 'D:\app\ADMINISTRATOR\oradata\ORCL\temp01.dbf';
alter database rename file 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\DB_TEST01_TEMP.DBF' to 'D:\app\ADMINISTRATOR\oradata\ORCL\DB_TEST01_TEMP.DBF';
4)修改日志文件的路径
查询现在的路径
select member from v$logfile;
修改为期望的路径
alter database rename file 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG' to 'D:\app\ADMINISTRATOR\oradata\ORCL\REDO01.LOG';
alter database rename file 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG' to 'D:\app\ADMINISTRATOR\oradata\ORCL\REDO02.LOG';
alter database rename file 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG' to 'D:\app\ADMINISTRATOR\oradata\ORCL\REDO03.LOG';
等待更改完成
4、打开数据库
SQL>alter database open resetlogs;
六、配置监听
恢复库的监听,可以配置为动态监听,也可以配置为静态监听。(也可以用netca来创建监听器)
静态监听如下(目录$ORACLE_HOME\network\admin\listener.ora):
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = testdb)
(SID_NAME = testdb)
(ORACLE_HOME = D:\app\Administrator\product\11.2.0\dbhome_1)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.111)(PORT = 1521))
)
)
ADR_BASE_LISTENER = D:\app\Administrator
七、错误解决方法集
1、提示ORA-00392
如果提示“ORA-00392日志2用于线程1正被清除,不允许操作”错误,需要进行以下操作:
SQL> select GROUP#,STATUS from v$log;
GROUP# STATUS
---------- ----------------
1 CLEARING
3 CLEARING
2 CLEARING_CURRENT
SQL> alter database clear logfile group 1;
数据库已更改。
SQL> alter database clear logfile group 2;
数据库已更改。
SQL> alter database clear logfile group 3;
数据库已更改。
SQL> select GROUP#,STATUS from v$log;
GROUP# STATUS
---------- ----------------
1 UNUSED
3 UNUSED
2 CURRENT
之后再打开数据库
SQL>alter database open resetlogs;
2、提示ORA-01157和ORA-01110错误
提示
ORA-01157:无法标识/锁定数据文件201 - 请参阅 DBWR 跟踪文件
ORA-01110:数据文件 201:`D:\\APP\ADMINISTRATOR\\ORACLE\ORCL\\TEMP01.DBF`
检查一下TEMP文件
select tablespace_name, file_name from dba_temp_files;
这样也好重现这个错误
解决方法:
1、关闭、开启数据库,然后去跟踪文件D:\app\administrator\diag\rdbms\orcl\orcl\trace
看一下错误提示,一般提示路径不存在。
2、可以照着路径,建一个一样的路径,再启动数据库,就不会报错了。
3、新建一个TEMP02作为默认表空间,然后删除之前的表空间
create temporary tablespace temp02 tempfile 'D:\APP\ADMINISTRATOR\ORACLE\ORCL\TEMP01.DBF\temp02.dbf' size 1g; //路径自定义
alter database default temporary tablespace temp02;
ps:如果TEMP表空间还有会话在使用,删除TEMP表空间会失败,以下语句是查下TEMP表空间是否还有会话在使用
select m.USERNAME,m.SID,m.SERIAL#,m.SQL_ADDRESS,m.MACHINE,m.PROGRAM,n.TABLESPACE,n.SEGTYPE,n.CONTENTS from v$session m, v$sort_usage n where m.SADDR = n.SESSION_ADDR;
删除掉使用TEMP空间的会话
alter system kill session 'SID,SERIAL#';
然后再执行
drop tablespace temp including contents and datafiles;
重建并修改默认临时表空间办法:
--查询当前数据库默认临时表空间名
select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';
--创建新的临时表空间
create temporary tablespace temp02 tempfile 'E:\oracle\oradata\orcl\TEMP02.DBF' size 1024M autoextend on;
--修改默认表空间为刚刚建立的临时表空间
alter database default temporary tablespace temp02;
--查看用户所用临时表空间的情况
SELECT USERNAME,TEMPORARY_TABLESPACE FROM DBA_USERS;
--删除原来的临时表空间
drop tablespace temp including contents and datafiles;
--查看所有表空间名确认临时表空间是否已删除
select tablespace_name from dba_tablespaces;
发表回复