Comment recréer un tempfile sur une standby en R/O quand le tablespace TEMP est au format Bigfile ?

Il peut arriver qu’après un duplicate for standby dans un environnement ASM (OMF), même après le passage en read only de la standby nouvellement créée, les tempfiles ne soient pas créés et soient à la valeur du diskgroup de la base source.

Contexte

Environnement RAC en source et en cible avec utilisation d’ASM et donc de l’OMF.

  • Base source : MADB_PRIM / DG DATA primaire : +DATAP
  • Base cible : MADB_STDBY / DG DATA standby : +DATAS

 

On interroge l’emplacement des tempfiles sur la nouvelle standby (ouverte en read only

SQL> select name from v$tempfile ;

+DATAP

On remarque qu’il n’y a pas de chemin complet, mais le nom du diskgroup de la base primaire.

Cela génère dans l’alertlog le warning suivant :

*********************************************************************
WARNING: The following temporary tablespaces contain no files.
This condition can occur when a backup controlfile has
been restored. It may be necessary to add files to these
tablespaces. That can be done using the SQL statement:

ALTER TABLESPACE <tablespace_name> ADD TEMPFILE

Alternatively, if these temporary tablespaces are no longer
needed, then they can be dropped.
Empty temporary tablespace: TEMP

Et génère l’erreur suivante quand on cherche à interroger une table ou un dictionnaire de donnés :

select * from dba_objects order by object_name;
select * from dba_objects order by object_name
*
ERROR at line 1:
ORA-01115: IO error reading block from file X (block # Y)
ORA-01110: data file X: '+DATAP'
ORA-27041: unable to open file
SVR4 Error: 2: No such file or directory
Additional information: 3

Problématique

On ne peut pas supprimer le fichier parce qu’il doit y avoir au moins un tempfile dans le tablespace.

Sinon cela génère l’une de ces erreurs :

ORA-03261: the tablespace TEMP has only one file

ORA-01516: nonexistent log file, data file, or temporary file

On ne peut pas ajouter de tempfile parce qu’on a un tablespace TEMP au format BIGFILE.

Sinon cela génère l’erreur :

ORA-32771: Cannot Add File To Bigfile Tablespace

Solution

On utilise RMAN pour modifier les infos de tempfile.

On se met dans l’environnement de la base MADB_STDBY et on arrête les instances liées à la base :

srvctl stop database -d MADB_STDBY

On démarre une des instances en mount :

sqlplus / as sysdba
startup mount ;

On se connecte à rman et on regarde la liste des tempfiles et les numéros associés :

rman target /

report schema ;

List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1 1000 TEMP 524288 +DATAP

On lance le script pour préciser notre disk group cible pour chacun des tempfiles :

run {
set newname for tempfile 1 to '+DATACS';
set newname for tempfile 2 to '+DATACS';
… (à répéter au besoin)
switch tempfile all;
}

 

On passe en open read only et on vérifie à nouveau les tempfiles (On doit à présent voir des chemins pour les tempfiles se trouvant dans +DATAS) :

alter database open read only;
report schema ;


List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1 1000 TEMP 524288 +DATACS/MADB_STDBY/tempfile/temp.XXX.YYYYYYYY

On arrête et redémarre via le service pour redémarrer toutes les instances :

srvctl stop database -d MADB_STDBY
srvctl start database -d MADB_STDBY

Nous espérons que cette solution pourra vous servir.

Note : cette solution peut normalement fonctionner également hors OMF, mais nous n’avons pas eu l’occasion de le tester. N’hésitez pas à nous faire un retour si vous le faites 😉.