Step-step Mencopy Database ke Mesin yang Sama

Mengcopy database di mesin lain, itu sama saja dengan backup & recovery konvensional. Mengcopy database di mesin yang sama, ada sedikit bedanya karena di satu mesin tidak boleh ada 2 (atau lebih) database yang sama; ada step untuk mengubah nama database.

Saya punya 1 database development, nama databasenya adalah ts2. Untuk keperluan test, saya butuh database lagi di mesin development tersebut. Content database baru adalah sama dengan database terdahulu. Bagaimana cara membuatnya, ada dua cara:

  1. Membuat database baru, export dari database lama, kemudian import ke database baru.
  2. Mengcopy database lama ke yang baru, seperti kalau backup dan recovery

Cara pertama tentu saja memakan waktu yang cukup lama, apalagi kalau datanya cukup besar. Kalau begitu saya pilih cara kedua; saya backup database pertama, kemudian saya naikkan (restore & recovery) dengan nama yang berbeda (saya beri nama tsrep). Berikut ini langkah-langkahnya:

  1. Persiapkan (copy) init file. Contoh di sini, saya menggunakan UNIX. Di Windows, lokasi init file di %ORACLE_HOME%\database
    cd $ORACLE_HOME/dbs
    cp -rp initts2.ora inittsrep.ora
    Misalkan content inittsrep.ora adalah berikut ini:
    ### Parameter ini perlu disesuaikan ###
    audit_file_dest='/data1/oracle/admin/ts2/adump'
    background_dump_dest='/data1/oracle/admin/ts2/bdump'
    core_dump_dest='/data1/oracle/admin/ts2/cdump'
    user_dump_dest='/data1/oracle/admin/ts2/udump'
    control_files='/oradata/oracle/ts2/control01.ctl', '/oradata/oracle/ts2/control02.ctl', '/oradata/oracle/ts2/control03.ctl'
    log_archive_dest_1='LOCATION=/oradata/oracle/ts2/arc'
    db_name='ts2'
    ####################################
    log_archive_dest_state_1=enable
    log_archive_format=%s_%t_%r.arc
    compatible='10.2.0.3.0'
    db_block_size=8192
    db_domain=''
    pga_aggregate_target=209715200
    sga_target=1610612736
    undo_management='AUTO'
    undo_tablespace='UNDOTBS1'
    remote_login_passwordfile='EXCLUSIVE'
    Beberapa parameter saya sesuaikan, terutama db_name dan yang berkaitan dengan direktori. Berikut ini parameter yang telah saya sesuaikan:
    audit_file_dest='/data1/oracle/admin/tsrep/adump'
    background_dump_dest='/data1/oracle/admin/tsrep/bdump'
    core_dump_dest='/data1/oracle/admin/tsrep/cdump'
    user_dump_dest='/data1/oracle/admin/tsrep/udump'
    control_files='/oradata/oracle/tsrep/control01.ctl', '/oradata/oracle/tsrep/control02.ctl', '/oradata/oracle/tsrep/control03.ctl'
    log_archive_dest_1='LOCATION=/oradata/oracle/tsrep/arc'
    db_name='tsrep'
  2. Persiapkan direktori untuk data file dan lainnya
    mkdir /data1/oracle/admin/tsrep
    mkdir /data1/oracle/admin/tsrep/adump
    mkdir /data1/oracle/admin/tsrep/bdump
    mkdir /data1/oracle/admin/tsrep/cdump
    mkdir /data1/oracle/admin/tsrep/udump
    mkdir /oradata/oracle/tsrep
    mkdir /oradata/oracle/tsrep/arc
  3. Persiapkan script untuk create database
    Di database lama (source):
    SQL> alter database backup controlfile to trace resetlogs;
    Lihat trace file di direktory user_dump_dest, /data1/oracle/admin/ts2/udump
    SQL> sho parameter user_dump_dest
    Copy trace file tersebut
    cd /data1/oracle/admin/ts2/udump
    cp ts2_ora_18762.trc /oradata/oracle/tsrep/crdbtsrep.sql
    Edit file crdbtsrep.sql, buang “trace file entry”, hingga jadi seperti ini
    STARTUP NOMOUNT
    CREATE CONTROLFILE REUSE DATABASE "TS2" RESETLOGS ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
    LOGFILE
    GROUP 4 '/oradata/oracle/ts2/redo04.log' SIZE 5M,
    GROUP 5 '/oradata/oracle/ts2/redo05.log' SIZE 5M,
    GROUP 6 '/oradata/oracle/ts2/redo06.log' SIZE 5M
    -- STANDBY LOGFILE
    DATAFILE
    '/oradata/oracle/ts2/system01.dbf',
    '/oradata/oracle/ts2/undotbs01.dbf',
    '/oradata/oracle/ts2/sysaux01.dbf',
    '/oradata/oracle/ts2/users01.dbf'
    CHARACTER SET WE8ISO8859P1
    ;
    Edit lagi file crdbtsrep.sql.
    Ganti entry ini CREATE CONTROLFILE REUSE DATABASE "TS2" RESETLOGS ARCHIVELOG Menjadi
    CREATE CONTROLFILE SET DATABASE "TS2REP" RESETLOGS ARCHIVELOGSesuaikan directory-directory yang berkaitan. Dalam contoh ini saya ganti /oradata/oracle/ts2/ Menjadi /oradata/oracle/tsrep/Setelah beberapa pengeditan, file file crdbtsrep.sql menjadi
    STARTUP NOMOUNT
    CREATE CONTROLFILE SET DATABASE "TSREP" RESETLOGS ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
    LOGFILE
    GROUP 4 '/oradata/oracle/tsrep/redo04.log' SIZE 5M,
    GROUP 5 '/oradata/oracle/tsrep/redo05.log' SIZE 5M,
    GROUP 6 '/oradata/oracle/tsrep/redo06.log' SIZE 5M
    -- STANDBY LOGFILE
    DATAFILE
    '/oradata/oracle/tsrep/system01.dbf',
    '/oradata/oracle/tsrep/undotbs01.dbf',
    '/oradata/oracle/tsrep/sysaux01.dbf',
    '/oradata/oracle/tsrep/users01.dbf'
    CHARACTER SET WE8ISO8859P1
    ;
  4. Copy (backup dan restore) database source
    Kalau databasenya NOARCHIVELOG, lakukan cold (off line) backup. Karena database ts2 ARCHIVELOG, maka saya bisa melakukan secara hot (on line) backup. Dalam contoh ini saya memakai hotbackup.Lihat list datafile dan tempfile yang perlu di-copy
    select name as file_name from
    (select name from v$tempfile union
    select name from v$datafile);

    /oradata/oracle/ts2/sysaux01.dbf
    /oradata/oracle/ts2/system01.dbf
    /oradata/oracle/ts2/temp01.dbf
    /oradata/oracle/ts2/undotbs01.dbf
    /oradata/oracle/ts2/users01.dbf
    Lihat tablespace yang perlu di backup
    SQL> select distinct tablespace_name from dba_data_files;
    TABLESPACE_NAME
    ------------------------------
    SYSTEM
    USERS
    SYSAUX
    UNDOTBS1
    Sebelum menjalankan BEGIN BACKUP, lihat “Current log sequence”. Informasi ini kita perlukan untuk melihat archived log mana saja yang nanti dibutuhkan untuk menaikkan database. Dalam contoh ini, “Current log sequence” adalah 17.
    SQL> archive log listJalankan BEGIN BACKUP pada tablespace-tablespace tersebut (Kalau cold backup, step ini diganti dengan shutdown database):
    SQL> alter tablespace SYSTEM begin backup;
    SQL> alter tablespace USERS begin backup;
    SQL> alter tablespace SYSAUX begin backup;
    SQL> alter tablespace UNDOTBS1 begin backup;
    Copy datafile dan tempfile
    cd /oradata/oracle/ts2/
    cp -rp sysaux01.dbf /oradata/oracle/tsrep
    cp -rp system01.dbf /oradata/oracle/tsrep
    cp -rp temp01.dbf /oradata/oracle/tsrep
    cp -rp undotbs01.dbf /oradata/oracle/tsrep
    cp -rp users01.dbf /oradata/oracle/tsrep

    Setelah proses copy datafile selesai, jalankan END BACKUP pada tablespace-tablespace terkait (Kalau cold backup, step ini diganti dengan startup database):
    SQL> alter tablespace SYSTEM end backup;
    SQL> alter tablespace USERS end backup;
    SQL> alter tablespace SYSAUX end backup;
    SQL> alter tablespace UNDOTBS1 end backup;

    Setelah selesai END BACKUP, lihat nilai dari “Current log sequence”. Dalam contoh ini nilainya adalah 18.
    SQL> archive log list

    Jalankan “archive log current” untuk membuat archived log dari sequence 18.
    SQL> alter system archive log current
    Archived log yang dibutuhkan untuk menaikkan database adalah archived log sequence sebelum BEGIN BACKUP dan seteleh END BACKUP. Jadi, sequence 17 dan 18.

    Selanjutnya copy archived log yang dibutuhkan itu
    cd /oradata/oracle/ts2/arc/
    cp -rp 17_1_658171224.arc /oradata/oracle/tsrep/arc
    cp -rp 18_1_658171224.arc /oradata/oracle/tsrep/arc

  5. Persiapan sebelum menaikkan database
    Setting ORACLE_SID, di shell csh
    setenv ORACLE_SID tsrep
    Di shell ksh
    export ORACLE_SID=tsrep
    Di Windows
    set ORACLE_SID=tsrep
    Khusus di Windows, buat instance (service) pakai oradim. Pastikan bahwa file inittsrep.ora sudah dibuat.
    cd %ORACLE_HOME%\database
    oradim -NEW -SID tsrep
  6. Menaikkan (create) database
    SQL> @/oradata/oracle/tsrep/crdbtsrep.sql
    Lakukan recovery. Dengan specify automatic, Oracle akan mencari archived log file sendiri.
    SQL> RECOVER AUTOMATIC DATABASE USING BACKUP CONTROLFILE;Dalam contoh ini, archived log yang dibutuhkan adalah sequence 17 sampai 18. Setelah sequence 18 di-apply, Oracle masih minta squence 19. Karena sequence 19 tidak ada, maka recovery menjadi error. Abaikan error tersebut. Selanjutnya:
    SQL> RECOVER DATABASE until cancel;Kalau database sinkron, seharusnya command di atas berhasil. Kalau Oracle masih minta archived log untuk recovery, copy saja lagi dari database source-nya. Kalau di database source archived log belum ter-create, ya jalankan “alter system archive log current”, atau kalau mau, langsung saja recover lagi menggunakan logfile database source (bukan archived log-nya).Misalkan masih dibutuhkan archived log sequence 19, sementara sequence tersebut belum dicreate archived lognya. Gunakan command berikut untuk mendapat logfilenya

    SQL> -- di database source (ts2)
    SQL> select member from v$logfile where GROUP# in
    (select GROUP# from v$log where SEQUENCE#=19);
    Selanjutnya, gunakan logfile di atas untuk recovery di database tsrepSetelah proses recovery berhasil, open database:
    SQL> ALTER DATABASE OPEN RESETLOGS;

    Selanjutnya, tambahkan temp file:
    SQL> ALTER TABLESPACE TEMP ADD
    TEMPFILE '/oradata/oracle/tsrep/temp01.dbf'
    SIZE 20971520 REUSE AUTOEXTEND OFF;

This entry was posted in Administration, Backup & Recovery and tagged , , , , , , , . Bookmark the permalink.

11 Responses to Step-step Mencopy Database ke Mesin yang Sama

  1. Yopi says:

    Mo nanya nih pak, darimana untuk mengetahui trace file hasil dari
    alter database backup controlfile to trace resetlogs;
    di udump itu kan banyak bgt filenya, saya coba liat di alert log ga ada

  2. Benny Kusno B says:

    2 drive tablespace copy ke 1 drive tablespace tanpa ada pengurangan atau penambahan tablespace hanya di gabung menjadi 1 drive saja dan oracle not mount or up

    jumlah table space nya sebesar 89 GB di e:\orant\dataprod dan 134 GB di f:\orant\dataprod trus di copy ke drive e:\orant\dataprod kompi yang baru. dan databases nya not mount krn controlfile yg lama masih baca 2 drive e: & f:

    gimana caranya edit control file tersebut di kompi yang baru supaya databases oracle bisa berjalan dengan normal.

    Terima kasih

  3. rohmadne says:

    For Yopi:

    Kalau banyak trace file di udump, lihat trace file yang waktu terbentuknya (last edited) berbarengan (di sekitar) waktu menjalankan “alter database backup controlfile to trace resetlogs”.

    Kalau anda di UNIX, grep saja
    grep “CREATE CONTROLFILE REUSE DATABASE” *.trc

  4. rohmadne says:

    For Benny,

    Kalau lokasi control file berubah:
    1. Edit init file di %ORACLE_HOME%\database\initNAMAINSTANCE.ora
    2. Edit parameter control_files. Sesuaikan dengan lokasi yang baru
    3. Restart database

    Kalau lokasi data file berubah:
    1. Startup mount
    2. Rename datafile, dari lokasi lama ke baru. Contoh
    alter database rename file ‘/oradata/ts/sysaux01.dbf’ to ‘/newdir/ts/sysaux01.dbf’;

  5. Sigit says:

    Mas, kalo init file nya menunjuk ke spfile bagaimana?

  6. rohmadne says:

    Spfile berformat binari, tidak bisa diedit pakai editor. Solusi next-nya:
    1. rename spfile biar tidak dibaca waktu startup
    2. Kalau belum punya init file, buat initfile.
    – Buka spfile pakai notepad atau more ( di Unix)
    – Copy isi spfile tersebut ke dalam initfile yang baru kita buat (exclude entry ‘aneh-aneh’ yang bukan merupakan parameter instance)

  7. ADOER says:

    Saya sudah coba ikutin langkah2x-nya sama seperti diatas, tapi ada problem :
    SQL> RECOVER DATABASE until cancel;
    ORA-00283: recovery session canceled due to errors
    ORA-01610: recovery using the BACKUP CONTROLFILE option must be done
    SQL> ALTER DATABASE OPEN RESETLOGS;
    ALTER DATABASE OPEN RESETLOGS
    *
    ERROR at line 1:
    ORA-01113: file 1 needs media recovery
    ORA-01110: data file 1: ‘D:\ORACLE\ORADATA\DEVELOP\SYSTEM01.DBF’

    Saya sudah coba dua kali cloning, namun selalu gagal.. ada solusi nggak ya?

  8. kutu kupret says:

    kayaknya untuk yg no archivelog step-step ini ngga berhasil deh

  9. Rosehan says:

    saya maunya pak, di folder bdump tsb spacenya nambah trus sampai 10 GB dalam waktu beberapa bulan / 4 bulanan, akibatnya space drive C jadi penuh dan nggak bisa nyimpan data dan prit out dsata, gimanqa cara penyelesaian selain file nya di delete ?,

    trims

  10. adi says:

    Pak, kenapa ya saat eksekusi perintah @createcontrolfile.sql terjadi error:
    CREATE CONTROLFILE set DATABASE “ORCL” RESETLOGS noarchivelog
    *
    ERROR at line 1:
    ORA-01503: CREATE CONTROLFILE failed
    ORA-01159: file is not from same database as previous files – wrong database id
    ORA-01110: data file 14: ‘D:\oracle\product\10.2.0\oradata\orcl\chernobyl.DBF’
    trmksh atas jawabannya.

  11. Wira says:

    Pak Rohmad, saya mau tanya.
    1) apakah cara ini bisa dilakukan untuk mengcopy database dari mesin yg berbeda ( beda platform)??
    Misalnya dari IBM-AIX ke HP-UX.

    2) apakah cara ini bisa dilakukan untuk beda versi Oracle??
    Misalnya dari oracle 9i ke 11g.

    Thanks.

    Wira

Leave a Reply

Your email address will not be published. Required fields are marked *