Oracle 12c Dataguard, utiliser un autre compte que SYS avec le paramètre REDO_TRANSPORT_USER

Introduction

Pour des raisons de sécurité, certaines politiques d'entreprise imposent de modifier à intervalles réguliers les comptes systèmes des moteurs de bases de données (SYS et SYSTEM pour Oracle, sa pour SQL Server et SAP Adaptive Server Enterprise, root pour MySQL...), voire de les verrouiller et utiliser des comptes personnalisés avec des droits administrateurs (DBA, sysadmin...).

Dans le contexte d'une architecture Oracle DataGuard schématisée dans la figure ci-dessous, il est possible de ne pas utiliser le compte SYS pour le transport des redo logs d'une base primaire vers une base standby physique grâce au paramètre REDO_TRANSPORT_USER. En spécifiant un autre compte, il n'est alors plus nécessaire de copier le fichier password vers les bases standby si le mot de passe du compte SYS est modifié. La méthode avec Oracle 12c est exposée ici et dans cette démo il s'agit d'un environnement Oracle RAC avec du stockage ASM.

Oracle 12c Dataguard architecture

Création du compte de transport des redo logs

Le paramètre redo_transport_user identifie le compte Oracle utilisé pour appliquer les redo logs de la base primaire vers la base standby. Ce paramètre est vide lorsque c'est le compte SYS qui est utilisé.

SCDU1ORA (prim)> show parameter redo_transport_user;
NAME                                 TYPE        VALUE
------------------------------------ ----------- -------------------------
redo_transport_user                  string

Créér le compte qui sera en charge du transport des redo logs dans la base primaire et attribuer le rôle SYSOPER à celui-ci.

SCDU1ORA (prim)> create user SCDMAINTDG identified by "**********";
SCDU1ORA (prim)> grant sysoper to SCDMAINTDG;User created.
Grant succeeded.

Le compte est immédiatement visible dans la vue V$PWFILE_USERS ou VG$PWFILE_USERS dans un contexte RAC :

SCDU1ORA (prim)> select username, sysdba, sysoper from v$pwfile_users;
USERNAME                       SYSDB SYSOP
------------------------------ ----- -----
SYS                            TRUE  TRUE
SCDMAINTDG                     FALSE TRUE
SCDU1ORA (prim)> select inst_id, username, 
                 sysdba, sysoper from gv$pwfile_users;
   INST_ID USERNAME                       SYSDB SYSOP
---------- ------------------------------ ----- -----
         1 SYS                            TRUE  TRUE
         1 SCDMAINTDG                     FALSE TRUE
         2 SYS                            TRUE  TRUE
         2 SCDMAINTDG                     FALSE TRUE
         3 SYS                            TRUE  TRUE
         3 SCDMAINTDG                     FALSE TRUE

Déclencher un switch logfile sur la base primaire afin que le compte SCDMAINTDG soit répliqué immédiatement sur la base ou les bases standby et vérifier la bonne réplication du compte.

SCDU1ORA (prim)> alter system switch logfile;

Copie du fichier password

À présent le fichier des passwords doit être copié de la base primaire vers la ou les bases standby.

Utiliser srvctl config pour retrouver la localisation des fichiers password de la base primaire et de la base standby :

oracle@hostprim> srvctl config database -d scuat_b
Database unique name: scuat_c
Database name: scuat
Oracle home: /oracle/rdbms/orahome/UAT/12.1.0.2
Oracle user: oracle
Spfile: +CDBSUAT/spfilescuat.ora
Password file: +CDBSUAT/scuat_c/PASSWORD/orapwscuat
....
oracle@hoststandby> srvctl config database -d scuat_c
Database unique name: scuat_b
Database name: scuat
Oracle home: /oracle/rdbms/orahome/UAT/12.1.0.2
Oracle user: oracle
Spfile: +CDBSUAT/SCUAT_B/PARAMETERFILE/spfilescuat_b.ora
Password file: +CDBSUAT/SCUAT_B/PASSWORD/orapwscuat
....

Se connecter avec le compte oragrid sur la base primaire pour lancer l'utilitaire asmcmd et copier le fichier password dans un répertoire local :

oracle@hostprim> asmcmd -p
          
ASMCMD [+] > pwcopy +CDBSUAT/SCUAT_B/PASSWORD/orapwscuat /tmp/orapwdstbydb
copying +CDBSUAT/SCUAT_B/PASSWORD/orapwscuat -> /tmp/orapwdstbydb

Transférer le fichier password vers la machine de la base standby :

scp orapwdstbydb hoststandby:/tmpPassword:
orapwdstbydb                                     100% 7680     7.5KB/s   00:00

Avec le compte oragrid sur la machine de la base standby, exécuter asmcmd pour copier le fichier password de la base primaire dans la base standby :

oracle@hoststandby> asmcmd -p

ASMCMD [+] > pwcopy /tmp/orapwdstbydb +CDBSUAT/SCUAT_C/PASSWORD/orapwscuat
copying /tmp/orapwdstbydb -> +CDBSUAT/SCUAT_C/PASSWORD/orapwscuat

Le compte SCDMAINTDG est dès lors visible dans la vue V$PWFILE_USERS de la base standby :

SCDU1ORA (standby)> select username, sysdba, sysoper from v$pwfile_users;
USERNAME                       SYSDB SYSOP
------------------------------ ----- -----
SYS                            TRUE  TRUE
SCDMAINTDG                     FALSE TRUE

Cette manipulation est à répéter sur toutes les standby.

Bascule sur le nouveau compte

Modifier le paramètre REDO_TRANSPORT_USER pour spécifier le compte SCDMAINTDG sur la base primaire et la ou les bases standby :

SCDU1ORA (prim)> alter system set redo_transport_user=SCDMAINTDG scope=both;
SCDU1ORA (standby)> alter system set redo_transport_user=SCDMAINTDG scope=both;

Dernière étape, redémarrer les connexions LNS (Log Network Server) en appliquant le mode DEFER puis le mode ENABLE sur les destinations standby (ici il n'y en a qu'une) :

SCDU1ORA (prim)> alter system set log_archive_dest_state_2=DEFER scope=both;
SCDU1ORA (prim)> alter system set log_archive_dest_state_2=ENABLE scope=both;

Vérifier dans le fichier de log de la base primaire qu'il n'y a aucune erreur :

alert_scdu1ora.log
******************************************************************
TT00: Setting 'active' archival for destination LOG_ARCHIVE_DEST_2
******************************************************************
Tue Jun 05 17:13:32 2017
Archived Log entry 10410 added for thread 1 sequence 2542 ID 0xb0359026 dest 1:
Tue Jun 05 17y redo logfile selected for thread 1 sequence 2542 for destination LOG_ARCHIVE_DEST_2

Conclusion

Le mot de passe du compte SYS peut être modifié à souhait sans avoir à copier le fichier password vers les standby. En revanche bien entendu, si une politique de changement du mot de passe du compte SCDMAINTDG est décidée, il faudra copier le fichier password de la base primaire vers toutes les bases standby.