31 July 2006

Copy - Paste an Oracle Database Quickly

 Genellikle 3 tür sistem ile çalışılır uygulamaların gelişim sürecinde. Development, Test ve Production olarak tabir edilen bu tür sistemler birbirlerine olabildiğince yakınlaştırılır içerdikleri veri bakımından. Development ve Test verileri, zamanla Production ortamından beslenir. Production veritabanı, Test ve Development veritabanına aktarılır, kopyalanır. Bu işlem için RMAN veya (Ex/Im)port yöntemleri kullanılır. Aşağıda, bu işlemi nasıl kısa yoldan yapabileceğinizi aktaramaya çalıştım.

shp03 adlı veritabanın bir kopyasının shp05 olarak oluşturulması aşağıda belirtilmiştir.

DB kapatılır.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

DB dosyalarının nerede bulunduğu öğrenilir. (Eğer dizin yapısı belli ise bakılmadan da yapılabilir. Örneğin dosyaları data02 altında shp03 SID’li olarak bulunan bir DB’yi, data05 altında shp05 oalarak bir benzerini oluşturmak istiyorsak data file’ların nerede olduğunu incelemeye gerek yoktur.)


SQL> select name from v$datafile;

NAME
------------------------------------------------------------------
/data02/shp03/system01.dbf
/data02/shp03/undotbs01.dbf
/data02/shp03/sysaux01.dbf
/data02/shp03/data01.dbf
/data02/shp03/data02.dbf
/data02/shp03/users01.dbf

6 rows selected

Yukarıda bulunan dosyalar DB için gerekli data file’larıdır. Bunlardan başka dosyalar da bulunur. Bütün dosyalar, kopyası alınacak DB’nin içinden bulunabilir.

oracle@zerg_shp01> cd /data02/shp03
oracle@zerg_shp01> ls
control01.ctl  control03.ctl  data02.dbf     redo02.log    
sysadm.log     system01.dbf   undotbs01.dbf
control02.ctl  data01.dbf     redo01.log     redo03.log    
sysaux01.dbf   temp01.dbf     users01.dbf

Yeni bir dizin oluşturulur.

oracle@zerg_shp01> cd /data05
oracle@zerg_shp01> mkdir shp05
oracle@zerg_shp01> ls
shp05


Dosyalar yeni dizine kopyalanır.

