# Migration par transport tablespace

On veut migrer une base 11.2.0.4 MYDB sur un serveur\_source vers une base 19c sur un nouveau serveur serveur\_destination. Mais la base est volumineuse et un export/import n'est pas envisageable en terme de temps de migration. On transporte donc les tablespaces utilisateurs (sans SYSTEM, SYSAUX, TEMP et UNDO).  
Le nom de la base et le chemin des fichiers est le même que sur le serveur source. S'il faut changer les chemins ou renommer les fichiers, se reporter à la procédure pour [déplacer les fichiers d'une base](https://kb.systea.fr/books/oracle/page/deplacer-les-fichiers-dune-base).

### Sur la base SOURCE 11g  


<span style="text-decoration: underline;">Avant de lancer la migration</span>

\- Vérifier s'il n'y a pas d'incompatibilité au TRANSPORT\_TABLESPACE

```SQL
EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('TBLSP_1,TBLSP_2,TBLSP_3',TRUE);
SELECT * FROM TRANSPORT_SET_VIOLATIONS;
 aucune ligne selectionnee
```

\- Lister les fichiers des tablespaces à transporter (liste nécessaire pour le futur import)

```SQL
SELECT file_name FROM dba_data_files;
```

\- Faire un export des metadonnées uniquement :

```shell
expdp system/'system_password' DUMPFILE=exp_TTS_MYDB.dmp DIRECTORY=DUMP FULL=Y CONTENT=METADATA_ONLY
```

\- Extraire les DDLs dans un fichier SQL avec impdp:

```shell
impdp system/'system_password' DUMPFILE=exp_TTS_MYDB.dmp DIRECTORY=DUMP SQLFILE=MYDB.sql
```

Dans ce fichier SQL, extraire les ordres de création pour :  
\- recréer le tablespace TEMP avec le bon nom (si spécifique)  
\- recréer les utilisateurs non-systèmes avec ses GRANT  
\- recréer les DIRECTORY

<span style="text-decoration: underline;">Au moment de la migration</span>

Stopper le LISTENER, redémarrer la base pour être sûr qu'il n'y a plus de sessions utilisateurs

```SQL
lsnrctl stop
sqlplus / as sysdba
SQL> shutdown immediate;
SQL> startup
```

Passer les tablespaces utilisateurs en read only

```SQL
alter tablespace TBLSP_1 read only;
alter tablespace TBLSP_2 read only;
alter tablespace TBLSP_3 read only;
```

Exporter les métadonnées spécifiquement liées aux tablespaces transportés :

```shell
expdp system/'system_passwd' DUMPFILE=exp_TTS_MYDB.dmp DIRECTORY=DUMP TRANSPORT_TABLESPACES=TBLSP_1,TBLSP_2,TBLSP_3 LOGFILE=exp_TTS_MYDB.log
```

Copier les fichiers des tablespaces utilisateurs vers le nouveau serveur en 19c, ainsi que le dump des metadonnées des tablespaces :

```shell
scp /u01/mydb/tblsp_* serveur_dest:/u01/mydb
scp /export/expdp_TTS_MYDB.exp serveur_dest:/export
```

A ce stade la base 11g sur serveur\_source peut être remise en read write, mais ce n'est pas forcément souhaitable, si on compte passer la production sur la base 19c :

```SQL
sqlplus / as sysdba
alter tablespace TBLSP_1 read write;
alter tablespace TBLSP_2 read write;
alter tablespace TBLSP_3 read write;
exit
lsnrctl start
```

### Sur la base DESTINATION 19c  


<span style="text-decoration: underline;">Important</span> : Créer la base en mode personnalisé, avec <span style="color: #e03e2d;">**compatible=11.2.0**</span> et vérifier les paramètres NLS de la base source pour bien remettre les mêmes. Pour l'instant, seul le tablespace USERS par défaut est laissé sur la base.

Recréer les utilisateurs Oracle (qui auront le tablespace USERS par défaut, puisque les autres tablespaces ne sont pas encore rattachés) par rapport au DDL extrait plus haut.

```SQL
CREATE USER "APPLIUSER" IDENTIFIED BY VALUES '622F2895A4A8F54E' TEMPORARY TABLESPACE "TEMP";
ALTER USER "APPLIUSER" DEFAULT ROLE ALL;
```

Et les DIRECTORIES :

```SQL
CREATE DIRECTORY DUMP AS '/export';
```

Importer les metadonnées des tablespaces transportés. Contrairement à l'export sur la base source, ici on liste **tous les fichiers** des tablespaces transportés, pas seulement le nom des tablesapces :

```shell
impdp system/'system_password!' DUMPFILE=exp_TTS_MYDB.dmp DIRECTORY=DUMP TRANSPORT_DATAFILES=/u01/mydb/tblsp_1_01.dbf TRANSPORT_DATAFILES=/u01/mydb/tblsp_1_02.dbf TRANSPORT_DATAFILES=/u01/mydb/tblsp_2_01.dbf TRANSPORT_DATAFILES=/u01/mydb/tblsp_2_01.dbf  LOGFILE=imp_TTS_MYDB.log
```

Repasser les tablespace en read write :

```SQL
alter tablespace TBLSP_1 read write;
alter tablespace TBLSP_2 read write;
alter tablespace TBLSP_3 read write;
```

Modifier les utilisateurs pour leur attribuer le bon tablespace par défaut :

```SQL
ALTER USER "APPLIUSER" DEFAULT TABLESPACE "TBLSP_1";
```

Si le tablespace USERS n'a plus d'utilité, le supprimer :

```SQL
drop tablespace USERS including contents and datafiles;
```

Repasser le paramètre compatible en version 19 et valider la configuration de la base par un redémarrage :

```SQL
alter system set compatible='19.0.0' scope=spfile;
SHUTDOWN IMMEDIATE;
STARTUP; 
```