Oracle 数据库日常运维中的对于用户的管理,我们坚持合理授权,安全第一,权限最小,按需授予,责任分离的原则进行合理授权。基于安全考虑大多用户在不影响现有生产环境的前提下回收了非必要的 SYS 特权,本文主要介绍使用非 sys 用户进行 DG 管理。我们使用 12c 的 SYSDG 角色和设置 REDO_TRANSPORT_USER 参数可以实现 SYS 特权用户的分离。
在创建 Oracle12c 数据库时,为了方便数据库管理员的分工,会自动创建如下用户 :SYSBACKUP 、 SYSDG 、 SYSKM 。
SYSDG 便于数据保护操作。用户可以使用 Data Guard Broker 或 DGMGRL 命令行界面执行操作。
SYSDG 用户,具有 SYSDG 管理员权限,可以执行 Data Guard 操作。
您可以在 Data Guard Broker 或 DGMGRL 命令行界面上使用此特权。为了使用密码以 SYSDG 的身份连接数据库,您必须为它创建一个密码文件。不能将 SYSYSDG 管理员权限授予创建时没有身份验证的用户。
SYSDG 权限可以执行以下操作 :
·
STARTUP
·
SHUTDOWN
·
ALTER DATABASE
·
ALTER SESSION
·
ALTER SYSTEM
·
CREATE RESTORE POINT(including
GUARANTEEDrestore points)
·
CREATE SESSION
·
DROP RESTORE POINT(including
GUARANTEEDrestore points)
·
FLASHBACK DATABASE
·
SELECT ANY DICTIONARY
·
SELECT
·
X$tables (that is, the fixed tables)
·
V$and
GV$views (that is, the dynamic performance views)
·
APPQOSSYS.WLM_CLASSIFIER_PLAN
·
DELETE
·
APPQOSSYS.WLM_CLASSIFIER_PLAN
·
EXECUTE
·
SYS.DBMS_DRS
通过设置REDO_TRANSPORT_USER参数调整DG同步用户。 REDO_TRANSPORT_USER 指定当远程登录密码文件用于重做传输身份验证时,使用其密码验证器的用户名。该用户必须具有 SYSOPER 权限,并且在启动重做传输会话的数据库和重做传输会话的目标数据库中必须具有相同的密码。

该参数值区分大小写,必须与 V$PWFILE_USERS 视图中 USERNAME 列的值完全匹配。该行的 SYSOPER 列的值也必须为 TRUE 。
如果未指定此参数,则当使用远程登录密码文件进行重做传输身份验证时,将使用 SYS 用户的密码验证器。
以下是实施步骤:
1、 确认数据库版本 SQL> select BANNER from v$version; BANNER ---------------------------------------------------------------------- Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production PL/SQL Release 12.2.0.1.0 - Production CORE 12.2.0.1.0 Production TNS for Linux: Version 12.2.0.1.0 - Production NLSRTL Version 12.2.0.1.0 – Production SQL> select name,cdb from v$database; NAME CDB --------- --- CDB122 YES 2、 在主库新建DG维护用户。 12c多租户环境下DG是基于CDB的搭建并进行管理的,所以这里我们创建公共用户。 SQL> create user c##dgadmin identified by Oracle_123 2 password expire; User created. SQL> col username for a20 SQL> col account_status for a20 SQL> col common for a20 SQL> col con_id for 99999 SQL> select USERNAME,ACCOUNT_STATUS,COMMON,CON_ID from cdb_users where username='C##DGADMIN'; USERNAME ACCOUNT_STATUS COMMON CON_ID --------------- -------------------- ---------- ------- C##DGADMIN EXPIRED YES 1 C##DGADMIN EXPIRED YES 3 3、 给用户授权 SQL> grant sysoper,sysdg,connect to C##DGADMIN; Grant succeeded. 4、 确认v$pwfile_users 在主库执行以下语句,确保C##DGADMIN的SYSDG和SYSOPER为true。 SQL> select username,sysdba,sysoper,sysdg from v$pwfile_users; USERNAME SYSDBA SYSOPER SYSDG -------------------- -------------------- -------------------- ---------- SYS TRUE TRUE FALSE SYSDG FALSE FALSE TRUE SYSBACKUP FALSE FALSE FALSE SYSKM FALSE FALSE FALSE C##DGADMIN FALSE TRUE TRUE SQL> 5、 确认主库口令文件位置 srvctl config database -db cdb122 Password file: +data/cdb122/orapwdcdb122 6、 将主库的密码文件复制到备库 主库: su -grid asmcmd ASMCMD>cp +data/cdb122/orapwdcdb122 /home/grid 以grid用户将密码文件从主库传输到备库 scp orapwdcdb122 grid@stdb:/home/grid 备库: asmcmd ASMCMD>cp /home/grid/orapwdcdb122 +data/stdbcdb122/orapwdcdb122 7、 确认密码文件是否生效 在主库执行以下语句,确保C##DGADMIN的SYSDG和SYSOPER为true。 SQL> select username,sysdba,sysoper,sysdg from v$pwfile_users; USERNAME SYSDBA SYSOPER SYSDG -------------------- -------------------- -------------------- -------------------- SYS TRUE TRUE FALSE SYSDG FALSE FALSE TRUE SYSBACKUP FALSE FALSE FALSE SYSKM FALSE FALSE FALSE C##DGADMIN FALSE TRUE TRUE 8、修改REDO_TRANSPORT_USER参数 主库 SQL>sqlplus / as sysdba SQL>alter system set redo_transport_user= C##DGADMIN scope=both; 备库 SQL>sqlplus / as sysdba SQL>alter system set redo_transport_user= C##DGADMIN scope=both; 8、 重启mrp进程 备库: SQL>alter database recover managed standby database cancel; SQL>shutdown immediate sqlplus C##DGADMIN/Oracle_123 as sysdg SQL>startup SQL>alter database recover managed standby database using current logfile disconnect from session; 主库: 切归档 SQL>alter system archive log current; 检查归档日志是否应用 SQL> select NAME,THREAD#,SEQUENCE#,REGISTRAR,APPLIED,COMPLETION_TIME from v$archived_log where name is not null and COMPLETION_TIME>sysdate-3 order by 6,3; -The end-
