Kloniranje/dupliciranje Oracle “ASM based” baze (How to duplicate Oracle “ASM based” database)

Thursday, 13.12.2007 – Dejan

Pojavila se potreba da postojeću bazu klonirate, da biste mogli npr. izvršiti određene testove i provjeriti funkcionalnost novih programa. U ovom slučaju taj problem, odnosno zadatak, još kompleksnijim čini korištenje ASM (Automatic Storage Management), tako da postupak kloniranja baze nije jednostavan kao kod kloniranja baze sa datotekama na OS File-Systemu.

Sad se pitate:”Kako najlakše kopirati Oracle bazu, odnosno kako najefikasnije napraviti klon-bazu?“.

Klon-bazu možete kreirati na 3 načina:
1. koristeći RMAN i naredbu DUPLICATE
2. DBMS_FILE_TRANSFER paket
3. koristeći Enterprise Manager i opciju “Clone Database
4. pomoću “Cold backup” metode (rijetko se koristi, pogotovo u 24/7 okruženju)

Koju ćete metodu za kloniranje baze koristiti, uopšteno zavisi od nekoliko faktora:
– da li baza koristi ASM ili file system storage
– da li će baze koristiti zajedničku ASM instancu
– da li se klon-baza mora nalaziti na drugom serveru
– da li koristite Grid Control ili samo Database Control
– koju verziju Oracle baze i softwarea koristite (npr. nije svejedno da li koristite Oracle 9i ili Oracle 10g)
– i td.

Mi u firmi imamo 2 potrebe za kloniranjem:
– kloniranje baze na istom serveru i uz korištenje zajedničke ASM instance
– kloniranje baze na drugi server sa posebnom ASM instancom

Za prvu potrebu koristimo RMAN i naredbu DUPLICATE DATABASE, a za drugu potrebu koristimo DBMS_FILE_TRANSFER paket.

Za sada ću objasniti samo prvu metodu, a drugu ću nekom drugom prilikom kada budem imao volje i motivacije. 😀

Kloniranje baze koristeći RMAN i naredbu DUPLICATE DATABASE

Metodu kloniranja baze koristeći RMAN prikazaću jednim praktičnim primjerom, u kojem ću korak po korak objasniti šta se i kako mora obaviti, da bi baza bila uspješno klonirana.

U ovom primjeru ću koristiti slijedeće pojmove:
dejanDB: postojeća ciljna (target) baza, koju trebamo klonirati
cloneDB: klon-baza
+ASM: zajednička ASM instanca
ORACLE_HOME: mjesto gdje je instaliran Oracle software; u ovom slučaju je to C:oracleproduct10.2.0db_1

Dakle, u ORACLE_HOME direktorijumu smo instalirali Oracle software i kreirali jednu bazu pod nazivom dejanDB. Tu bazu označavamo kao ciljnu, odnosno “target” bazu, koju ćemo klonirati. Klon-bazu ćemo nazvati cloneDB i nalaziće se na istom serveru na kojem se nalazi i dejanDB, a koristiće zajedničku ASM instancu u kojoj će se nalaziti fizičke datoteke (database files).

Kreiranje ASM direktorija

Spojimo se na ASM instancu i kreirajmo potrebne direktorije u kojima će se nalaziti fizičke datoteke:

C:> set ORACLE_SID=+ASM
C:> asmcmd
ASMCMD> ls
DG_DATA
DG_FRA
ASMCMD> cd DG_DATA
ASMCMD> cd dejanDB
ASMCMD> pwd
+DG_DATA/dejanDB 
ASMCMD> ls
CONTROLFILE/
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/
ASMCMD> cd ..
ASMCMD> mkdir cloneDB
ASMCMD> cd cloneDB
ASMCMD> mkdir CONTROLFILE DATAFILE ONLINELOG PARAMETERFILE TEMPFILE
ASMCMD> ls
CONTROLFILE/
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/
ASMCMD> pwd
+DG_FRA
ASMCMD> mkdir cloneDB
ASMCMD> cd cloneDB
ASMCMD> mkdir ARCHIVELOG CONTROLFILE DATAFILE ONLINELOG PARAMETERFILE
ARCHIVELOG/
CONTROLFILE/
DATAFILE/
ONLINELOG/
PARAMETERFILE/
ASMCMD> exit

