Déplacer les fichiers de données sur un autre DiskGroup en Oracle 11g

Déplacer les datafiles ou autres fichiers d’une base vers un autre diskgroup n’est pas toujours aisé.
Voici une méthode permettant de déplacer n’importe quel type de fichier de la base.

 

Datafiles et Tempfiles

Imaginons le situation actuelle :

SQL> select file_id, tablespace_name, file_name, bytes / 1024 / 1024 || ' Mo.', maxbytes / 1024 / 1024 || ' Mo.' Taille_Max, autoextensible from dba_data_files order by 1 ;

   FILE_ID TABLESPACE_NAME FILE_NAME                                            TAILLE            TAILLE_MAX AUT
---------- --------------- ---------------------------------------------------- ----------- ---------------- ----
         1 SYSTEM          +DG_OLD/mydb/datafile/system.286.922619261          800 Mo. 32767,984375 Mo. YES
...
        12 TOOLS           +DG_OLD/mydb/datafile/tools.298.922619323           512 Mo.          512 Mo. YES
        13 UNDOTBS2        +DG_OLD/mydb/datafile/undotbs2.299.922619325        512 Mo.         2048 Mo. YES
...

14 lignes selectionnees.

SQL> select file_id, tablespace_name, file_name, bytes / 1024 / 1024 || ' Mo.' Taille, maxbytes / 1024 / 1024 || ' Mo.' Taille_Max, autoextensible from dba_temp_files order by 1 ;

   FILE_ID TABLESPACE_NAME FILE_NAME                                            TAILLE            TAILLE_MAX AUT
---------- --------------- ---------------------------------------------------- ----------- ---------------- ---
         1 TEMP            +DG_OLD/mydb/tempfile/temp.289.922619283           2024 Mo.        10240 Mo. YES

Déplacement d’un datafile

Méthode

La méthode ci-dessous nécessite obligatoirement que votre base de données soit en mode archivelog.

  1. Dans une session SQL, mise en offline des anciens datafiles
    sqlplus / as sysdba
    SQL> alter database datafile '+DG_OLD/mydb/datafile/tools.298.922619323' offline ;
  2. Dans une session RMAN, faire une copie du datafile dans le nouveau DG
    rman target /
    RMAN> copy datafile '+DG_OLD/MYDB/datafile/tools.298.922619323' to '+DG_NEW';
    
    Starting backup at 09-JUL-19
    using target database control file instead of recovery catalog
    allocated channel: ORA_DISK_1
    channel ORA_DISK_1: SID=241 instance=mydb2 device type=DISK
    channel ORA_DISK_1: starting datafile copy
    input datafile file number=00012 name=+DG_OLD/mydb/datafile/tools.298.922619323
    output file name=+DG_NEW/mydb/datafile/tools.256.1013178313 tag=TAG20190709T142513 RECID=1 STAMP=1013178314
    channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
    Finished backup at 09-JUL-19

    Vous aurez noté au passage le nom de la copie du datafile dans le nouveau DG (output file name=+DG_NEW/mydb/datafile/tools.256.1013178313 tag=TAG20190709T142513)

  3. Dans la session SQL, renommez le datafile
    SQL> alter database rename file '+DG_OLD/MYDB/datafile/tools.298.922619323' to '+DG_NEW/mydb/datafile/tools.256.1013178313';
  4. Dans la session RMAN, basculez de datafile et réaliser le recover
    RMAN> switch datafile '+DG_NEW/mydb/datafile/tools.256.1013178313' to copy ;
    RMAN> recover datafile '+DG_NEW/mydb/datafile/tools.256.1013178313' ;
  5. Dans la session SQL, il reste à mettre en ligne le nouveau datafile
    SQL> alter database datafile '+DG_NEW/mydb/datafile/tools.256.1013178313' online ;

Purge des anciens datafiles

L’ancien datafile aura normalement été supprimé de son DG. Vous pouvez le vérifier dans asmcmd.

Tablespace SYSTEM

Le tablespace SYSTEM a la particularité de pas pouvoir être mis offline. La même méthode peut être appliquée, mais l’instance devra obligatoirement être montée (et non ouverte).

Tablespace UNDO

