DBA 是数据字典中真实存在的角色,可查、可授、可撤;SYSDBA 是登录身份标识,不存于数据字典,依赖密码文件,权限独立于数据库状态,且以它登录时会话用户恒为 SYS。
dba 是一个真实存在的 role,sysdba 不是 role,也不是权限集合,而是一种登录身份标识 —— 它不存于数据字典,不走授权视图,也不依赖数据库是否已打开。
DBA 是 Oracle 数据字典里明确定义的 Role,跟普通用户一样物理存在:
SELECT * FROM DBA_ROLES WHERE ROLE = 'DBA' 能查出结果GRANT DBA TO scott 之后,DBA_ROLE_PRIVS 视图中立刻出现记录REVOKE DBA FROM scott 后该记录消失,权限即时失效SYSDBA 不是 Role,所以:
SELECT * FROM DBA_ROLES WHERE ROLE = 'SYSDBA' 返回零行DBA_ROLE_PRIVS 里永远找不到 SYSDBA 相关记录GRANT SYSDBA TO scott 实际只是把 scott 写入 Oracle 密码文件(orapw$ORACLE_SID),不是写进数据字典REVOKE SYSDBA FROM scott,且需重启实例或刷新密码文件才能生效;若密码文件损坏或丢失,即使用户存在,SYSDBA 也失效CONN / AS SYSDBA 仍可连接并执行 STARTUP MOUNT —— 这正是它和 DBA 的分水岭无论用哪个用户名加 AS SYSDBA 登录,实际会话用户都是 SYS:
CONN scott/tiger AS SYSDBA → SHOW USER 显示 USER is "SYS"
SYS 模式,不是 scott 模式SELECT * FROM V$PWFILE_USERS 才能看到哪些用户被允许以 SYSDBA 身份登录CONN scott/tiger(无 AS SYSDBA)才是真正的 scott 用户上下文,哪怕他已被授予 DBA 角色DBA 角色无法触及数据库生命周期底层操作:
STARTUP / SHUTDOWN IMMEDIATE:DBA 用户执行报 ORA-01031: insufficient privileges
CREATE DATABASE 或 DROP DATABASE:仅 SYSDBA 允许ALTER DATABASE ARCHIVELOG:DBA 无权执行RESTORE DATABASE 或 RECOVER DATABASE:DBA 可以做表级恢复,但不能做库级恢复CREATE SPFILE FROM PFILE:DBA 用户会提示权限不足,SYSDBA 才行真正容易被忽略的是:SYSDBA 的有效性完全独立于数据库状态,而 DBA 的一切能力都建立在数据库已 OPEN 的前提上。很多运维事故源于混淆了“能连上”和“能干活”——CONN / AS SYSDBA 成功不代表 SELECT * FROM DBA_TABLES 就能跑通,反之亦然。