Oracle RMAN备份脚本、rman还原恢复测试、rman常用语句
一、全量备份脚本
前提,已经准备好备份目录/backup(可以是nfs挂载),确保空间和权限没问题
su - oracle
mkdir /home/oracle/scripts
##全量备份脚本 dbname表示数据库名称,自行修改即可####
cat > /home/oracle/scripts/backup_full.sh <<'EOF'
#!/bin/bash
source /home/oracle/.bash_profile
echo ''
echo `date` ": ***** dbname_fullbackup start *****"
rman nocatalog target / << eof
run{
allocate channel c1 type disk ;
allocate channel c2 type disk ;
allocate channel c3 type disk ;
allocate channel c4 type disk ;
set limit channel c1 kbytes 52428800;
set limit channel c2 kbytes 52428800;
set limit channel c3 kbytes 52428800;
set limit channel c4 kbytes 52428800;
backup database format '/backup/dbname_full_%T_%s_%p_%t';
release channel c1;
release channel c2;
release channel c3;
release channel c4;
sql 'alter system archive log current';
}
run{
sql 'alter system archive log current';
allocate channel c1 type disk format '/backup/dbname_arch_%T_%s_%p_%t';
set limit channel c1 kbytes 23194304;
backup archivelog all delete input;
release channel c1;
backup current controlfile format '/backup/dbname_control%U';
backup spfile format '/backup/dbname_spfile%U';
}
exit
eof
echo ''
echo `date` ": ***** dbname_fullbackup end *****"
EOF
chmod u+x /home/oracle/scripts/*.sh
二、增量归档日志备份脚本
前提,已经准备好备份目录/backup(可以是nfs挂载),确保空间和权限没问题
su - oracle
mkdir /home/oracle/scripts
##增量归档日志备份脚本 dbname表示数据库名称,自行修改即可####
cat > /home/oracle/scripts/backup_arch.sh<<'EOF'
#!/bin/bash
source /home/oracle/.bash_profile
echo ''
echo `date` ": ***** dbname_archbackup start *****"
rman nocatalog target / << eof
run{
sql 'alter system archive log current';
allocate channel c1 type disk format '/backup/dbname_arch_%T_%s_%p_%t';
set limit channel c1 kbytes 23194304;
backup archivelog all delete input;
release channel c1;
backup current controlfile format '/backup/dbname_control%U';
backup spfile format '/backup/dbname_spfile%U';
}
exit
eof
echo ''
echo `date` ": ***** dbname_archbackup end *****"
EOF
chmod u+x /home/oracle/scripts/*.sh
三、大文件表空间,优化全量备份速度的方法
备注:通过切片的方式(section size 51200M),提高并行备份速度
run{
allocate channel c1 type disk ;
allocate channel c2 type disk ;
allocate channel c3 type disk ;
allocate channel c4 type disk ;
backup database section size 51200M format '/backup/dbname_full_%T_%s_%p_%t';
release channel c1;
release channel c2;
release channel c3;
release channel c4;
sql 'alter system archive log current';
}
四、rman全量还原和恢复测试流程
前期准备工作
1、准备rman恢复测试服务器(磁盘空间一定要满足,cpu和内存可以低于生产环境)
2、规划用于还原数据库的存储目录(例如/oradata/orcl)
3、如果全量备份是保存至nfs上,将nfs挂载至rman恢复测试服务器(建议挂载目录与生产环境一致,例如/backup)。如果是其它方式,需要提前准备好用于rman还原的通道
4、安装待还原的Oracle数据库的对应版本的Oracle软件
5、配置.bash_profile环境变量(根据生产环境内容修改一下即可)
6、配置pfile文件(根据生产环境生产,进行适当修改即可,主要是内存大小这些)
7、创建必要的目录(根据pfile文件的配置,对应的目录,提前创建完毕,例如归档目录,数据文件目录,adump目录等)
8、启动数据库到nomount状态(建议关闭job,设置job_queue_processes=0)
9、还原控制文件
查看生产环境最新的控制文件备份
ls -ltr /backup/*control*
rman target /
restore controlfile from '/backup/xxxxxxxxxxx';
通过上述命令还原
sql 'alter database mount';
将数据库启动到mount状态
10、还原数据库(即还原数据文件)
如果还原数据库的存储目录与生产环境不一致,需要在还原的时候,提前set newname重命名数据文件名称
例如+DATA磁盘,还原环境为/oradata/orcl,可以通过如下方式,在生产环境中执行,一次性获得set newname重命名数据文件名称的命令。
select 'set newname for datafile '||file_id||' to '''||replace(file_name,'+DATA','/oradata/orcl')||''''||';' str
from dba_data_files
order by file_id;
示例:
cat >rman_restore.sh <<'EOF'
rman target / <<eof
run{
allocate channel c1 device type disk;
allocate channel c2 device type disk;
allocate channel c3 device type disk;
allocate channel c4 device type disk;
set newname for datafile 1 to '/oradata/orcl/system01.dbf';
set newname for datafile 2 to '/oradata/orcl/sysaux01.dbf';
set newname for datafile 3 to '/oradata/orcl/undotbs01.dbf';
set newname for datafile 4 to '/oradata/orcl/users01.dbf';
.......
restore database;
switch datafile all;
release channel c1;
release channel c2;
release channel c3;
release channel c4;
}
exit
eof
EOF
chmod u+x rman_restore.sh
后台方式执行
nohup sh rman_restore.sh &
11、恢复数据库(不完全恢复)
查询数据库的归档日志备份清淡
list backup of archivelog all;
根据查询出来的,选择一个redo序列号,最为恢复数据库的结束位置,进行数据库恢复,如下:
run
{
set until sequence 16666 thread 1;
recover database;
}
备注:
1)set until sequence 16666,表示16665归档日志恢复出来,且应用;16666序列号日志,不恢复;
2)对于RAC的恢复,可能需要类似如下格式
run
{
set until sequence 16665 thread 1;
set until sequence 55253 thread 2;
recover database;
}
备注:也可以后台方式执行
12、收尾工作
1)重建临时文件tempfile(临时文件不会还原)
SQL> select name from v$tempfile;
NAME
--------------------------------------------------------------------------------
+DATA/temp01.dbf
alter tablespace temp add tempfile '/oradata/orcl/temp01.dbf' size 30g autoextend off;
alter database tempfile '+DATA/temp01.dbf' drop;
select name from v$tempfile;
NAME
--------------------------------------------------------------------------------
/oradata/zhdd/temp01.dbf
2)数据库块校验和验证(可选)
vi validate.sh
rman target / <<eof
run{
allocate channel c1 device type disk;
allocate channel c2 device type disk;
allocate channel c3 device type disk;
allocate channel c4 device type disk;
backup validate database;
release channel c1;
release channel c2;
release channel c3;
release channel c4;
}
exit
eof
五、常用RMAN语句
crosscheck backup;
交叉核对(校验)所有备份集。RMAN 会检查控制文件或恢复目录中记录的备份信息,并与磁盘或磁带上的实际物理文件进行比对。如果物理文件存在,状态保持为 AVAILABLE;如果物理文件丢失或被外部命令(如 rm)删除,RMAN 会将其状态标记为 EXPIRED(过期/无效)。此命令本身不会删除任何文件
delete noprompt expired backup;
它不会删除实际的物理文件,而是清理 RMAN 资料库(控制文件或恢复目录)中那些因为物理文件丢失而被标记为 EXPIRED 的元数据记录。noprompt 参数的作用是抑制交互确认提示,使命令直接执行
CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
告诉 RMAN 必须为每个数据文件保留至少 2 份可用的备份。当备份份数超过 2 份时,最旧的备份将被 RMAN 判定为"过时(Obsolete)",可以被安全清理
report obsolete;
根据当前配置的保留策略(如上面的 REDUNDANCY 2),列出所有不再需要用于恢复的备份集、数据文件副本和归档日志。这是一个只读操作,仅用于预览,不会删除任何文件
delete noprompt obsolete;
根据当前的保留策略,删除那些被判定为不再需要的备份物理文件,同时更新控制文件或恢复目录中的记录。配合 noprompt 参数,常用于自动化备份脚本中
delete archivelog all;
RMAN 会尝试删除当前资料库中记录的所有归档日志物理文件,并在删除前弹出交互提示,要求用户手动输入 YES 或 NO 进行确认。
delete noprompt archivelog all;
与上一条命令功能相同,但增加了 noprompt 参数,跳过了交互确认步骤,直接执行删除。
delete noprompt archivelog all completed before 'sysdate-3';
根据归档日志的完成时间(completion_time)进行过滤,仅删除 3 天前的归档日志。需要注意的是,如果当前环境配置了 Data Guard(备库),且备库尚未应用这些归档日志,或者存在保留策略的限制,该命令可能会受到限制而无法删除
delete noprompt FORCE archivelog all completed before 'sysdate-3';
在上一条命令的基础上增加了 FORCE 关键字。即使当前的归档删除策略(Archivelog Deletion Policy)或 Data Guard 环境限制了这些日志的删除(例如备库尚未应用),RMAN 也会强制忽略这些限制并执行删除操作,使用 FORCE 参数需要非常谨慎。如果强制删除了尚未被备库应用(Applied)或尚未被备份的归档日志,可能会导致数据库无法进行完整的时间点恢复(Point-in-Time Recovery),或者导致主备库同步断裂
六、RMAN备份作业检查语句
--通过查询v$rman_backup_job_details视图,查询最近7天的rman备份作业执行情况
set linesize 200 pagesize 999
col input_bytes_display format a10
col output_bytes_display format a10
col time_taken_display format a10
select to_char(start_time,'yyyymmdd hh24:mi:ss') time,trunc(elapsed_seconds/60) duration_min,input_type,status,input_bytes_display,output_bytes_display,time_taken_display
from v$rman_backup_job_details
where start_time>trunc(sysdate)-7
order by time;