# Déplacer les fichiers d'une base

## <span class="mw-headline" id="bkmrk-pr%C3%A9-requis-0">Pré-requis</span>

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

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

## <span class="mw-headline" id="bkmrk-d%C3%A9placement-%C3%A0-froid--1">Déplacement à froid (base arrêtée)</span>

### <span class="mw-headline" id="bkmrk-fichiers-de-contr%C3%B4le-0">Fichiers de contrôle</span>

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 :

```SQL
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 !**

### <span class="mw-headline" id="bkmrk-d%C3%A9placement-0">Déplacer les fichiers</span>

- Arrêter la base de données

```SQL
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.

### <span class="mw-headline" id="bkmrk-renommer-les-fichier-0">Renommer les fichiers</span>

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

```SQL
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)

```SQL
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

```SQL
ALTER DATABASE OPEN;
```

## Déplacement à froid (TABLESPACE/DATAFILE OFFLINE) - &lt;= 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;
```

## <span class="mw-headline" id="bkmrk-d%C3%A9placement-%C3%A0-chaud--0">Déplacement à chaud (base online) &gt;=12c</span>

<span class="mw-headline">Depuis la version 12c, on peut déplacer les fichiers à chaud directement dans Oracle.</span>

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

<span class="mw-headline">On peut ajouter l'option "KEEP" (garder le fichier source), et REUSE (si le fichier existe déjà à la destination).</span>

<span class="mw-headline">Cette commande fonctionne aussi pour ASM :</span>

```
-- 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';
```

### <span class="mw-headline" id="bkmrk-fichiers-redo-logs-0">Fichiers redo logs</span>

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](https://kb.systea.fr/books/oracle/page/reductionaugmentation-des-redo-logs "Redimensionner les fichiers REDO LOGs")

### <span class="mw-headline" id="bkmrk-d%C3%A9placement-d%27un-tab-0">Déplacement/redimensionnement d'un tablespace temporaire à chaud</span>

Noter les options (notamment d'autoextend, next et maxsize) dasn la table DBA\_TEMP\_FILES. Puis :

```SQL
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;
```