Skip to main content

Déplacer les fichiers d'une base

Pré-requis

Noter le nom de tous les fichiers avant déplacement :

SELECT name FROM v$controlfile;
SELECT member FROM v$logfile;
SELECT name FROM v$datafile;
SELECT name FROM v$tempfile;

Déplacement à froid (base arrêtée)

Fichiers de contrôle

Les fichiers de contrôle sont déclarés dans le fichier d'init, ou le spfile. Si la base se lance avec le fichier texte, il suffit d'y modifier la ligne CONTROL_FILES. S'il s'agit du SPFILE :

ALTER SYSTEM SET control_files='/nouvel_emplacement/CONTROL01.CTL', '/nouvel_emplacement/CONTROL02.CTL', '/nouvel_emplacement/CONTROL03.CTL' SCOPE=SPFILE;

Stopper la base de données juste après !

Déplacer les fichiers

  • Arrêter la base de données
SHUTDOWN IMMEDIATE;
  • Copier ou déplacer (selon la place disponible - la copie est préférable pour ne pas perdre un fichier en cas de problème, réseau par exemple s'ils sont copiés sur un autre serveur) tous les fichiers vers la nouvelle destination.

Renommer les fichiers

Relancer la base sans ouvrir les fichiers de données :

STARTUP MOUNT

puis renommer les fichiers (le "FILENAME" correspond au chemin complet + le nom du fichier : changer de disque ou de répertoire revient donc à le renommer)

ALTER DATABASE RENAME FILE '/nouvel_emplacement/SYSTEM01.DBF' TO '/nouvel_emplacement/SYSTEM01.DBF';

faire de même pour tous les autres fichiers de données, les fichiers temporaires (TEMP) et tous les REDO LOGS.

Ouvrir la base

ALTER DATABASE OPEN;

Déplacement à froid (TABLESPACE/DATAFILE OFFLINE) - <= 11g

Un ou plusieurs fichiers d'un tablespace

ALTER TABLESPACE users OFFLINE NORMAL;

Renommer tous les fichiers du tablespace sur disque. Puis :

ALTER TABLESPACE users
    RENAME DATAFILE '/u02/oracle/rbdb1/user1.dbf',
                    '/u02/oracle/rbdb1/user2.dbf'
                 TO '/u02/oracle/rbdb1/users01.dbf', 
                    '/u02/oracle/rbdb1/users02.dbf';

Puis repasser le tablespace ONLINE

ALTER TABLESPACE users ONLINE;

Déplacement à chaud (base online) >=12c

Depuis la version 12c, on peut déplacer les fichiers à chaud directement dans Oracle.

ALTER DATABASE MOVE DATAFILE '/u02/oradata/ORCL/user01.dbf' TO '/u03/ORADATA/ORCL/user01.dbf';

On peut ajouter l'option "KEEP" (garder le fichier source), et REUSE (si le fichier existe déjà à la destination).

Cette commande fonctionne aussi pour ASM :

-- Du système de fichiers vers ASM
ALTER DATABASE MOVE DATAFILE '/u01/oradata/ORCL/user01.dbf' TO '+DATA/data/ORCL/user01.dbf';
-- D'ASM vers ASM
ALTER DATABASE MOVE DATAFILE '+DATA/data/ORCL/user01.dbf' TO '+DATA2/data/ORCL/user01.dbf';
-- Si on veut utiliser OMF (exemple : de +DATA avec fichiers nommés vers +DATA2 en OMF)
ALTER SYSTEM SET DB_CREATE_FILE_DEST='+DATA2' SCOPE=BOTH;
ALTER DATABASE MOVE DATAFILE '+DATA/data/ORCL/user01.dbf';

Fichiers redo logs

La procédure est la même que pour agrandir la taille des fichiers redo logs : il faut les supprimer et les recréer l'un après l'autre.

Redimensionner les fichiers REDO LOGs

Déplacement/redimensionnement d'un tablespace temporaire à chaud

Noter les options (notamment d'autoextend, next et maxsize) dasn la table DBA_TEMP_FILES. Puis :

CREATE TEMPORARY TABLESPACE temp2 TEMPFILE '/nouvel_emplacement/TEMP2.DBF' SIZE 5M REUSE;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2;
DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES;
CREATE TEMPORARY TABLESPACE temp TEMPFILE '/nouvel_emplacement/TEMP01.DBF' SIZE 500M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE unlimited;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;
DROP TABLESPACE temp2 INCLUDING CONTENTS AND DATAFILES;