Déplacer un datafile entre diskgroup sous ASM

Déplacer un datafile entre diskgroup

Vous souhaitez déplacer un datafile sur un diskgroup différent suite à une réorganisation de l’architecture de votre base de données ou alors suite à une migration, alors voici une astuce pour déplacer un datafile sous ASM d’un diskgroup vers un autre diskgroup.
1. Identifier le datafile ASM à déplacer

La première étape consiste à identifier le fichier de données sous ASM qui doit être déplacé. Dans notre exemple, nous allons déplacer le datafile des indexes vers le bon diskgroup.

SQL> Select file_name FROM dba_data_files;
+DATANEP/NEPTUNE/datafile/users.270.624121963
+DATANEP/NEPTUNE/datafile/sysaux.258.624121963
+DATANEP/NEPTUNE/datafile/undotbs1.269.624121963
+DATANEP/NEPTUNE/datafile/system.264.624121963
+DATANEP/NEPTUNE/datafile/example.285.624122055
+DATANEP/NEPTUNE/datafile/undotbs2.286.624122161
+DATANEP/NEPTUNE/datafile/undotbs3.287.624122161
+DATANEP/NEPTUNE/datafile/undotbs4.289.638993627
+DATANEP/NEPTUNE/datafile/undotbs4.311.638996257
+DATANEP/NEPTUNE/datafile/kmep_data.292.624123161
+DATANEP/NEPTUNE/datafile/kmep_index.293.624123167 --> datafile index
+DATANEP/NEPTUNE/datafile/rmp_data.294.625064527
+DATANEP/NEPTUNE/datafile/rmep_index.295.625064533
+DATANEP/NEPTUNE/datafile/undotbs5.318.649548687
+DATANEP/NEPTUNE/datafile/kmep_index.322.680462199

2. Identifiez les diskgroup disponibles sous ASM
Nous devons changer l’emplacement du datafile vers un autre diskgroup, et pour retrouver le bon diskgroup, nous pouvons lancer la commande suivante :

SQL> SELECT name FROM v$asm_diskgroup;
NAME
------------------------------
DATANEP
DATASAT

Nous souhaitons ainsi déplacer le datafile du diskgroup +DATANEP vers l’autre diskgroup +DATASAT.
3. Déconnectez le datafile de la base de données
Avant même de déplacer le datafile physiquement, il faut le mettre OFFLINE car sinon, nous risquons de le corrompre et de désynchroniser le fichier avec le datafile SYSTEM.

SQL> ALTER DATABASE DATAFILE '+DATANEP/NEPTUNE/datafile/kmep_index.293.624123167' OFFLINE;
Database altered.

4. Copiez le datafile vers son nouvel emplacement
Dans cette étape, nous allons copier le fichier de données. Il existe deux méthodes pour réaliser cette action mais nous utiliserons ici la méthode RMAN.
Pour cela, l’utilité du package DBMS_FILE_TRANSFER sera très appréciée avec sa procédure COPY_FILE.
Lancez RMAN et connectez-vous à la base de données cible :

$ rman target /
connected to target database: NEPTUNE (DBID=xxxxxxxxxxxxx)

Lancez la commande COPY DATAFILE pour copier le fichier de données vers son nouvel emplacement :

RMAN> COPY DATAFILE '+DATANEP/NEPTUNE/datafile/kmep_index.293.624123167' TO '+DATASAT';

Une fois terminée, nous disposons de deux fichiers de données portant le même nom, ce qui n’est pas top ! Il faut donc renommer la copie.
5. Renommez le datafile
Maintenant que le fichier a été copié, il faut mettre à jour le dictionnaire de données de la base de données ainsi que les controlfiles.

SQL> ALTER DATABASE RENAME FILE
  2     '+DATANEP/NEPTUNE/datafile/kmep_index.293.624123167’
  3  TO '+DATASAT/NEPTUNE/datafile/kmep_index.293.624123167’;
Database altered.

6. Utilisez RMAN pour basculer sur le nouveau nom du datafile

RMAN> SWITCH DATAFILE '+DATANEP/NEPTUNE/datafile/kmep_index.293.624123167’TO COPY;
datafile n switched to datafile copy "+DATASAT/NEPTUNE/datafile/kmep_index.293.624123167"

7. Mettez à jour le datafile pour le synchroniser avec la base de données

SQL> RECOVER DATAFILE '+DATASAT/NEPTUNE/datafile/kmep_index.293.624123167';
Media recovery complete.

8. Reconnectez le datafile
Pour que le datafile soit accessible en lecture/écriture, il faut le remettre ONLINE.

SQL> ALTER DATABASE DATAFILE '+DATASAT/NEPTUNE/datafile/kmep_index.293.624123167' ONLINE;
Database altered.

9. Verifiez l’emplacement des datafiles sous ASM

SQL> Select file_name FROM dba_data_files;
+DATANEP/NEPTUNE/datafile/users.270.624121963
+DATANEP/NEPTUNE/datafile/sysaux.258.624121963
+DATANEP/NEPTUNE/datafile/undotbs1.269.624121963
+DATANEP/NEPTUNE/datafile/system.264.624121963
+DATANEP/NEPTUNE/datafile/example.285.624122055
+DATANEP/NEPTUNE/datafile/undotbs2.286.624122161
+DATANEP/NEPTUNE/datafile/undotbs3.287.624122161
+DATANEP/NEPTUNE/datafile/undotbs4.289.638993627
+DATANEP/NEPTUNE/datafile/undotbs4.311.638996257
+DATANEP/NEPTUNE/datafile/kmep_data.292.624123161
+DATASAT/NEPTUNE/datafile/kmep_index.293.624123167 --> datafile index 
+DATANEP/NEPTUNE/datafile/rmp_data.294.625064527
+DATANEP/NEPTUNE/datafile/rmep_index.295.625064533
+DATANEP/NEPTUNE/datafile/undotbs5.318.649548687
+DATANEP/NEPTUNE/datafile/kmep_index.322.680462199


10. Supprimez le datafile d’origine

Cette étape est peut être inutile car durant la commande ALTER DATABASE RENAME FILE , le datafile a sans doute déjà été supprimé.
Sinon, si le fichier existe toujours, il faut le supprimer depuis l’instance ASM !

$ export ORACLE_SID=+ASM1;
$ sqlplus "/ as sysdba"
SQL> ALTER DISKGROUP DATANEP DROP FILE ‘+DATANEP/NEPTUNE/datafile/kmep_index.293.624123167';

Voilà, c’est terminé. Le déplacement d’un datafile entre diskgroup n’est pas compliqué comme nous pouvons le voir, néanmois, il faut faire attention à bien le renommer lors de la copie et de basculer sur ce fichier afin que les écritures se fassent sur le bon fichier.
Et pour plus d’infos, vous pouvez vous référer à la documentation suivante :
http://docs.oracle.com/cd/E14072_01/server.112/e10500/asm_rman.htm#CHDBDJJG
http://docs.oracle.com/cd/E14072_01/server.112/e10500/asm_rman.htm