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.
- 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 ;
- 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)
- 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';
- 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' ;
- 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).
- Arrêtez et remonter l’instance
srvctl stop database -d mydb srvctl start database -d mydb -o mount
- 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
- 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
- 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
- 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
- Paramétrer le nouveau spfile au démarrage de l’instance
- 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 ...
- 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 ...
- Voici la configuration actuelle de la base de données
- Redémarrez les instances
srvctl stop database -d mydb srvctl start database -d mydb -o nomount
- 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
-
- Arrêtez l’instance et la redémarrer (uniquement à l’état « started »)
srvctl stop database -d mydb srvctl start database -d mydb -o nomount
- 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';
- 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
- 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;
- 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
- 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
- Sous ASMCMD, pensez à supprimer l’ancien controlfile
ASMCMD ASMCMD> rm +DG_OLD/mydb/controlfile/current.270.922619255 ;
- Arrêtez l’instance et la redémarrer (uniquement à l’état « started »)
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
- 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.
- 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.
- 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;
- 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.
- 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;
- 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”
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 😉
Les commentaires sont fermés.