Kreiranje OS direktorija

Moramo kreirati i direktorije na nivou operativnog sistema (OS je u našem slučaju Windows), u kojima će se nalaziti “alert log”, “trace” i ostale “dump” datoteke:

C:oracleproduct10.2.0>cd admin
C:oracleproduct10.2.0admin>mkdir cloneDB
C:oracleproduct10.2.0admin>cd cloneDB
C:oracleproduct10.2.0admincloneDB>mkdir adump bdump cdump dpdump hdump pfile scripts udump
C:oracleproduct10.2.0admincloneDB>dir
 Volume in drive C has no label.
 Volume Serial Number is BC39-7914 

Directory of C:oracleproduct10.2.0admincloneDB 

12/07/2007  09:58 AM    <DIR>          .
12/07/2007  09:58 AM    <DIR>          ..
12/07/2007  09:58 AM    <DIR>          adump
12/07/2007  09:58 AM    <DIR>          bdump
12/07/2007  09:58 AM    <DIR>          cdump
12/07/2007  09:58 AM    <DIR>          dpdump
12/07/2007  09:58 AM    <DIR>          hdump
12/07/2007  09:58 AM    <DIR>          pfile
12/07/2007  09:58 AM    <DIR>          scripts
12/07/2007  09:58 AM    <DIR>          udump
               0 File(s)              0 bytes
              10 Dir(s)  283,583,328,256 bytes free

Podešavanje init-parametara

Napravimo kopiju init-datoteke od baze dejanDB i imenujmo ju “initcloneDB.ora”:

C:oracleproduct10.2.0db_1database> copy initdejanDB.ora initcloneDB.ora

Otvorimo tu datoteku i podesimo odgovarajuće parametre:

*.__db_cache_size=687865856
*.__java_pool_size=4194304
*.__large_pool_size=12582912
*.__shared_pool_size=239075328
*.__streams_pool_size=0
*.audit_file_dest='C:oracleproduct10.2.0admincloneDBadump'
*.background_dump_dest='C:oracleproduct10.2.0admincloneDBbdump'
*.compatible='10.2.0.3.0'
*.control_files='+DG_DATA/cloneDB/controlfile/controlfile1.ctl','+DG_FRA/cloneDB/controlfile/controlfile2.ctl'
*.core_dump_dest='C:oracleproduct10.2.0admincloneDBcdump'
*.cpu_count=2
*.cursor_sharing='EXACT'
*.db_block_size=16384
*.db_create_file_dest='+DG_DATA'
*.db_domain='clone'
*.db_file_multiblock_read_count=16
*.db_files=300
*.db_keep_cache_size=102400000
*.db_name='cloneDB'
*.db_recovery_file_dest='+DG_FRA'
*.db_recovery_file_dest_size=168820736000
*.db_writer_processes=2
*.dispatchers='(PROTOCOL=TCP) (SERVICE=cloneDBXDB)'
*.job_queue_processes=10
*.large_pool_size=10240000
*.log_archive_dest_1='LOCATION=+DG_FRA/cloneDB/'
*.nls_length_semantics='CHAR'
*.open_cursors=300
*.optimizer_mode='FIRST_ROWS'
*.pga_aggregate_target=351272960
*.processes=350
*.remote_login_passwordfile='exclusive'
*.session_cached_cursors=200
*.sessions=390
*.sga_target=1054867456
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='C:oracleproduct10.2.0admincloneDBudump'
*.db_file_name_convert=('dejan','cloneDB')
*.instance_name='cloneDB'

Kreiranje “password” datoteke


C:> orapwd file=C:oracleproduct10.2.0db_1databasePWDcloneDB.ora password=pass123 entries=5

Kreiranje instance za klon-bazu

Instancu za klon-bazu kreiramo pomoću oradim alata:

C:>oradim -NEW -SID cloneDB -syspwd "pass123" -startmode manual
Instance created.

Provjerimo da li je nova instanca aktivna i pokrenimo ju u NOMOUNT modusu:

