Déplacer une base vers un nouveau serveur en changeant les chemins des fichiers
Pour déplacer une base d'un serveur vers un autre, sans changement de version, le plus simple est de créer une base vide avec le même SID à la destination, d'arrêter la base source, et copier les fichiers à la destination. Mais si les chemins des fichiers diffèrent, il faut les modifier avant d'ouvrir la nouvelle base.
Ici on crée directement avec sqlplus un script SQL qu'il suffira de lancer à la destination une fois les fichiers copiés.
define path='nouveau_chemin'
set pages 0
set lines 2000
set head off
set term off
set verify off
set feed off
select 'spool MYBASE_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;
-- CHECK REDOS PATHS !
select 'alter database rename file '''||member||''' to ''/&path'||group#||'1.log'';' from v$logfile;
-- select 'ALTER DATABASE ADD LOGFILE MEMBER ''/other_path_redo/&path/redo'||group#||'2.log'' to group '||group#||';' from v$logfile; -- IF NECESSARY
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%';
-- CHECK ARCHIVES PATH !
select 'alter system set '||NAME||'=LOCATION=/archives/&path scope=spfile;' from v$parameter where ISDEFAULT='FALSE' and NAME = 'log_archive_dest_1';
select 'spool off' from dual;