Pages

3 Şubat 2011 Perşembe

Farklı platformlar arasında Oracle veritabanını taşıma

Aynı endian formatına sahip işletim sistemleri arasında Oracle veritabanını tümüyle taşımak Oracle 10g R2 sürümünden itibaren gerçekleştirilebilmektedir. Örneğin, Windows platformunda çalışıp performans sıkıntısı yaşadıktan sonra Linux’a geçiş yapmak isteyenler için oldukça basit ve hızlı bir çözüm olmaktadır. Bunun yanında, benimde kısa zaman once başıma gelen,  kurumsal enterprise anlaşmalarında üretici firma değişikliği sonucunda, donanım ve işletim sistemlerinin radikal olarak değiştiği durumlarda Oracle DBA lere gerçekten  faydalı ve kestirme çözümler sunmakta.

Tabii, burada unutulmaması gereken en önemli nokta hedef ve kaynak işletim sistemlerinin aynı debian formatında olmasıdır. Farklı olduğu durumda taşınabilir tablespace metodunu kullanmak gerekecektir. Her iki platformun atnı debian formatında olup olmadığını  anlamak için V$TRANSPORTABLE_PLATFORM görünümüne sorgu çekmek yeterli olacaktır.

Senaryomuz gereği Windows 2003-32 bit platformdan Linux x86-64 bit platformuna  Oracle 10g R2 veritabanının nasıl taşınacağını adım-adım inceleyelim.

İlk aşamada DBMS_TDB.CHECK_DB prosedürü çalıştırılarak veritabanının hedef platforma taşınmasının mümkün olup olmadığının anlaşılması gerekecektir.Bu prosedürü çalıştırmadan once veritabanını Windows sunucuda READ ONLY modda yeniden başlatıyoruz.

SQL> set serveroutput on
SQL> declare
       2 db_ready boolean;
       3 begin
       4 db_ready := dbms_tdb.check_db('Linux 64-bit for AMD',dbms_tdb.skip_readonly);
       5 end;
       6 /

PL/SQL procedure successfully completed.

Eğer zaten aynı endian formatında olmayan bir platforma taşınabilirliği test etmek isterseniz aşağıdaki gibi hata mesajıyla karşılaşırsınız.

