rman备份文件权限由操作系统umask决定,而非rman控制;其生成的备份文件权限为-rw-r--r--(644)是因为数据库实例进程继承启动时shell的默认umask 022,且不读取~/.bashrc等交互式配置;永久修正需从进程源头配置systemd的umask=或sysv init脚本中的umask指令,而非修改rman客户端脚本。
rman备份文件权限由操作系统umask决定,不是rman本身控制的。当你用rman target /连接并执行backup database后,生成的备份集(如/u01/backup/db_0123456789.bkp)权限为-rw-r--r--(644),而非预期的-rw-r-----(640)或更严格值——这通常是因为oracle进程继承了启动它的shell的umask值,默认是022。
为什么RMAN不遵守oracle用户家目录里的~/.bashrc umask设置
Oracle后台进程(如ora_<em>xxx</em>_<sid></sid>)不读取交互式shell配置文件。即使你在oracle用户的~/.bashrc里写了umask 027,RMAN调用的备份写入操作仍由数据库实例进程执行,它只继承启动数据库时的环境(通常是/etc/init.d/oracleasm或systemd服务脚本的上下文)。
- 数据库实例启动方式决定umask来源:手工
sqlplus / as sysdba再startup→ 继承当前shell umask;用systemctl start oracle-database→ 继承systemd service定义的UMask=或全局默认 -
rman target /本质是连接已运行的实例,不新建shell环境,所以.bashrc、.profile完全无效 - 验证方法:
ps -eo pid,comm,umask | grep ora_(需procfs支持)或在数据库中查select * from v$process where program like 'ora_%';后比对对应PID的/proc/<pid>/status</pid>中Umask:字段
如何永久修正RMAN备份文件权限(非临时export)
必须从进程启动源头控制umask,不能依赖用户shell配置。实际生效路径只有两条:
- 若使用
systemd(Oracle Linux 7+/CentOS 7+):编辑/usr/lib/systemd/system/oracle-database.service,在[Service]段添加UMask=007(对应目录770、文件660),然后systemctl daemon-reload && systemctl restart oracle-database - 若用SysV init(传统
/etc/init.d/oracle):在start()函数开头插入umask 007,确保在su - oracle -c "sqlplus / as sysdba 之前执行 - 禁止在
$ORACLE_HOME/bin/rman脚本里改umask——该脚本只控制RMAN客户端自身,不影响备份写入的服务器端进程
umask 002 / 007 / 027 对备份文件的实际影响
注意umask作用于“创建时”,且仅屏蔽权限位。RMAN写文件时使用的系统调用是open(path, O_CREAT|O_WRONLY, 0600)(硬编码为600),因此最终权限 = 0600 & ~umask:
-
umask 002→ 文件权限600(因为0600 & ~002 = 0600)→ 实际仍是-rw-------,群组/其他人无权读 -
umask 007→ 同样得600,但目录(如/u01/backup)会变成770,防止他人创建同名文件覆盖 -
umask 027→ 文件仍为600,但若RMAN用mkdir建子目录(如CONFIGURE CHANNEL ... FORMAT '/u01/bak/%d/%U'),目录权限变为750,比007更保守
真正需要严格权限的场景,是共享存储上多个DBA共用备份目录——此时umask 007或027能阻止非dba组成员意外删改备份集,而仅靠022会让文件对所有人可读,违反最小权限原则。