oracle@zerg_shp01> cp /data02/shp03/* /data05/shp05
oracle@zerg_shp01> ls
control01.ctl  control03.ctl  data02.dbf     redo02.log    
sysadm.log     system01.dbf   undotbs01.dbf
control02.ctl  data01.dbf     redo01.log     redo03.log    
sysaux01.dbf   temp01.dbf     users01.dbf




Kopyalanacak DB’nin dizin yapısında yeni bir dizin yapısı oluşturulur.

oracle@zerg_shp01> cd $ORACLE_HOME/admin/shp03
oracle@zerg_shp01> ls
bdump    cdump    create   pfile    scripts  udump
oracle@zerg_shp01>

İstenirse eğer, udump, bdump ve cdump dizinlerini içeriği silinebilir.

oracle@zerg_shp01> cd $ORACLE_HOME/admin/shp03/bdump
oracle@zerg_shp01> rm *.*

pfile  dizini içinden eski DB’ye ait init dosyasının ismi dğiştirilir.

oracle@zerg_shp01> cd $ORACLE_HOME/admin/shp03/pfile
oracle@zerg_shp01> cp initshp03.ora initshp05.ora
oracle@zerg_shp01> ls
init.ora.022006193440  initshp05.ora           initshp03.ora
oracle@zerg_shp01> rm initshp03.ora

init dosyası değiştirilir.

oracle@zerg_shp01> vi initshp03.ora

Gerekli değiştirmeler yapılır.

control_files=("/data02/shp03/control01.ctl", "/data02/shp03/control02.ctl", "/data02/shp03/control03.ctl")
yerine
control_files=("/data05/shp05/control01.ctl", "/data05/shp05/control02.ctl", "/data05/shp05/control03.ctl")

yapılır. Bunun için vi ile
:%s/data03/data05/g ve :%s/shp03/shp05/g
Yapılabilir.

Linkleme yapılır.

oracle@zerg_shp01> cd $ORACLE_HOME/dbs
oracle@zerg_shp01> ln -s /data01/oracle/product/10.1.0/admin/shp05/pfile/initshp05.ora initshp05.ora

/etc/oratab dosyasına ekleme yapılır. shp03 için yapılan tanım burada tekrarlanır:

shp05:/data01/oracle/product/10.1.0:N

Aşağıdaki script oluşturulur. open.sql:

STARTUP NOMOUNT
CREATE CONTROLFILE REUSE SET DATABASE "SHP05" RESETLOGS  NOARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 3635
LOGFILE
  GROUP 1 '/data05/shp05/redo01.log'  SIZE 10M,
  GROUP 2 '/data05/shp05/redo02.log'  SIZE 10M,
  GROUP 3 '/data05/shp05/redo03.log'  SIZE 10M
-- STANDBY LOGFILE
DATAFILE
  '/data05/shp05/system01.dbf',
  '/data05/shp05/undotbs01.dbf',
  '/data05/shp05/sysaux01.dbf',
  '/data05/shp05/data01.dbf',
  '/data05/shp05/data02.dbf',
  '/data05/shp05/users01.dbf'
CHARACTER SET WE8ISO8859P1
;

RECOVER DATABASE

ALTER DATABASE OPEN RESETLOGS;

ALTER TABLESPACE TEMP ADD TEMPFILE '/data05/shp05/temp01.dbf'
     SIZE 1470M REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

Open.sql dosyası  /data05/shp05 altına kopyalanır.
ORACLE_SID değeri değiştirilir.

export ORACLE_SID=shp05


Sqlplus ile bağlanılıp bu dosya çalıştırılır.

oracle@zerg_shp01> sqlplus / as sysdba

SQL*Plus: Release 10.1.0.2.0 - Production on Mon Jul 31 19:31:09 2006

Copyright (c) 1982, 2004, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> @open.sql

Bundan sonra DB gerekli düzenlemeleri yaparak açılır.

Listener.ora dosyası güncellenir. Shp03 için yapılan tanım burada da tekrarlanır:

    (SID_DESC =
      (GLOBAL_DBNAME = shp05)
      (ORACLE_HOME = /data01/oracle/product/10.1.0)
      (SID_NAME = shp05)
    )

Listener yeniden çalıştırılır.

oracle@zerg_shp01> lsnrctl

LSNRCTL for Compaq Tru64 UNIX: Version 10.1.0.2.0 - Production on 31-JUL-2006 17:04:04

Copyright (c) 1991, 2004, Oracle.  All rights reserved.

Welcome to LSNRCTL, type "help" for information.

LSNRCTL> stop
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=zerg)(PORT=1521)))
The command completed successfully
LSNRCTL> start

Tnsnames.ora güncellenir. shp03 için yapılan tanım burada da tekrarlanır:

shp05 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(Host = 172.23.248.130)(Port = 1521))
    (CONNECT_DATA =
      (SID = shp05)
    )
  )

Tnsping ile DB kontrol edilir:

oracle@zerg_shp01> tnsping shp05

TNS Ping Utility for Compaq Tru64 UNIX: Version 10.1.0.2.0 - Production on 31-JUL-2006 17:07:45

Copyright (c) 1997, 2003, Oracle.  All rights reserved.

Used parameter files:
/data01/oracle/product/10.1.0/network/admin/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(Host = 172.23.248.130)(Port = 1521)) (CONNECT_DATA = (SID = shp05)))
OK (230 msec)

Kullanıcılardan için tnsnames.ora dosyasının güncellenmesi istenir.