C:>set ORACLE_SID=cloneDB
C:>sqlplus /nolog
SQL*Plus: Release 10.2.0.3.0 - Production on Fri Dec 7 10:24:29 2007
Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.

SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup nomount pfile=C:oracleproduct10.2.0db_1databaseinitcloneDB.ora
ORACLE instance started.

Total System Global Area 1056964608 bytes
Fixed Size                  2060264 bytes
Variable Size             260046872 bytes
Database Buffers          788529152 bytes
Redo Buffers                6328320 bytes
SQL> exit

listener.ora i tnsnames.ora

Da bismo se mogli spojiti na klon-bazu, moramo dodati unose za klon-bazu u konfiguracijske datoteke listener.ora i tnsnames.ora:

listener.ora: 

    (SID_DESC =
      (GLOBAL_DBNAME = cloneDB)
      (ORACLE_HOME = C:oracleproduct10.2.0db_1)
      (SID_NAME = cloneDB)
    )

tnsnames.ora: 

CLONEDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = cloneDB)
    )
  )

Nakon što smo sačuvali izmjene, potrebno je listener restartovati, kako bi konfiguracija za klon-bazu imala efekt:

C:> lsnrctl reload

Backup “target” baze

Uslov za kloniranje baze pomoću RMAN-a i naredbe DUPLICATE DATABASE je da “target” baza ima ispravan backup. Ukoliko vaša baza ima backup, onda možete preskočiti ovaj dio.

C:> set ORACLE_SID=dejanDB 
C:> rman target / 
RMAN> configure device type disk parallelism 2 backup type to copy;
new RMAN configuration parameters: 
CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO COPY; 
new RMAN configuration parameters are successfully stored 

RMAN> backup database;
RMAN> sql "alter system archive log current";
sql statement: alter system archive log current
RMAN> backup archivelog all;

Kloniranje baze

RMAN> connect auxiliary sys/pass123@cloneDB
connected to auxiliary database: CLONEDB (not mounted) 

RMAN> duplicate target database to cloneDB 
pfile=C:oracleproduct10.2.0db_1databaseinitcloneDB.ora 
logfile '+DG_DATA/cloneDB/onlinelog/redo1.dbf' size 100m, 
'+DG_DATA/cloneDB/onlinelog/redo2.dbf' size 100m; 

Starting Duplicate Db at 07-DEC-07 
... 
contents of Memory Script: 
{ 
   Alter clone database open resetlogs; 
} 
executing Memory Script 

database opened 
Finished Duplicate Db at 07-DEC-07 
RMAN>

SPFILE umjesto PFILE

Logujte se kao SYS, kreirajte SPFILE datoteku i restartujte bazu:

SQL> conn sys/pass123@cloneDB as sysdba
Connected.

SQL> create spfile from pfile='C:oracleproduct10.2.0db_1databaseinitcloneDB.ora';
File created.
SQL> shutdown immediate
SQL> startup

Finalna provjera

Na kraju moramo provjeriti, da li je baza uspješno klonirana i da li funkcioniše kako treba. Logujte se na bazu i pokrenite neki upit. Ne zaboravite provjeriti da li su aktivni neki definisani poslovi (“jobs”) i da ne dolaze u konflikt sa zadanim poslovima na “target” bazi.
Takođe provjerite da li su TEMP tablespaces ispravno kreirani:

select property_name, property_value from database_properties;

select username, temporary_tablespace, account_status from dba_users;

Ukoliko neki TEMP tablespace ili tempfile nedostaje, možete ga kreirati ovom komandom:


CREATE TEMPORARY TABLESPACE "TEMP01" TEMPFILE '+DG_DATA/cloneDB/TEMPFILE/temp01.dbf' SIZE 5000M AUTOEXTEND ON NEXT 104857600 MAXSIZE 10000M;

odnosno dodati tempfile:


alter tablespace TEMP01 add tempfile '+DG_DATA/cloneDB/TEMPFILE/temp01.dbf' SIZE 5000M AUTOEXTEND ON NEXT 104857600 MAXSIZE 10000M;

To bi bilo to.

Srećno kloniranje! 😀

Post a Comment