Duplication d'une base de données à partir d'un partage réseau sous Windows

Il est souvent nécessaire de rafraichir une base de recette à partir d’une sauvegarde de la base de production.
Sous Unix, la duplication via un montage NFS ne pose pas de problème.
Sous Windows, la duplication via un partage réseau n’est pas aussi simple.
Cet article présente la méthode à utiliser.

La méthode choisie est le DUPLICATE … BACKUP LOCATION sans connexion à la base de production (TARGET).
Le rafraichissement s’effectue à partir de l’image de la base de production, ici le dimanche précédent à 10h du matin.
Toutes les opérations sont effectuées sur le serveur de recette.

> set ORACLE_SID={SID}
> sqlplus sys/"{mot de passe}" AS SYSDBA
STARTUP FORCE NOMOUNT;
EXIT
> rman AUXILIARY sys/"{mot de passe}" NOCATALOG
STARTUP FORCE NOMOUNT;
EXIT
> rman AUXILIARY sys/"{mot de passe}" NOCATALOG
Recovery Manager: Release 11.2.0.x.0 - Production
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
connexion établie avec la base de données auxiliaire : {SID} (non montée)
RMAN> RUN
2> {
3>    ALLOCATE AUXILIARY CHANNEL aux1 TYPE DISK;
4>    ALLOCATE AUXILIARY CHANNEL aux2 TYPE DISK;
5>
6>    SET UNTIL TIME "NEXT_DAY(TRUNC(SYSDATE)+10/24 - 7, 'DIMANCHE')";
7>
8>     DUPLICATE TARGET DATABASE TO {SID}
9>        BACKUP LOCATION '\\{Serveur distant}\{Emplacement sauvegarde}'
10>       NOFILENAMECHECK;
11>
12>    RELEASE CHANNEL aux1;
13>    RELEASE CHANNEL aux2;
14> }
canal affecté : aux1
canal aux1 : SID=200 type d'unité=DISK
canal affecté : aux2
canal aux2 : SID=1 type d'unité=DISK
exécution de la commande : SET until clause
Démarrage de Duplicate Db dans 01/01/2016 10:00:40
canal libéré : aux1
canal libéré : aux2
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: échec de la commande Duplicate Db à 01/01/2016 10:00:40
RMAN-05501: abandon de la duplication de la base de données cible
RMAN-05575: Sauvegarde de fichier de contrôle créée avant NEXT_DAY(TRUNC(SYSDATE)+10/24 - 7, 'DIMANCHE') introuvable dans \\{Serveur distant}\{Emplacement sauvegarde}\

La commande DUPLICATE échoue. Le message précise que la sauvegarde du fichier de contrôle est introuvable sur le partage réseau.
La sauvegarde est pourtant bien présente sur cet emplacement.

Par défaut, DBCA créé un service à la création d’une base de données Oracle sous Windows.
Ce service est associé au « Compte système local ».
Lorsque le service ouvre une session en tant que « .\LocalSystem », les sauvegardes présentes sur un partage réseau ne sont pas accessibles. L’erreur RMAN-05575 est déclenchée.
Service.LocaLSystem
Pour résoudre ce problème, il suffit de modifier le compte de connexion pour exécuter la commande DUPLICATE avec un compte de domaine : {domaine}\{mot de passe user domaine}
Cette modification peut s’effectue graphiquement ou via Powershell.
Ci-dessous les commandes pour modifier la connexion du service avec un compte de domaine (avant le DUPLICATE) avec Powershell :

$serviceName="OracleService{SID}"
$account="{domaine}\{user domaine}"
$response = Read-host "Saisir le mot de passe : " -AsSecureString
<>
Stop-Service -Name "$serviceName" -Verbose
$svc=gwmi Win32_Service -Filter $serviceName
$password = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($response))
$svc.Change($null,$null,$null,$null,$null,$null,$account,$password,$null,$null,$null)
Remove-Variable password
Start-Service -Name "$serviceName" -Verbose

 
L’exécution de la commande RMAN peut être relancée

> set ORACLE_SID={SID}
> sqlplus sys/"{mot de passe}" AS SYSDBA
STARTUP FORCE NOMOUNT;
EXIT
> rman AUXILIARY sys/"{mot de passe}" NOCATALOG
Recovery Manager: Release 11.2.0.x.0 - Production
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
connexion établie avec la base de données auxiliaire : {SID} (non montée)
RMAN> RUN
2> {
3>    ALLOCATE AUXILIARY CHANNEL aux1 TYPE DISK;
4>    ALLOCATE AUXILIARY CHANNEL aux2 TYPE DISK;
5>
6>    SET UNTIL TIME "NEXT_DAY(TRUNC(SYSDATE)+10/24 - 7, 'DIMANCHE')";
7>
8>     DUPLICATE TARGET DATABASE TO {SID}
9>        BACKUP LOCATION '\\{Serveur distant}\{Emplacement sauvegarde}'
10>       NOFILENAMECHECK;
11>
12>    RELEASE CHANNEL aux1;
13>    RELEASE CHANNEL aux2;
14> }
canal affecté : aux1
canal aux1 : SID=249 type d'unité=DISK
canal affecté : aux2
canal aux2 : SID=1 type d'unité=DISK
exécution de la commande : SET until clause
....
contenu de script mémoire:
{
   Alter clone database open resetlogs;
}
exécution de script mémoire
base de données ouverte
Fin de Duplicate Db dans 01/01/2016 12:00:00
canal libéré : aux1
canal libéré : aux2
RMAN>

Ci-dessous les commandes pour modifier la connexion du service avec le compte LocalSystem (après le DUPLICATE) avec Powershell :

$serviceName="OracleService{SID}"
$account=".\LocalSystem"
$password=""
Stop-Service -Name "$serviceName" -Verbose
$svc=gwmi Win32_Service -Filter "name='$serviceName'"
$svc.StopService()
$svc.Change($null,$null,$null,$null,$null,$null,$account,$password,$null,$null,$null)
Start-Service -Name "$serviceName" -Verbose

La base de recette est maintenant disponible.
A noter qu’il est nécessaire de définir les paramètres d’initialisation DB_FILE_NAME_CONVERT et LOG_FILE_NAME_CONVERT, même si l’emplacement des fichiers est identique.