Change Font Size

Change Screens

Change Profile

Change Layouts

Change Direction

Change Menu Styles

Cpanel
Tarihe göre etiket öğelerini görüntüle: taşımak
Çarşamba, 27 Ekim 2010 13:03

Tabloları bir Schema’dan Diğerine Taşımak

Oracle’da tabloları (ve diğer objeleri) bir tablespace’den diğerine taşımak için komut olmasına rağmen, taboları bir schemadan diğerine taşımak her hangi bir komut yok. Eğer tabloları schemalar arasında taşımak istiyorsanız şu yöntemleri kullanabilirsiniz:
1) CREATE TABLE komutu ile tablonun bir kopyasını oluşturabilirsiniz:
SQL> CREATE TABLE gokhan.employees AS SELECT * FROM hr.employees;
Eğer tablonuzda çok fazla sayıda kayıt varsa, bu işlemi hızlandırmak için ilk başta tablonun yapısını oluşturup daha sonra /*+ APPEND */ ve NOLOGGING ile hızlandırılmış INSERT yapabilirsiniz.
SQL> CREATE TABLE gokhan.employees AS SELECT * FROM hr.employees WHERE 1=0;
SQL> INSERT /*+ APPEND */ INTO gokhan.employees SELECT * FROM hr.employees NOLOGGING;
Bu yöntem tablo üzerindeki indexleri, (constraint) kısıtları, triggerları kopyalamayacaktır. Bunları eklemek için exp/imp veya datapump araçlarını kullanabilirsiniz.
# exp system/password file=kopya.dmp tables=HR.EMPLOYEES rows=N
# imp system/password file=kopya.dmp fromuser=HR touser=GOKHAN ignore=Y
2) INSERT ile uğraşmadan direk olarak exp/imp kullanabilirsiniz. Bu yöntem daha pratik olmasına karşın INSERT kullanımından daha yavaş olacaktır.
# exp system/password file=kopya.dmp tables=HR.EMPLOYEES
# imp system/password file=kopya.dmp fromuser=HR touser=GOKHAN
imp/exp ve DataPump (impdp, expdp) kullanımını başka bir yazıda daha ayrıntılı anlatacağım için burada detaya girmeyeceğim. araçlarlar ile schemalar arasında tabloları tek tek kopyalamak yerine bir schema’daki bütün objeleri başka schemaya aktarabilirsiniz. imp/exp için:
# exp system/password file=kopya.dmp owner=HR
# imp system/password file=kopya.dmp fromuser=HR touser=GOKHAN
3) Her iki yöntem de, bir schemadan diğerine kayıtları SQL sorguları ile aktardığı için, yüzmilyonlarca kayıdın olduğu tablolarda bu işlemler yavaş olabilir. Eğer Oracle Enterprise Server kulanıyorsak, yani veritabanı sunucumuz partitionları destekliyorsa, taşıma işini daha hızlı yapabilmek için “partition exchange” yöntemini kullanabiliriz. Bu yöntemi bir örnek ile açıklayım. Diyelim ki HR.employees tablosunu GOKHAN schemasına taşıyamak istiyoruz. Sisteme SYS veya DBA rolü olan bir kullanıcı ile bağlanıp, kaynak tablomuzun bir partitioned, bir de partitioned olmayan kopyasını oluşturalım:
SQL> CREATE TABLE gokhan.gecici PARTITION BY RANGE( employee_id) ( PARTITION p1 VALUES LESS THAN (9999999) ) AS SELECT * FROM hr.employees WHERE 1=0;
SQL> CREATE TABLE gokhan.employees AS SELECT * FROM hr.employees WHERE 1=0;
Şimdi partitioned olarak yaratılan tablonun “p1″ partition’ını HR.employees tablosunun içeriği ile değiştriyoruz:
SQL> ALTER TABLE gokhan.gecici EXCHANGE PARTITION p1 WITH TABLE hr.employees;
Daha sonra da “p1″ partition’ı hedef tablomuzun içeriği ile değiştiriyoruz:
SQL> ALTER TABLE gokhan.gecici EXCHANGE PARTITION p1 WITH TABLE gokhan.employees;
Bu yöntem ile içerisinde 5.5 milyon kayıt olan bir tabloyu yaklaşık 10 saniyede GOKHAN schemasına taşıyabildim. CREATE TABLE/INSERT ile bu işlem yaklaşık 6 dakika sürdü.
Eğer bu işlemi yaparken INDEX’leri de taşımak istiyorsanız partitionları değiştirmek için kullandığımız ALTER komutlarına ”INCLUDING INDEXES WITHOUT VALIDATION” parametresini eklemeniz ve geçici olarak oluşturduğunuz tabloya kaynak tablodaki tüm indexleri yaratmanız gerekiyor. Bu dökümante edilmemiş bir yöntem olduğu için yavaş olmasına rağmen ilk iki yöntemi kullanmanızı tavsiye ederim

Kategori Oracle
You are here Kategoriler Tarihe göre etiket öğelerini görüntüle: taşımak