Copiare e rinominare un database Oracle senza import ed export

Per poter duplicare in modo veloce un database oracle oltre al metodo import ed export esiste la copia fisica dei datafiles. Questo metodo viene utilizzato quando il database è molto grande e per evitare le lunghe attese dell'export ed import del Database.
In questo documento viene assunto che il database origine abbia come istanza ORIG (origine) mentre il database da creare o duplicare si chiamerá DEST (destinazione)

fasi da seguire:
- Collegarsi al database origine
- Individuare i datafiles da copiare
- Copiare i datafiles nella nuova allocazione
- Creare le directory della nuova struttura dell'istanza
- Generazione script per la creazione controlfiles della nuova istanza
- Creare i controlfiles sulla nuova istanza
- Start della nuova istanza


Collegarsi al database origine

In questa fase bisogna essere sicuri che l'istanza da duplicare sia quella giusta. Verificare che la variabile d'ambiente ORACLE_SID sia settata a ORIG; sia tramite comando unix e sia tramite collegamento a sqlplus. (su unix echo $ORACLE_SID)
sqlplus  /nolog                                                  



SQL*Plus: Release 10.2.0.4.0 - Production on Tue March 20 11:26:23 2008



Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.



SQL> connect sys/sys as sysdba



SQL> select name from v$database;

 

  NAME

  ---------------------------------------

  ORIG

 

 

Individuare i datafiles da copiare

Eseguire una query sul database origine per conoscere i datafiles da duplicare.
 SQL> select name from v$datafile;

 

  NAME

  ---------------------------------------

  /filesystem01/ORIG/system01.dbf

  /filesystem01/ORIG/rbs01.dbf

  /filesystem01/ORIG/temp01.dbf

  /filesystem01/ORIG/user_01.dbf

  /filesystem01/ORIG/user_02.dbf
Memorizzare queste allocazioni ed eseguire un shutdown dell'istanza ORIG.


Copiare i datafiles nella nuova allocazione
Verificare che sui filesystem ci sia spazio sufficiente. Creare la directory DEST da utenza oracle e procedere alla copia dei files memorizzati precedentemente.
Pertanto si avrà:

Locazione origineNuova locazione
/filesystem01/ORIG/system01.dbf /filesystem02/DEST/system01.dbf
/filesystem01/ORIG/rbs01.dbf /filesystem02/DEST/rbs01.dbf
/filesystem01/ORIG/temp01.dbf /filesystem02/DEST/temp01.dbf
/filesystem01/ORIG/user_01.dbf /filesystem02/DEST/user_01.dbf
/filesystem01/ORIG/user_02.dbf /filesystem02/DEST/user_02.dbf

Terminata la copia di tutti i files nella nuova alberatura, eseguire lo startup dell'istanza ORIG.


Creare le directory della nuova struttura dell'istanza

Duplicare il files initORIG.ora in initDEST.ora. Cambiare il valore della variabile"db_name" da ORIG in DEST (Attenzione: se esistono ulteriori variabili con ORIG sostituire con DEST).
Creare la struttura della nuova istanza:

  • audit_file_dest
  • background_dump_dest
  • control_files
  • core_dump_dest
  • log_archive_dest
  • user_dump_dest
Se il database DEST sta su una differente macchina copiare il file initDEST.ora nella directory giusta.


Generazione script per la creazione controlfiles della nuova istanza

Collegarsi all'istanza ORIG e creare lo script dei controlfiles nel modo seguente:

SQL> alter database backup controlfile to trace; Statement processed.

Il file verrà creato nella directory del setup di oracle, variabile USER_DUMP_DEST. Copia il file cr_control.sql nella directory USER_DUMP_DEST dell'istanza DEST:
  • Rimuovi dal files cr_control.sql l'argomento "START NOMOUNT".
  • Modifica la linea "CREATE CONTROLFILE" dove è scritto REUSE con SET prima della chiave di DATABASE.
  • Cambia dovunque compare ORIG in DEST.
  • Sostituisci la parola NORESETLOGS to RESETLOGS.
Lo script sarà:

Edita il cr_control.sql
STARTUP NOMOUNT

CREATE CONTROLFILE SET DATABASE "DEST" RESETLOGS NOARCHIVELOG

    MAXLOGFILES 32

    MAXLOGMEMBERS 5

    MAXDATAFILES 600

    MAXINSTANCES 10

    MAXLOGHISTORY 1000

LOGFILE

  GROUP 1 (

    '/filesystem02/DEST/redo_g01a.log',

    '/filesystem02/DEST/redo_g01b.log',

    '/filesystem02/DEST/redo_g01c.log'

  ) SIZE 200K,

  GROUP 2 (

    '/filesystem02/DEST/redo_g02a.log',

    '/filesystem02/DEST/redo_g02b.log',

    '/filesystem02/DEST/redo_g02c.log'

  ) SIZE 200K,

  GROUP 3 (

    '/filesystem02/DEST/redo_g03a.log',

    '/filesystem02/DEST/redo_g03b.log',

    '/filesystem02/DEST/redo_g03c.log'

  ) SIZE 200K

DATAFILE

  '/filesystem02/DEST/system01.dbf',

  '/filesystem02/DEST/rbs01.dbf',

  '/filesystem02/DEST/temp01.dbf',

  '/filesystem02/DEST/user_01.dbf',

  '/filesystem02/DEST/user_02.dbf'

;
Se il database DEST sta su una differente macchina sposta il file sull'altra macchina.

Creare i controlfiles sulla nuova istanza

Settare la variabile ORACLE_SID a DEST. (Es. (sh, ksh) : export ORACLE_SID=DEST).

Ora crea i controlfiles eseguendo da istanza oracle il file cr_control.sql Esegui i comandi:

 SQL> @cr_control

  ORACLE instance started.

  Total System Global Area      6698212 bytes

  Fixed Size                       44216 bytes

  Variable Size                 23310846 bytes

  Database Buffers               9873230 bytes

  Redo Buffers                    172730 bytes

  Statement processed.

  SQL>
NOTE: Resta connesso e procedi al passo successivo.

Start della nuova istanza

Prima di attivare il database DEST, devi eseguire una recover database e dopo puoi aprire il database con l'opzione resetlogs:
  SQL> alter database recover database until cancel using backup controlfile;

  SQL> alter database recover cancel;

  Statement processed.

  SQL> alter database open resetlogs;

  Statement processed.

  SQL>
Verifica che sei connesso all'istanza database DEST eseguendo la seguente query:
    SQL> select name from v$database;

    NAME

    ---------

    DEST

    1 row selected.

    SQL>
I'm very happy !!!!!!!!!!!!!!!!!!!!!!!!!