SQL>declare
      2 db_ready boolean;
      3 begin
       4 db_ready := dbms_tdb.check_db('Solaris[tm] OE
 (64-bit)',dbms_tdb.skip_readonly);
      5 end;
    6 /

The specified target platform name 'Solaris[tm] OE (64-bit)' is invalid or the target platform is not transportable.
PL/SQL procedure successfully completed.

Ardından taşınması gerçekleşmeyecek herhangi bir harici tablo, dizin veya BFILE olup olmadığını kontrol etmek için kaynak sunucuda DBMS_TDB.EXTERNAL_CHECK prosedürünü çalıştırıyoruz.

SQL> declare
       2 external boolean;
       3 begin
       4 external := dbms_tdb.check_external;
       5 end;
       6  /

The following directories exist in the database:
SYS.DATA_PUMP_DIR

Kontrol işleminin ardından RMAN üzerinde CONVERT DATABASE komutunu çalıştırıyoruz.

RMAN> CONVERT DATABASE NEW DATABASE 'orcl'
           2> transport script 'C:\temp\transportscript'
           3> to platform 'Linux IA (64-bit)'
           4> db_file_name_convert 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\'
          'C:\temp\ORCL\';

Yukardaki örnekte C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL veri dosyalarının bulunduğu dizin,C:\temp\ORCL\ ise dönüşümden sonra veri dosyalarının yer aldığı dizinlerdir. Veritabanı dönüşüm işlemi tamamlandıktan sonra kaynak sunucuda READ_WRITE modda açabilirsiniz.

Starting convert at 01/FEB/11
using channel ORA_DISK_1

Directory SYS.DATA_PUMP_DIR found in the database

User SYS with SYSDBA and SYSOPER privilege found in password file
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00001
name=C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF

converted datafile=C:\TEMP\ORCL\SYSTEM01.DBF
channel ORA_DISK_1: datafile conversion complete, elapsed time:
00:00:25
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00003
name=C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF

converted datafile=C:\TEMP\ORCL\SYSAUX01.DBF
channel ORA_DISK_1: datafile conversion complete, elapsed time:
00:00:27
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00002
name=C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF

converted datafile=C:\TEMP\ORCL\UNDOTBS01.DBF
channel ORA_DISK_1: datafile conversion complete, elapsed time:
00:00:25
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00004
name=C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
converted datafile=C:\TEMP\ORCL\USERS01.DBF
channel ORA_DISK_1: datafile conversion complete, elapsed time:
00:00:08
Run SQL script C:\TEMP\TRANSPORTSCRIPT.sql on the target platform to create
database

Edit init.ora file C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\INIT_00I2I4PR_1_0.ORA.
This pfile will be used to create the database on the target platform
To recompile all PL/SQL modules, run utlirp.sql and utlrp.sql on the
target platform
To change the internal database identifier, use DBNEWID Utility
Finished backup at 01/FEB/11


C:\TEMP\ dizininde oluşturulan TRANSPORTSCRIPT.sql içerisinde veri dosyalarının lokasyon bilgileri kaynak Windows makine, hedefte Linux makine olduğundan dolayı ilgili Linux dizin yapısına uygun olacak şekilde değiştirilmelidir.

Daha sonrasında  Linux platformunda $ORACLE_HOME/dbs dizini altında aşağıdaki parametrelerin yeraldığı bir init.ora dosyası oluşturuyoruz. Benim dosya ismim initORCL.ora olmaktadır.

control_files = "/u01/oradata/orcl/control01.ctl"
instance_name = "orcl"
plsql_native_library_dir = "/tmp/convertdb/plsqlnld1"
db_name = "orcl"
sga_max_size = 4294967296
compatible='10.2.0'

init.ora dosyasını oluşturduktan sonra boştaki instance’a bağlanıyoruz ve bu oluşturduğumuz pfile dosyasını işaret ederek NOMOUNT modda veritabanını başlatıyoruz.

$ sqlplus / as sysdba

SQL> startup nomount pfile='/u01/oradata/ORCL/initORCL.ora'

Windows üzerindeki oluşturulan transportcript dosyasını Linux platforma taşıyor ve  burda çalıştırıyoruz.

SQL> @transportscript.sql

Total System Global Area 201326592 bytes
Fixed Size 1218484 bytes
Variable Size 67110988 bytes
Database Buffers 125829120 bytes
Redo Buffers 7168000 bytes

Control file created.

Database altered.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Your database has been created successfully!
* There are many things to think about for the new database. Here
* is a checklist to help you stay on track:
* 1. You may want to redefine the location of the directory objects.
* 2. You may want to change the internal database identifier (DBID)
*
or the global database name for this database. Use the
*
NEWDBID Utility (nid).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Database closed.
Database dismounted.
ORACLE instance shut down.
ORACLE instance started.

Total System Global Area 201326592 bytes
Fixed Size 1218484 bytes
Variable Size 67110988 bytes
Database Buffers 125829120 bytes
Redo Buffers 7168000 bytes

Database mounted.

Database opened.

Aşağıda bu transcript.sql dosyasının içeriği yer almaktadır. Çalıştırmadan once ilgili instance lokasyonlarını değiştirebilirsiniz. Taşıma sonrasında redo log dosyaları ve geçici tablepsace taşınmadığından dolayı redo loglar bu transportscript.sql dosyası içerisinde tanımlıdır.

CREATE CONTROLFILE REUSE SET DATABASE "orcl" RESETLOGS
ARCHIVELOG    
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/oradata/orcl/redo01.ora’ SIZE 50M,
GROUP 2 '/u01/oradata/orcl/redo02.ora’ SIZE 50M,
GROUP 3 '/u01/oradata/orcl/redo03.ora’ SIZE 50M
DATAFILE
'/u01/oradata/orcl/SYSTEM01.DBF',
'/u01/oradata/orcl/UNDOTBS01.DBF',
'/u01/oradata/orcl/SYSAUX01.DBF',
'/u01/oradata/orcl/USERS01.DBF'
CHARACTER SET WE8MSWIN1252;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;

Bunun yanında geçici tablespace ait veri dosyası taşınmadığından, en son olarak manuel olarak oluşturulmalıdır.

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oradata/orcl/TEMP01.DBF'
SIZE 100M AUTOEXTEND ON NEXT 655360 MAXSIZE 2000M;

Transcript.sql dosyası çalıştırıldıktan sonra veritabanı OPEN modda açılmış olacaktır. Kontrol dosyası oluşturulduktan sonra hem veri dosyalarındaki hemde başlıklarındaki en son checkpoint SCN yi görmek ve eşit olduklarını görmek için için alttaki komutu çalıştırıyoruz.

SQL> select distinct checkpoint_change# from v$datafile;

CHECKPOINT_CHANGE#
--------------------
1832841

SQL> select distinct checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
--------------------
1832841

Taşıma işleminin sonunda Linux platformda veritabanının durumunu kontrol ediyoruz.

SQL> select name, open_mode from v$database;

NAME       OPEN_MODE
---------       ------------------
ORCL         READ WRITE

1 yorum:

  1. Merhaba Ugur. Iyi bir blogun var, tebrik ederim. Benim Database Migration konusunda bir video tutorial-im var, istersen asaqidaki linkden baka bilirsin:

    http://kamranagayev.wordpress.com/2010/08/20/rman-convert-database-video-tutorial/

    Basarilar!

    Kamran Agayev A.

    YanıtlaSil