Memindahkan Oracle DB File
Salah satu komponen dari Oracle Database adalah “datafile”. Pengertian sederhana dari datafile adalah kumpulan berkas tempat menyimpan semua database object. Contoh database object antara lain adalah tables
, indexes
, constraints
, packages
, sequences
, dsb. Ada juga yang menyebut datafile sebagai “DB File”. Datafile umumnya menggunakan file extension *.dbf
, seperti contoh berikut ini :
[oracle@svn ~]$ ls -tlr /oracle/database/oradata/SVN/*dbf -rw-r----- 1 oracle oinstall 30416896 Oct 12 02:05 /oracle/database/oradata/SVN/temp01.dbf -rw-r----- 1 oracle oinstall 5251072 Oct 12 02:06 /oracle/database/oradata/SVN/users01.dbf -rw-r----- 1 oracle oinstall 104865792 Oct 12 02:06 /oracle/database/oradata/SVN/example01.dbf -rw-r----- 1 oracle oinstall 713039872 Oct 12 02:07 /oracle/database/oradata/SVN/system01.dbf -rw-r----- 1 oracle oinstall 104865792 Oct 12 02:07 /oracle/database/oradata/SVN/undotbs01.dbf -rw-r----- 1 oracle oinstall 524296192 Oct 12 02:07 /oracle/database/oradata/SVN/sysaux01.dbf [oracle@svn ~]$
Meskipun demikian Oracle Database tidak serta merta menulis data ke dalam datafile. Semua datafile tersebut disusun secara logical dalam bentuk tablespace. Sebuah tablespace dapat tersusun dari beberapa datafile sekaligus. Bila tablespace sudah kehabisan ruang kosong, kita bisa menambahkan datafile yang baru untuk memperluas tablespace. Di dalam tablespace inilah semua database object disimpan. Komponen Oracle Database lainnya adalah controlfile. Kalau datafile digunakan untuk menyimpan data, controlfile bertugas menyimpan informasi struktur fisik database. Misalnya database name, lokasi datafile, lokasi dari redolog, dsb.
Selain datafile & controlfile, Oracle Database memiliki komponen penting lainnya yaitu initialization parameters file. Saat pertama kali dihidupkan, Oracle Database akan membaca parameter-parameter yang disimpan oleh initialization parameters file tersebut. Salah satu parameter yang dibaca adalah lokasi tempat controlfile berada. Oracle Database memiliki 2 jenis initialization parameters file : SPFILE atau PFILE. PFILE adalah berkas teks biasa yang bisa dimodifikasi dengan editor teks seperti vi
atau Notepad (di Windows). Sementara SPFILE adalah berkas binary yang hanya bisa dimodifikasi oleh Oracle Database melalui perintah SQL. Baik SPFILE maupun PFILE biasanya disimpan dalam direktori $ORACLE_HOME/dbs
.
Relasi antara initialization parameters file, datafile, dan controlfile gampangnya seperti ini :
- Oracle DB membaca SID (System ID) dari environment variable.
- Oracle DB mencari PFILE/SPFILE yang bersesuaian dengan SID tadi. Biasanya nama berkas PFILE & SPFILE adalah
init<SID>.ora
atauspfile<SID>.ora
(contoh : misalnya SID = ORCL, maka PFILE akan menggunakan namainitORCL.ora
). - Oracle DB membaca PFILE (atau SPFILE) tersebut untuk mengetahui lokasi controlfile.
- Oracle DB lalu membaca controlfile untuk mengetahui datafile mana saja yang menyusun database.
- Barulah Oracle DB bisa mengakses semua datafile dan menyiapkan semua database object.
Berikut ini adalah catatan pribadi saya tentang cara memindahkan datafile & controlfile
ke lokasi yang baru :
- Pertama saya mencari tahu dulu di mana datafile & controlfile yang digunakan oleh database. Cara paling mudah adalah dengan melihat tabel
v$controlfile
&v$datafile
seperti contoh berikut ini :[oracle@svn ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Sun Oct 12 02:08:23 2014 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> COLUMN NAME FORMAT A60 SQL> SELECT NAME FROM V$CONTROLFILE; NAME ------------------------------------------------------------ /oracle/database/oradata/SVN/control01.ctl /oracle/database/flash_recovery_area/SVN/control02.ctl SQL> SELECT NAME FROM V$DATAFILE; NAME ------------------------------------------------------------ /oracle/database/oradata/SVN/system01.dbf /oracle/database/oradata/SVN/sysaux01.dbf /oracle/database/oradata/SVN/undotbs01.dbf /oracle/database/oradata/SVN/users01.dbf /oracle/database/oradata/SVN/example01.dbf SQL>
Dari hasil perintah SQL tersebut saya paham ada beberapa berkas pada 3 direktori yang perlu dipindahkan :
/oracle/database/oradata/SVN
: berisi controlfile #1./oracle/database/flash_recovery_area/SVN
: berisi controlfile #2./oracle/database/oradata/SVN/
: berisi datafile.
- Untuk memeriksa initialization parameters file yang sedang digunakan oleh Oracle Database saya bisa menggunakan perintah berikut ini :
SQL> SHOW PARAMETER SPFILE NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ spfile string /oracle/database/11.2.0/server /dbs/spfileSVN.ora SQL>
Dalam contoh ini database saya menggunakan berkas
/oracle/database/11.2.0/server/dbs/spfileSVN.ora
sebagai initialization file-nya. - Sebelum mulai memindahkan datafile & controlfile saya siapkan dulu direktori baru untuk menyimpan berkas-berkas tadi. Misalnya saya ingin pindahkan semua datafile dan controlfile ke dalam direktori
/oracle/database/oradata_NEW/SVN
:[oracle@svn ~]$ cd /oracle/database [oracle@svn ~]$ mkdir -p oradata_NEW/SVN [oracle@svn ~]$ chown -R oracle:oinstall oradata_NEW [oracle@svn ~]$
- Berikutnya saya perlu mengatur ulang database untuk memindahkan controlfile. Karena database-nya menggunakan SPFILE, saya perlu memodifikasi berkas SPFILE dengan perintah
ALTER SYSTEM
seperti berikut ini :SQL> ALTER SYSTEM SET CONTROL_FILES='/oracle/database/oradata_NEW/SVN/control01.ctl','/oracle/database/oradata_NEW/SVN/control02.ctl' SCOPE=SPFILE; System altered. SQL>
Hal tersebut berbeda bila database menggunakan PFILE. Bila database menggunakan PFILE & kita mencoba mengubah lokasi controlfile dengan perintah di atas akan muncul error seperti ini :
SQL> ALTER SYSTEM SET CONTROL_FILES='/oracle/database/oradata_NEW/SVN/control01.ctl','/oracle/database/oradata_NEW/SVN/control02.ctl'; ALTER SYSTEM SET CONTROL_FILES='/oracle/database/oradata_NEW/SVN/control01.ctl','/oracle/database/oradata_NEW/SVN/control02.ctl' * ERROR at line 1: ORA-02095: specified initialization parameter cannot be modified SQL>
Bila database kita menggunakan PFILE, maka cukup edit berkas
init.ora
untuk memodifikasi parametercontrol_files
seperti contoh berikut ini :[oracle@svn dbs]$ grep -i control initSVN.ora *.control_files='/oracle/database/oradata_NEW/SVN/control01.ctl','/oracle/database/oradata_NEW/SVN/control02.ctl' [oracle@svn dbs]$
- Setelah itu saya perlu mematikan database terlebih dulu :
SQL> SHUTDOWN IMMEDIATE; Database closed. Database dismounted. ORACLE instance shut down. SQL>
- Pada tahap ini saya bisa memindahkan semua berkas datafile & controlfile :
[oracle@svn ~]$ mv /oracle/database/oradata/SVN/control01.ctl /oracle/database/oradata_NEW/SVN/ [oracle@svn ~]$ mv /oracle/database/flash_recovery_area/SVN/control02.ctl /oracle/database/oradata_NEW/SVN/ [oracle@svn ~]$ mv /oracle/database/oradata/SVN/*dbf /oracle/database/oradata_NEW/SVN/ [oracle@svn ~]$
- Setelah semua berkas sukses dipindahkan, berikutnya saya bisa menyalakan kembali database. Pada tahap ini saya harus menyalakan database dengan mode
mount
saja.[oracle@svn ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Sun Oct 12 02:19:03 2014 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to an idle instance. SQL> STARTUP MOUNT; ORACLE instance started. Total System Global Area 1653518336 bytes Fixed Size 2213896 bytes Variable Size 973080568 bytes Database Buffers 671088640 bytes Redo Buffers 7135232 bytes Database mounted. SQL>
- Setelah database sudah dalam status mounted, sekarang saya perlu mengatur ulang database untuk mengganti nama setiap datafile dengan perintah “ALTER DATABASE RENAME FILE” seperti contoh berikut ini :
SQL> ALTER DATABASE RENAME FILE '/oracle/database/oradata/SVN/system01.dbf' TO '/oracle/database/oradata_NEW/SVN/system01.dbf'; Database altered. SQL> ALTER DATABASE RENAME FILE '/oracle/database/oradata/SVN/sysaux01.dbf' TO '/oracle/database/oradata_NEW/SVN/sysaux01.dbf'; Database altered. SQL> ALTER DATABASE RENAME FILE '/oracle/database/oradata/SVN/undotbs01.dbf' TO '/oracle/database/oradata_NEW/SVN/undotbs01.dbf'; Database altered. SQL> ALTER DATABASE RENAME FILE '/oracle/database/oradata/SVN/users01.dbf' TO '/oracle/database/oradata_NEW/SVN/users01.dbf'; Database altered. SQL> ALTER DATABASE RENAME FILE '/oracle/database/oradata/SVN/example01.dbf' TO '/oracle/database/oradata_NEW/SVN/example01.dbf'; Database altered. SQL>
Untuk memastikan semua controlfile & datafile pada lokasi yang baru, saya bisa memeriksanya dengan perintah berikut ini :
SQL> SELECT NAME FROM V$CONTROLFILE; NAME -------------------------------------------------------------------------------- /oracle/database/oradata_NEW/SVN/control01.ctl /oracle/database/oradata_NEW/SVN/control02.ctl SQL> SELECT NAME FROM V$DATAFILE; NAME -------------------------------------------------------------------------------- /oracle/database/oradata_NEW/SVN/system01.dbf /oracle/database/oradata_NEW/SVN/sysaux01.dbf /oracle/database/oradata_NEW/SVN/undotbs01.dbf /oracle/database/oradata_NEW/SVN/users01.dbf /oracle/database/oradata_NEW/SVN/example01.dbf SQL>
- Setelah itu barulah kita bisa mengganti mode database ke mode
open
(modeopen
maksudnya semua isi datafile bisa diakses kembali oleh user). Untuk memindahkan mode database dari modemount
keopen
saya gunakan perintah berikut ini ;SQL> ALTER DATABASE OPEN; Database altered. SQL>
Begitu kira-kira langkah yang saya gunakan untuk memindahkan datafile dan controlfile Oracle Database. Saya menggunakan Oracle Database 11g (Enterprise Edition Release 11.2.0.1.0) untuk membuat contoh langkah-langkah di atas. Oracle Database tersebut terpasang pada Oracle Linux 6.5. Semoga bermanfaat.