La même méthode peut être appliquée sur les fichiers d’un « undo tablespace ». Cependant, ils ne pourront pas être mis offline si des transactions sont en cours.
Dans ce cas, votre salut passera peut-être par la création d’un « undo tablespace » temporaire, que vous activerez pour votre session, avant de pouvoir manipuler les fichiers du premier tablespace et revenir dans la situation d’origine.

Déplacement du tempfile

La méthode ci-dessous nécessite moins de manipulations. Toutefois, le déplacement d’un tempfile se fera sur une base montée (non ouverte).

  1. Arrêtez et remonter l’instance
    srvctl stop database -d mydb
    srvctl start database -d mydb -o mount
  2. Dans une session RMAN, faire une copie du datafile dans le nouveau DG
    rman target /
    RMAN> run {
    set newname for tempfile 1 to '+DG_NEW';
    switch tempfile all;
    }
    channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
    Finished backup at 09-JUL-19
  3. Il ne vous reste plus qu’à ouvrir l’instance
    alter databse open;

 

Déplacement SPFILE

Commençons par regarder où se trouve notre spfile actuel

SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- -----------------------------------
spfile                               string      +DG_OLD/mydb/spfilemydb.ora
  1. Dupliquer la spfile depuis une session SQL
    sqlplus / as sysdba
    SQL> create pfile='E:\temp\initmydb.ora' from spfile;
    SQL> create spfile='+DG_NEW' from pfile='E:\temp\initmydb.ora';
    SQL> exit
  2. Dans une session ASMCMD, vérifier la présence du nouveau spfile et créer l’alias adéquat
    asmcmd
    ASMCMD> ls -ls +DG_NEW/MYDB/PARAMETERFILE
    Type           Redund  Striped  Time             Sys  Block_Size  Blocks  Bytes    Space  Name
    PARAMETERFILE  MIRROR  COARSE   JUL 09 16:00:00  Y           512       7   3584  2097152  spfile.272.1013187483
    
    ASMCMD> mkalias +DG_NEW/MYDB/PARAMETERFILE/spfile.272.1013187483 +DG_NEW/MYDB/spfileMYDB.ora
    
    ASMCMD> ls -ls +DG_NEW/MYDB
    Type           Redund  Striped  Time             Sys  Block_Size  Blocks  Bytes    Space  Name
                                                     Y                                        DATAFILE/
                                                     Y                                        PARAMETERFILE/
                                                     Y                                        TEMPFILE/
                                                     N                                        spfileMYDB.ora => +DG_NEW/MYDB/PARAMETERFILE/spfile.272.1013187483
    
  3. Paramétrer le nouveau spfile au démarrage de l’instance
    1. Voici la configuration actuelle de la base de données
      C:\Users\oracle>srvctl config database -d mydb
      
      Nom de base de données unique : MYDB
      ...
      SPFILE : +DG_OLD/MYDB/spfileMYDB.ora
      ...
    2. Modifier le spfile dans la configuration
      C:\Users\oracle>srvctl modify database -d mydb -p +DG_NEW/MYDB/spfileMYDB.ora
      
      C:\Users\oracle>srvctl config database -d mydb
      Nom de base de donnÚes unique : MYDB
      ...
      Fichier SPFILE : +DG_NEW/MYDB/spfileMYDB.ora
      ...
  4. Redémarrez les instances
    srvctl stop database -d mydb
    srvctl start database -d mydb -o nomount
  5. Dans une session SQL, vérifier le spfile utilisé pour le démarrage de l’instance
    sqlplus / as sysdba
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- --------------------------------------
    spfile                               string      +DG_NEW/mydb/spfilemydb.ora
    

 

Déplacement du controlfile

Le déplacement d’un controlfile se fait aussi à l’aide de RMAN.

Commençons par regarder où se trouve notre spfile actuel

SQL> show parameter control_files

NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------------------------------------------------
control_files                        string      +DG_OLD/mydb/controlfile/current.270.922619255
    1. Arrêtez l’instance et la redémarrer (uniquement à l’état « started »)
      srvctl stop database -d mydb
      srvctl start database -d mydb -o nomount
      
    2. Dans une session RMAN, faire une copie du controlfile depuis l’actuel vers le nouveau DG
      rman target /
      RMAN> Restore Controlfile to '+DG_NEW' from '+DG_OLD/mydb/controlfile/current.270.922619255';
      
    3. Dans une session ASMCMD, repérez le nouveau controfile
      asmcmd
      ASMCMD> ls -ls +DG_NEW/MYDB/CONTROLFILE
      Type         Redund  Striped  Time             Sys  Block_Size  Blocks     Bytes     Space  Name
      CONTROLFILE  HIGH    FINE     JUL 09 17:00:00  Y         16384    1131  18530304  78643200  current.273.1013188689
    4. Dans une session SQL, modifier le nom du controlfile pour utiliser le nouveau
      SQL> alter system set control_files='+DG_NEW/MYDB/CONTROLFILE/current.275.1013190993' sid='*' scope=spfile;
      
    5. A nouveau, redémarrer l’instance pour prendre en compte les modifications effectuées dans le spfile
      C:\Users\oracle>srvctl stop database -d mydb
      C:\Users\oracle>srvctl start database -d mydb -o mount
    6. Dans une session SQL, vérifier le nouveau nom du controlfile utilisé
      SQL> show parameter control_files
      NAME                                 TYPE        VALUE 
      ------------------------------------ ----------- ---------------------------------------------------
      control_files                        string      +DG_OLD/mydb/controlfile/current.270.922619255
      
    7. Sous ASMCMD, pensez à supprimer l’ancien controlfile
      ASMCMD
      ASMCMD> rm +DG_OLD/mydb/controlfile/current.270.922619255 ;
      

 

Déplacement des redolog

Le déplacement des redologs correspond à la démarche standard pour supprimer et les remplacer, quelque soit le système d’exploitation utilisé pour les stocker.

Commençons par regarder où se trouve notre spfile actuel

SQL> show parameter control_files

NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------------------------------------------------
control_files                        string      +DG_OLD/mydb/controlfile/current.270.922619255
  1. Repérez la liste des membres de redologs
    SQL> select group#, status, type, member from v$logfile order by group#, member;
    
        GROUP# STATUS  TYPE    MEMBER
    ---------- ------- ------- -------------------------------------------------
             1         ONLINE  +DG_OLD/mydb/onlinelog/group_1.281.922619257
             2         ONLINE  +DG_OLD/mydb/onlinelog/group_2.283.922619259
             3         ONLINE  +DG_OLD/mydb/onlinelog/group_3.284.922619259
             4         ONLINE  +DG_OLD/mydb/onlinelog/group_4.285.922619259
             5         ONLINE  +DG_OLD/mydb/onlinelog/group_5.301.922621505
             6         ONLINE  +DG_OLD/mydb/onlinelog/group_6.302.922621507
             7         ONLINE  +DG_OLD/mydb/onlinelog/group_7.303.922621507
             8         ONLINE  +DG_OLD/mydb/onlinelog/group_8.304.922621507
    
    8 lignes selectionnees.
    
  2. ainsi que l’état des redologs. Souvenez-vous que seuls les redologs inactifs peuvent être supprimés pour être remplacés
    SQL> select * from v$log;
    
        GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TI NEXT_CHANGE# NEXT_TIM
    ---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------- ------------ --------
             1          1       1121  104857600        512          1 NO  CURRENT             1,2231E+13 09/07/19   2,8147E+14 09/07/19
             2          1       1118  104857600        512          1 YES INACTIVE            1,2231E+13 09/07/19   1,2231E+13 09/07/19
             3          1       1119  104857600        512          1 YES INACTIVE            1,2231E+13 09/07/19   1,2231E+13 09/07/19
             4          1       1120  104857600        512          1 YES INACTIVE            1,2231E+13 09/07/19   1,2231E+13 09/07/19
             5          2        773  104857600        512          1 NO  CURRENT             1,2231E+13 09/07/19   2,8147E+14
             6          2        770  104857600        512          1 YES INACTIVE            1,2231E+13 09/07/19   1,2231E+13 09/07/19
             7          2        771  104857600        512          1 NO  INACTIVE            1,2231E+13 09/07/19   1,2231E+13 09/07/19
             8          2        772  104857600        512          1 NO  INACTIVE            1,2231E+13 09/07/19   1,2231E+13 09/07/19
    
    8 lignes selectionnees.
    
  3. Supprimez et recréer les redologs inactifs dans le nouveau DG.
    Attention à ne pas oublier de préciser le thread  : souvenez-vous que dans un environnement RAC, chaque instance gère ses propres redologs.

    SQL> alter database drop logfile group 2;
    SQL> alter database add logfile thread 1 group 2 ('+DG_NEW') size 104857600;
    SQL> alter database drop logfile group 3;
    SQL> alter database add logfile thread 1 group 3 ('+DG_NEW') size 104857600;
    SQL> alter database drop logfile group 4;
    SQL> alter database add logfile thread 1 group 4 ('+DG_NEW') size 104857600;
    
    SQL> alter database drop logfile group 6;
    SQL> alter database add logfile thread 2 group 6 ('+DG_NEW') size 104857600;
    SQL> alter database drop logfile group 7;
    SQL> alter database add logfile thread 2 group 7 ('+DG_NEW') size 104857600;
    SQL> alter database drop logfile group 8;
    SQL> alter database add logfile thread 2 group 8 ('+DG_NEW') size 104857600;
    
  4. Quelques « switchlog » devraient permettre de changer de redologs et rendre les précédents redolog utilisés « inactifs ».
    SQL>alter system switch logfile;
    ..
    SQL>alter system switch logfile;
    
    SQL> select * from v$log;
    
        GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TI NEXT_CHANGE# NEXT_TIM
    ---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------- ------------ --------
             1          1       1121  104857600        512          1 NO  ACTIVE              1,2231E+13 09/07/19   1,2231E+13 09/07/19
             2          1       1122  104857600        512          1 NO  ACTIVE              1,2231E+13 09/07/19   1,2231E+13 09/07/19
             3          1       1123  104857600        512          1 NO  ACTIVE              1,2231E+13 09/07/19   1,2231E+13 09/07/19
             4          1       1124  104857600        512          1 NO  CURRENT             1,2231E+13 09/07/19   2,8147E+14
             5          2        773  104857600        512          1 NO  INACTIVE            1,2231E+13 09/07/19   1,2231E+13 09/07/19
             6          2        774  104857600        512          1 NO  ACTIVE              1,2231E+13 09/07/19   1,2231E+13 09/07/19
             7          2        775  104857600        512          1 NO  ACTIVE              1,2231E+13 09/07/19   1,2231E+13 09/07/19
             8          2        776  104857600        512          1 NO  CURRENT             1,2231E+13 09/07/19   2,8147E+14
    
    8 lignes selectionnees.
    
  5. Il ne reste alors plus que les derniers redologs à changer
    SQL> alter database drop logfile group 5;
    SQL> alter database add logfile thread 2 group 5 ('+DG_NEW') size 104857600;
    
    SQL> alter database drop logfile group 1;
    SQL> alter database add logfile thread 1 group 1 ('+DG_NEW') size 104857600;
    
  6. Les redologs sont désormais tous stockés sur le bon diskgroup
    SQL> select group#, status, type, member from v$logfile order by group#, member;
    
        GROUP# STATUS  TYPE    MEMBER
    ---------- ------- ------- ----------------------------------------------------------------------------------------------------
             1         ONLINE  +DG_NEW/mydb/onlinelog/group_1.281.1013192137
             2         ONLINE  +DG_NEW/mydb/onlinelog/group_2.277.1013191645
             3         ONLINE  +DG_NEW/mydb/onlinelog/group_3.278.1013191647
             4         ONLINE  +DG_NEW/mydb/onlinelog/group_4.279.1013191649
             5         ONLINE  +DG_NEW/mydb/onlinelog/group_5.280.1013191813
             6         ONLINE  +DG_NEW/mydb/onlinelog/group_6.274.1013191591
             7         ONLINE  +DG_NEW/mydb/onlinelog/group_7.273.1013191549
             8         ONLINE  +DG_NEW/mydb/onlinelog/group_8.276.1013191571
    
    8 lignes selectionnees.

     

1 réflexion sur “Déplacer les fichiers de données sur un autre DiskGroup en Oracle 11g”

  1. Topalavachette

    Merci JY, c’est bon d’avoir une méthode claire par type de fichier et surtout d’être au fait des commandes exactes sans fouiller la doc 😉

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *