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.
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:/tmp
Password: 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.