Öncelikle expdp – impdp’ yi nerde ve ne zaman kullanabileceğimizden biraz bahsedelim, çok farklı nedenlerle kullanılabilmekle beraber en çok karşılaştığımız durumlar;
• Bir schema’ nın altındaki bir kısım veya tüm dataları farklı bir schema altına taşımak
istediğimizde,
• Oracle versiyonu değiştiğinde dataları taşımak için,
• Operating system değiştiğinde datayı taşımak için,
• Logical Backup almak istediğimizde
Bu yönteme sıklıkla başvururuz.
Export ve import işlemlerini nasıl yapılacağından, yapılan bu aktarım sonrasında işlemin hatasız gerçekleşip gerçekleşmediğinden ve bu işlemleri nasıl biraz daha performanslı yapabilirizden biraz bahsetmek istiyorum. Öncelikle expdp ve impdp’ da çok sık olarak kullanılan komutlara birer örnekle açıklamaya çalışalım sonrasında performansı artırmak için neler yapabiliriz ona bakalım.
Aşağıdaki örnekleri yaptığım test database’ im windows üzerinde idi, bu komutları linux ve benzeri ortamlarda çalıştırmak istediğinizde özellikle tırnak işaretleinden dolayı syntax hataları alabilirsiniz aklınızda olsun. Önreğin sys ile expdp almak istediğinizde syntax \”/ as sysdba\” olması gerekirken linuxda \’/ as sysdba\’ olmaktadır.
Komutlara geçmeden önce expdp – impdp kullanacak olan userlarda olması gereken yetkiler neler olmalı ondan bahsedelim. Export ve import işlemini yapacak olan userda EXP_FULL_DATABASE ve IMP_FULL_DATABASE yetkilerinin olması gerekmektedir. Eğer dba rolüne sahipse zaten default olarak her ikiye de sahip demektir. Bu yetkilerin olup olmadığı veya hangi userlarda bu yetkilerin olduğunu sorgulamak için aşağıdaki scripti kullanabiliriz ;
SELECT grantee, granted_role, default_role
FROM dba_role_privs
WHERE granted_role IN (‘DBA’, ‘EXP_FULL_DATABASE’, ‘IMP_FULL_DATABASE’)
ORDER BY 1,2;
Ben örneklerimde SYS userını kullandım ama siz istediğiniz user ile export – import işlemlerini yapabilirsiniz. Aşağıdaki komutlar sadece birer örnektir, bu komutlar içerisinde expdp’ ın veya impdp’ nın diğer parametlerini kullanarak çok farklı export – import kombinasyonları gerçekleştirebilirsiniz.
— full export alıp sonrasında schema bazlı import yapmak istersek ;
expdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_full_%u.dmp LOGFILE=expdp_full.log FULL=Y exclude=STATISTICS content=ALL parallel=8
impdp \’/ as sysdba\’ DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_full_%u.dmp LOGFILE=impdp_full.log parallel=8 ignore=Y
— schema bazlı full export alıp sonrasında schema bazlı import yapmak istersek ;
expdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_full_%u.dmp LOGFILE=expdp_full.log schemas=TEST,KAMIL exclude=STATISTICS content=ALL parallel=8
(birden fazla schemanın exportunu almak isterseniz)
expdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_full_%u.dmp LOGFILE=expdp_full.log schemas=TEST,KAMIL exclude=STATISTICS content=ALL parallel=8
impdp \’/ as sysdba\’ DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_full_%u.dmp LOGFILE=impdp_full.log SCHEMAS=TEST parallel=8 ignore=Y
(test userı import edilecek database’ de olmadığında expdp import öncesi create edecektir)
impdp \’/ as sysdba\’ directory=data_pump_dir dumpfile=exp_schemas.dmp logfile=imp_schemas.log schemas=(TEST,TEST2,TEST3)
— schema bazlı alınan exportu farklı bir schema altına import etmek istersek ;
expdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_full_%u.dmp LOGFILE=expdp_full.log schemas=TEST exclude=STATISTICS content=ALL parallel=8
impdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_full_%u.dmp LOGFILE=impdp_full.log remap_schema=TEST:KAMIL parallel=8 ignore=Y
— schema bazlı alınan exportu, farklı bir tablespace altına import etmek istersek ;
expdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_full_%u.dmp LOGFILE=expdp_full.log schemas=TEST exclude=STATISTICS content=ALL parallel=8
impdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_full_%u.dmp LOGFILE=impdp_full.log REMAP_TABLESPACE=users:dbadata parallel=8 ignore=Y
— Tablo bazında export ve import işlemi ;
expdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=table_full_%u.dmp LOGFILE=expdp_table.log tables=test.test exclude=STATISTICS parallel=8
(birden fazla tablo olduğunda)
expdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=table_full_%u.dmp LOGFILE=expdp_table.log tables=test.test,kamil.test exclude=STATISTICS parallel=8
impdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=table_full_%u.dmp LOGFILE=impdp_table.log tables=kamil.test TABLE_EXISTS_ACTION=TRUNCATE parallel=8
(birden fazla tablo olduğunda)
impdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=table_full_%u.dmp LOGFILE=impdp_table.log tables=kamil.test,test.test TABLE_EXISTS_ACTION=TRUNCATE parallel=8
— exportu network link üzerinden almak istersek ;
expdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_full_%u.dmp LOGFILE=expdp_full.log FULL=Y NETWORK_LINK=PROD_TO_TEST exclude=STATISTICS parallel=8
— export içerisindeki DDL komutlarını sqlfile’ e çıkartmak istersek ;
impdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=EXPDP_NOROWS_%u.dmp LOGFILE=expdp_norows.log SQLFILE=sqlfile.sql
— export alınırken oluşacak dmp filelerin boyutlarını sınırlandırmak için ;
expdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_full_%u.dmp LOGFILE=expdp_full.log exclude=STATISTICS filesize=2048M parallel=8 full=Y
— expdp ile no_rows export almak istersek ;
expdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_norows_%u.dmp LOGFILE=expdp_norows.log parallel=8 content=METADATA_ONLY full=Y
(alınan bu no_rows export içerisindeki TEST schemasına ait tüm metadatayı farklı bir schema altına dönmek istersek, bu örnekde DENEME scheması altına döneceğiz, deneme schemasıda database’ de import öncesinde yok)
impdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_norows_%u.dmp LOGFILE=expdp_norows.log parallel=8 schemas=TEST remap_schema=TEST:DENEME
— export alırken package, function ve triggerları gibi nesneleri exclude etmek istersek ;
expdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_exclude_%u.dmp LOGFILE=expdp_exlude.log schemas=TEST exclude=FUNCTION,PROCEDURE,TRIGGER parallel=8
impdp \”/ as sysdba\” DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_exclude_%u.dmp LOGFILE=impdp_exclude.log parallel=8 schemas=test TABLE_EXISTS_ACTION=REPLACE
— export alırken bir tablonun sadece belirli bir bölümünü almak istersek ;
expdp \”/ as sysdba\” DIRECTORY=DATA_PUMP_DIR DUMPFILE=expdp_query.dmp LOGFILE=expdp_query.log SCHEMAS= KAMIL QUERY= kamil.test:”WHERE owner = ‘SYS’ ”
— exportu compress almak istersek ;
expdp \’/ as sysdba\’ DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_full_%u.dmp LOGFILE=expdp_full.log FULL=Y COMPRESSION=ALL
— VERSION Parametresi ile eski bir oracle versiyonundan daha yeni bir oracle versiyonuna data taşımak istersek;
(Örneğin 10.2.0.1 versiyonlu bir database’ den 11.2 olan bir database’ e verş taşımak istediğimizde …)
expdp \’/ as sysdba\’ DIRECTORY= DATA_PUMP_DIR DUMPFILE=expdp_full_%u.dmp LOGFILE=expdp_full.log FULL=Y exclude=STATISTICS content=ALL parallel=8 VERSION=11.2.0.1
yukarıdaki örneklerin bir kısmında kullanmış olduğumuz bazı parametrelere daha detaylı bakalım ;
CONTENT ;
Default değeri ALL olarak gelmektedir. 3 farklı değişken alabilir;
ALL = Tüm data ve metadatanın exportunu alır.
DATA_ONLY = Sadece datanın exportunu alır, metadatayı export etmez.
METADATA_ONLY = Sadece metadatanın exportunu alır, datayı export etmez.
EXCLUDE ;
Bu parametre ile export alınırken belli bir object type’ ını, schemayı, triggerları, constraintleri … hariç tutabilirsiniz.
EXCLUDE=FUNCTION
EXCLUDE=PROCEDURE
EXCLUDE=PACKAGE
EXCLUDE=SCHEMA:”= ‘HR'”
INCLUDE ;
Exculde’ ın tam tersi olarak düşünülebilir.
INCLUDE=FUNCTION
INCLUDE=PROCEDURE
INCLUDE=PACKAGE
SQLFILE ;
Exportun içerisindeki istenilen bir kısım işlemlerin dışarıya bir txt file çıkartılmasını sağlar.
SQLFILE=dpump_dir2:expfull.sql
TABLE_EXISTS_ACTION ;
Table_exist_action parametresi, importu yapılmak istenen tablo eğer import öncesinde import edilecek schemada var ise, impdp’ ın bu tablolar için özel bir aksiyon almasını isteyebilirsiniz. 4 farklı değer alabilir ;
APPEND = var olan tabloya dokunmadan importtaki verileri de bu tabloya ekler,
REPLACE = var olan tabloyu importun içerisindeki tablo ile ezer,
SKIP = o tablo için hiçbir işlem yapmadan geçer, (default değeri skip’ dir)
TRUNCATE = var olan truncate ederek export içerisindeki veriyi import ederek devam eder.
FILESIZE ;
Filesize parametresi, export süresince oluşacak olan her bir dmp file’ in alabileceği maxiumum size değeri belirtebilirsiniz.
COMPRESSION
Export sırasında oluşacak olan dmp file’ in compres edilmiş olarak oluşmasını sağlar ve diskde yer problemi olan sistemlerde kullanılabilir. Export alırken neleri compres etmek istediğinizi belirtebilirsiniz;
ALL= Tüm backup compres olarak alınır,
DATA_ONLY= Sadece Datayı compres eder,
METADATA_ONLY= Sadece metadatayı compres eder
NONE= Hiçbirşeyi compres etmez ki, zaten defaultu bu değerdir, yani expdp komutunda bu parametre kullanımadığında compression yapılmaz.
Compress parametresinde oracle versiyonu önemlidit. Oracle 10.2′ de sadece METADATA_ONLY opsiyonu geçerli iken 11g ile birlikte ALL ve DATA_ONLY opsiyonlarıda gelmiştir.
VERSION ;
Versiyon parametresi export edilecek olan datanın veritabanı sürümünü ifade eder.
3 farklı şekilde kriter alabilir.
COMPATIBLE= Varsayılan değeridir. Veritabanı sürümü 9.2 ve daha üst versiyonlarda kullanılabilir.
LATEST= Metadata versiyonu, database versiyonuna karşılık gelir.
VERSIO_STRING= Spesifik olarak database versiyonunu belirtir.
Daha yüksek bir sürümden, daha düşük bir versiyondaki sürüme ait export alabilmek için version parametresi kullanılamaz. Çünkü oracle üst sürümden alt sürümlere expdp-impdp destekler. Yani 11.2′ den bir exportu 10.2′ ye import edebilirsiniz.
Bununla ilgili başka bir örnek; Oracle 10.1 database’inden version parametresi=11.1 verilerek alınan bir backupı 10.2 olan bir database’ e import edemezsiniz. Üst sürüme geçerken hangi versiyonda kullanılacak iseniz ona göre version parametresini tanımlamanız gerekmektedir. Aksi takdirde aşağıdaki gibi hata alırsınız;
ORA-39001: invalid argument value
ORA-39000: bad dump file specification
ORA-39142: incompatible version number 2.1 in dump file “D:\oracle\expdp\full_test.dmp”
EXPDP ile export almadan önce (ki aynı durum impdp ile import yapmadan öncede geçerlidir) exportun alınacağı directory’nin tanımlanması gerekmektedir. İmport işleminde de bu dizin import dosyasının okunacağı dizin olacağından bu işlemin yapılması mutlaka gerekmektedir. Aşağıdaki komut ile kullanacağımız directory’ imizi create ediyoruz. (öncesinde OS komutları ile dizinin oluşturulması gerektiğini unutmayınız)
CREATE OR REPLACE DIRECTORY DATA_PUMP_DIR AS ‘D:\oracle\expdp’;
Sonra oluşturmuş olduğumuz bu dizine exportu hangi user ile alacaksak o user için okuma ve yazma hakkı veriyoruz;
GRANT READ,WRITE ON DIRECTORY expdp TO export_user;
Aşağıdaki select sorgusu ile create etmiş olduğumuz directory’ imizi görüyor olmamız gerekiyor.
SELECT directory_path FROM dba_directories
Yine önemli bir nokta kimi export – import operasyonlarında character settinglerinin farklılıklarından dolayı türkçe karakter problemleri yaşanabilmektedir. Bu tarz problemlerin önüne geçmek için mutlaka database’ inizin nls_lang ve nls_characterset değerlerini set etmemiz gerekmektedir;
export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
export NLS_NCHAR_CHARACTERSET=WE8ISO8859P1
Windows ortamlar için ;
Set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
Set NLS_NCHAR_CHARACTERSET=WE8ISO8859P1
Export ve import esnasında Parallellik parametresi kullanılırken sunucunun işlemci sayısına dikkat edilmelidir. Parallellik sayısı = işlemci sayısı *2 ‘yi geçmemelidir.
Export – import’ da compress veya encription gibi parametreleri kullanmayı seçiyor iseniz, bu tarz operasyonlar export – import işlemlerinde fazladan yani ek olarak bir takım processler olduğundan dolayı performans anlamında bir miktar kayıplar yaşanabileceğini hatırlatmakdafayda var. Yani bunları etkileyen bir sürü kriter olduğu için bu bilgiler ışığında ne kadarlık bir kayıpdan bahsettiğimizi söylememiz çok güç olacaktır. Bunu tespit etmenin en güzel yöntemi her iki yöntemide test edip aradaki farkları görmek olacaktır.
Komut satırında expdp için; expdp HELP=Y ,
impdp için; impdp HELP=Y
yazdığınızda size kullanabileceğiniz tüm parametrelerin bir listesi gelecektir. Dolayısıyla parametre isimlerini ezberlemenize gerek yoktur.
Expdp parametreleri ; expdp HELP=Y ;
Keyword Description (Default)
USERID username/password
BUFFER size of data buffer
FILE output files (EXPDAT.DMP)
COMPRESS import into one extent (Y)
GRANTS export grants (Y)
INDEXES export indexes (Y)
DIRECT direct path (N)
LOG log file of screen output
ROWS export data rows (Y)
CONSISTENT cross-table consistency(N)
FULL export entire file (N)
OWNER list of owner usernames
TABLES list of table names
RECORDLENGTH length of IO record
INCTYPE incremental export type
RECORD track incr. export (Y)
TRIGGERS export triggers (Y)
STATISTICS analyze objects (ESTIMATE)
PARFILE parameter filename
CONSTRAINTS export constraints (Y)
OBJECT_CONSISTENT transaction set to read only during object export (N)
FEEDBACK display progress every x rows (0)
FILESIZE maximum size of each dump file
FLASHBACK_SCN SCN used to set session snapshot back to
FLASHBACK_TIME time used to get the SCN closest to the specified time
QUERY select clause used to export a subset of a table
RESUMABLE suspend when a space related error is encountered(N)
RESUMABLE_NAME text string used to identify resumable statement
RESUMABLE_TIMEOUT wait time for RESUMABLE
TTS_FULL_CHECK perform full or partial dependency check for TTS
TABLESPACES list of tablespaces to export
TRANSPORT_TABLESPACE export transportable tablespace metadata (N)
TEMPLATE template name which invokes iAS mode export
Impdp Parametreleri ; impdp HELP=Y
Keyword Description (Default)
USERID username/password
BUFFER size of data buffer
FILE input files (EXPDAT.DMP)
SHOW just list file contents (N)
IGNORE ignore create errors (N)
GRANTS import grants (Y)
INDEXES import indexes (Y)
ROWS import data rows (Y)
LOG log file of screen output
FULL import entire file (N)
FROMUSER list of owner usernames
TOUSER list of usernames
TABLES list of table names
RECORDLENGTH length of IO record
INCTYPE incremental import type
COMMIT commit array insert (N)
PARFILE parameter filename
CONSTRAINTS import constraints (Y)
DESTROY overwrite tablespace data file (N)
INDEXFILE write table/index info to specified file
SKIP_UNUSABLE_INDEXES skip maintenance of unusable indexes (N)
FEEDBACK display progress every x rows(0)
TOID_NOVALIDATE skip validation of specified type ids
FILESIZE maximum size of each dump file
STATISTICS import precomputed statistics (always)
RESUMABLE suspend when a space related error is encountered(N)
RESUMABLE_NAME text string used to identify resumable statement
RESUMABLE_TIMEOUT wait time for RESUMABLE
COMPILE compile procedures, packages, and functions (Y)
STREAMS_CONFIGURATION import streams general metadata (Y)
STREAMS_INSTANITATION import streams instantiation metadata (N)
Export operasyonunu tun etmek istersek bu konuda aşağıdaki adımları yapabiliriz ;
• Parallel_max_server parametresini (eğer 0 ise) işlemci sayısı da dikkate alınarak daha yüksek bir değere set edilebilir;
alter system set parallel_max_servers=32 scope=Memory;
export işlemi sonrasında ;
alter system set parallel_max_servers=0 scope=Memory;
• İstatistik toplayan job export bitene kadar disable edilebilir.
İmport operasyonunu tun etmek istersek de aşağıdaki işemleri yapabiliriz;
• Aşağdıdaki parametreleri belirtildiği şekilde set edebiliriz;
DISK_ASYNCH_IO=TRUE,
DB_BLOCK_CHECKING=FALSE,
DB_BLOCK_CHECKSUM=FALSE.
• Aşağıdaki parametrelerin değerlerini artırabiliriz;
PROCESSES,
SESSIONS,
PARALLEL_MAX_SERVERS,
SHARED_POOL_SIZE,
UNDO_TABLESPACE
• PGA size’ ı burada çok önemli olduğu için ayrıca belirtmek istedim.
Aşağıdaki sorgu ile kontrol edip, import bitene kadar artırabiliriz.
select a.ksppinm name, b.ksppstvl value
from sys.x$ksppi a,sys.x$ksppcv b
where a.indx = b.indx and a.ksppinm=’_pga_max_size’;
alter system set “_pga_max_size”=5368709120 scope=both
• Redologların size’ ını artırabiliriz.
• resumable_timeout parametresi önemli import işlemi sırasında disk doluluğu gibi bir surumla karşılaşıldığında importun kesilmesini önlemek ve bir süreliğine suspend etmek isteyebiliriz;
alter system set resumable_timeout = 14400 scope=both;
İmport sonrasında,
• Export alınan sistemdeki objeler ile import işleminin yapıldığı ortamdaki nesne sayıları, valid / invalid nesne kontrollerini yapmakda fayda vardır. Bunu yaparkende kolaylık olması açısından yapabiliyorsak exportu alınan db ile import işlemi yapılan db arasına dblink create edilir ise tek ortamdan çalıştırılacak script ile aşağıdaki aşağıdaki kontrolleri yapabiliriz.
— user kontrol
select username from dba_users
minus
select username from dba_users@import_yapılan_ortam
— object kontrol
select owner, object_type, count(*) from dba_objects
where owner = ‘TEST’
group by owner, object_type
minus
select owner, object_type, count(*) from dba_objectsdba_users@import_yapılan_ortam
where owner = ‘TEST’
group by owner, object_type
— valid / invalid nesne kontrol
select * from dba_objects
where status <> ‘VALID’
minus
select * from dba_objects@import_yapılan_ortam
where status <> ‘VALID’
— dblink kontrolü
select * from all_db_links
minus
select * from all_db_links@import_yapılan_ortam
• Her iki database’ dede job_queue_process değeri kontrol edilmelidir. Bir data migration çalışması yapılıyor ise bu değerin export öncesindede ‘0’ a çekilmesi uygun olacaktır.
• İmport sonrasında yaşanabilecek performans problemlerine karşı, sql profile’ ler yedeklenmelidir.
Select * from dba_sql_profiles;
• İmport sonrasında tüm database için istatistik toplama işi yapılmalıdır.
Datapump ile yapmış olduğumuz bütün bu operasyonları DBA_DATAPUMP_JOBS, USER_DATAPUMP_JOBS ve DBA_DATAPUMP_SESSIONS viewlerinden izleyebiliriz.
Export işlemi ile ilgili herhangi bir problem ile karşılaştığınızda exportun nerede kaldığını daha doğrusu nerede takıldığını öğrenmek isterseniz, trace alıp inceleyebilirsiniz. Trace’ i alabilmek ihtiyacınız olan bilgilere aşağıdaki script ile ulaşabilirsiniz;
SELECT TO_CHAR (SYSDATE, ‘YYYY-MM-DD HH24:MI:SS’) “DATE”,
s.program,
s.sid,
s.status,
s.username,
d.job_name,
p.spid,
s.serial#,
p.pid,
s.blocking_session,
s.last_call_et
FROM v$session s, v$process p, dba_datapump_sessions d
WHERE p.addr = s.paddr AND s.saddr = d.saddr;
Son olarak expdp ve impdp’ ın performancı ile ilgili olarak yayınlanmış bir dizi bug vardır. Dolayısıyla bu tarz bir problemle karşılaşırsanız metalinkdeki 453895.1 id’ li dökümana mutlaka bakmanızı öneririm.
Datapump kullanımı ve özellikleri ile ilgili olarak daha detaylı olarak bilgi edinmek isterseniz aşağıdaki döküman işinizi görecektir ;
http://download.oracle.com/docs/cd/E14072_01/server.112/e10701.pdf