Déplacement d'une base complète vers un nouveau serveur avec changement du chemin des fichiers
La base ORCL va être déplacée d'un serveur ORACLESRC vers un nouveau serveur ORACLEDST, sans changement de version (Oracle 11g) ni changement de SID, mais changement des chemins des fichiers de la base de "/u01/orcl" vers "/oracle/data/orcl".
Si le SID doit changer, préférer plutôt une migration par RMAN, comme on le ferait pour une duplication de base.
Créer la nouvelle base sur le nouveau serveur. Une fois créée, la stopper tout de suite (on doit écraser ses fichiers !)
Si nécessaire (mais il a dû être recréé avec la nouvelle base) copier le fichier de mots de passe SYSDBA /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwORCL de l'ancien serveur vers le nouveau.
Créer un script sql avec le code ci-dessous, à lancer sur la base source. Il génère lui-même un script sql "migration.sql" qui modifiera les chemins sur la base destination
-- Adapter le chemin ci-dessous selon la destination
define path='/oracle/data/orcl'
set pages 0
set lines 2000
set head off
set term off
set verify off
set feed off
spool migration.sql
select 'spool migration.log' from dual;
select 'startup nomount' from dual;
select 'alter system set control_files=''/&path/control01.ctl'', ''/redo1/&path/control02.ctl'', ''/redo2/&path/control03.ctl'' scope=SPFILE;' from dual;
select 'shutdown immediate' from dual;
select 'startup mount' from dual;
select 'alter database rename file '''||file_name||''' to ''/&path'||substr(file_name, instr(file_name,'/',-1))||''';' from dba_data_files;
select 'alter database rename file '''||file_name||''' to ''/&path'||substr(file_name, instr(file_name,'/',-1))||''';' from dba_temp_files;
select 'alter database rename file '''||member||''' to ''/redo1/&path/redo'||group#||'1.log'';' from v$logfile;
-- Si des ajouts de groupes REDO LOG sont nécessaires :
-- select 'ALTER DATABASE ADD LOGFILE MEMBER ''/redo2/&path/redo'||group#||'2.log'' to group '||group#||';' from v$logfile;
-- Modification des paramètres
select 'alter system set '||NAME||'='||VALUE||' scope=spfile;' from v$parameter where ISDEFAULT='FALSE' and NAME not in ('control_files','db_block_size','db_create_file_dest','db_recovery_file_dest','audit_file_dest','db_name','diagnostic_dest','db_domain','log_archive_format') and NAME not like '%file_name_convert' and NAME not like '\_%' and NAME not like 'nls_%' and NAME not like 'log_archive_dest%';
select 'alter system set '||NAME||'=LOCATION=/archive/&path scope=spfile;' from v$parameter where ISDEFAULT='FALSE' and NAME = 'log_archive_dest_1';
select 'spool off' from dual;
spool off
exit
Transférer migration.sql vers le serveur destination.
Arrêter de la base source après déconnexion utilisateurs, applications tiers, etc.
Copier les fichiers de la base source vers le nouveau serveur (rsync ou scp, attention aux chemins !)
rsync -av --progress /u01/orcl/* ORACLEDST:/oracle/data/orcl/
Exécuter le script migration.sql sur la base destination.
export ORACLE_SID=ORCL
sqlplus / as sysdba @migration.sql
Relancer de la base en mode normal, recompiler d'éventuels objets en erreur :
SQL> shutdown immediate;
SQL> startup;
SQL> @?/rdbms/admin/utlrp.sql
Vérifier les archive log
SQL> archive log list
SQL> alter system switch logfile ;
Vérifier les tnsnames des clients qui doivent accéder à cette nouvelle base.