在一个RAC集群里,多套数据库共享同一个ASM实例是常态。默认情况下,ASM对文件不做权限隔离,任何有权访问ASM实例的用户理论上都可以触碰所有磁盘组里的文件。一旦某个数据库的运维人员误删了另一个数据库的数据文件,后果不堪设想。ASM的access control(访问控制)正是为了解决这个问题而设计的,它通过给ASM文件设置属主和访问权限,把不同数据库的文件隔离开来。这篇文章就从原理到实操,完整讲一遍这套机制怎么用。

ASM访问控制的底层原理
ASM的访问控制建立在三个核心概念上:ownership(属主)、group(属组)和permission(权限)。这三者合起来决定了某个操作系统用户能否读写特定的ASM文件。它的设计思路和Linux文件权限非常相似,理解了Linux的rwx模型,ASM的访问控制就很好理解了。
具体来说,ASM会维护一张用户映射表,把操作系统用户映射到磁盘组内的逻辑用户上。磁盘组属性ACCESS_CONTROL.ENABLED决定了访问控制是否生效,只有这个属性设置为true,后续的属主和权限设置才有意义。当设置为false时,ASM不做任何权限检查,所有客户端都能访问文件,这也是默认状态。
需要特别注意的是,权限检查发生在文件级别,而不是磁盘组级别。也就是说,你可以在同一个磁盘组内给数据库A的文件设置严格的属主隔离,而给数据库B的文件保持开放。这种细粒度控制让多个数据库共享存储时既能省空间,又互不干扰。
配置前的准备工作:操作系统用户与用户组规划
配置访问控制之前,先要在所有RAC节点上规划好操作系统用户。假设集群里跑两套数据库,分别是orcl和sales,那么建议为每套数据库创建独立的安装用户,并把它们放进一个共同的ASM管理组,比如asmadmin。
-- 以root用户在所有节点执行 groupadd -g 501 asmadmin useradd -u 1001 -g oinstall -G asmadmin oracle1 useradd -u 1002 -g oinstall -G asmadmin oracle2 -- 给两个用户分别设置密码 passwd oracle1 passwd oracle2
规划用户时有一条铁律:拥有SYSASM权限的用户必须是asmadmin组的成员,而各数据库的软件安装用户也要加入asmadmin组,否则数据库实例连ASM实例时会因为权限不足而报错。另外,如果是在Windows平台的Oracle环境上做类似测试,涉及本地安全策略或注册表配置时,路径要写完整,比如HKEY_LOCAL_MACHINE\SOFTWARE\Oracle,不要省略任何一级。
启用磁盘组访问控制并设置属主权限
准备工作就绪后,第一步是打开磁盘组的访问控制开关。用grid用户登录sqlplus,以SYSASM身份执行:
-- 启用DATA磁盘组的访问控制 ALTER DISKGROUP DATA SET ATTRIBUTE 'ACCESS_CONTROL.ENABLED'='TRUE'; -- 设置访问控制的操作系统用户范围,可以是数据库全名或OS用户名 ALTER DISKGROUP DATA SET ATTRIBUTE 'ACCESS_CONTROL.UMASK'='026';
第二步是给磁盘组内的文件设置属主。假设orcl数据库由oracle1用户运行,sales数据库由oracle2用户运行,可以这样设置:
-- 将文件属主分别授予对应用户,owner对应文件所有者 ALTER DISKGROUP DATA SET OWNERSHIP OWNER = 'oracle1' FOR FILE '+DATA/orcl/datafile/users.271.1029384756'; -- 修改文件权限,u表示属主,g表示属组 ALTER DISKGROUP DATA SET PERMISSION OWNER = READ WRITE, GROUP = READ ONLY, OTHERS = NONE FOR FILE '+DATA/orcl/datafile/users.271.1029384756';
如果想批量处理某个数据库目录下的所有文件,可以直接对目录设置,新建的文件会自动继承目录的属主和权限,这一点和文件系统的继承机制一致,能省去大量重复操作。
常见报错与验证方法
配置过程中最常遇到的是ORA-15260错误,提示permission denied, unavailable to mount diskgroup。这个报错说明执行操作的用户不具备SYSASM权限,通常是用户没有加入asmadmin组导致的。检查各节点的用户组配置,用id oracle1命令确认输出里有asmadmin即可。
另一个高频问题是ORA-15032和ORA-15260组合出现,磁盘组无法mount。排查思路是先用v$asm_diskgroup视图查看ACCESS_CONTROL.ENABLED属性是否生效,再查v$asm_file确认文件的usergroup和permissions字段值。验证权限是否真正生效,可以切换到普通用户,尝试通过asmcmd访问文件:
-- 用数据库软件用户登录asmcmd验证 su - oracle1 asmcmd -p cd DATA/orcl/datafile ls -l -- 尝试读取不属于该用户的文件,应报权限错误 cd ../../sales/datafile
最后提醒一点,访问控制启用后新建文件会按UMASK属性自动设置权限,但存量文件不会自动变更,需要DBA手动批量调整。建议在变更窗口内完成,并提前在测试环境演练一遍完整流程,确认两套数据库都能正常open,再推到生产。做完变更后,把磁盘组属性、文件属主清单导出存档,方便日后审计和故障回溯。
Oracle RACASM磁盘组access control修改时间:2026-09-09 18:26:48