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:
- Membuat database baru, export dari database lama, kemudian import ke database baru.
- 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:
- Persiapkan (copy) init file. Contoh di sini, saya menggunakan UNIX. Di Windows, lokasi init file di %ORACLE_HOME%\database
cd $ORACLE_HOME/dbs
Misalkan content inittsrep.ora adalah berikut ini:
cp -rp initts2.ora inittsrep.ora
### Parameter ini perlu disesuaikan ###
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/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'
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' - 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 - 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
Edit file crdbtsrep.sql, buang “trace file entry”, hingga jadi seperti ini
cp ts2_ora_18762.trc /oradata/oracle/tsrep/crdbtsrep.sql
STARTUP NOMOUNT
Edit lagi file crdbtsrep.sql.
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
;
Ganti entry iniCREATE CONTROLFILE REUSE DATABASE "TS2" RESETLOGS ARCHIVELOG
Menjadi
CREATE CONTROLFILE SET DATABASE "TS2REP" RESETLOGS ARCHIVELOG
Sesuaikan 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
; - 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
Lihat tablespace yang perlu di backup
/oradata/oracle/ts2/system01.dbf
/oradata/oracle/ts2/temp01.dbf
/oradata/oracle/ts2/undotbs01.dbf
/oradata/oracle/ts2/users01.dbf
SQL> select distinct tablespace_name from dba_data_files;
TABLESPACE_NAME
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.
------------------------------
SYSTEM
USERS
SYSAUX
UNDOTBS1
SQL> archive log list
Jalankan BEGIN BACKUP pada tablespace-tablespace tersebut (Kalau cold backup, step ini diganti dengan shutdown database):
SQL> alter tablespace SYSTEM begin backup;
Copy datafile dan tempfile
SQL> alter tablespace USERS begin backup;
SQL> alter tablespace SYSAUX begin backup;
SQL> alter tablespace UNDOTBS1 begin backup;
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/tsrepSetelah 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 - 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 - 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
Selanjutnya, gunakan logfile di atas untuk recovery di database tsrepSetelah proses recovery berhasil, open database:
SQL> -- di database source (ts2)
SQL> select member from v$logfile where GROUP# in
(select GROUP# from v$log where SEQUENCE#=19);
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;
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 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
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
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’;
Mas, kalo init file nya menunjuk ke spfile bagaimana?
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)
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?
kayaknya untuk yg no archivelog step-step ini ngga berhasil deh
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
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.
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