Oracle RMAN备份脚本、RMAN还原恢复测试、RMAN常用语句

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; 
相关推荐
汽车仪器仪表相关领域1 小时前
ZDT‑I伺服电机测试系统:四象限动态加载
大数据·数据库·分布式·功能测试·汽车·压力测试·可用性测试
云贝教育-郑老师1 小时前
Oracle 块清除(Block Cleanout):commit 之后,数据块里的“战场“谁来打扫?
数据库·学习·oracle
gs801401 小时前
Java 响应式编程详解:从 Flux、Mono 到 Spring WebFlux 技术生态
数据库·oracle
一只旭宝2 小时前
预约系统版本2(pyhton+flask可视化版本)
服务器·数据库·c++·笔记·python·flask
__zRainy__2 小时前
Node系列 · ORM:mysql 驱动程序
数据库·后端·mysql·node.js·orm
程序员夏洛2 小时前
MySQL 中如果发生死锁应该如何解决?
数据库·mysql
肠畔码农2 小时前
Redis 深度内核解析与高性能运维调优指南
运维·数据库·redis
钱六两2 小时前
SpringAI集成RAG实操(postgresql+pgvector)中(集成到项目中)
数据库·postgresql
万维易源2 小时前
油价行情数据接口整理:国际原油与国内成品油
大数据·数据库·原油·油价