it-swarm-tr.com

Bir Oracle dökümü farklı bir tablo alanında nasıl içe aktarılır

Bir Oracle dökümü farklı bir tablo alanına almak istiyorum.

A Kullanıcısı tarafından kullanılan bir tablo alanına sahibim. Bu kullanıcının DBA'sını iptal ettim ve ona bağlanma ve kaynak verdim. Sonra herşeyi komutla bıraktım

exp a/*** owner = bir dosya = oracledump.dmp log = log.log compress = y

Şimdi dökümü Kullanıcı B tarafından kullanılan B tablo alanına almak istiyorum. Bu yüzden ona connect ve kaynak (DBA yok) üzerindeki hibeleri verdim. Sonra şu içe aktarmayı gerçekleştirdim:

imp b/*** dosyası = oracledump.dmp log = import.log fromuser = bir kullanıcı = b 

Sonuç, çok fazla hata içeren bir günlük:

IMP-00017: aşağıdaki ifade Oracle 20001 hatasıyla başarısız oldu: "BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00003: Oracle 20001 hatasıyla karşılaştı. ORA-20001: Geçersiz veya tutarsız girdi değerleri

Bundan sonra aynı import komutunu denedim, ancak istatistik seçeneğiyle = none. Bu, aşağıdaki hatalarla sonuçlandı:

ORA-00959: 'A_TBLSPACE' tablo alanı mevcut değil

Bu nasıl yapılmalı?

Not: Çok sayıda sütun CLOB türündedir. Sorunların bununla bir ilgisi var gibi görünüyor.

Not2: Oracle sürümleri 9.2, 10.1 ve 10.1 XE'nin bir karışımıdır. Fakat bunun versiyonlarla ilgisi olduğunu sanmıyorum.

33
Michiel Overeem

Burada birkaç sorun var.

Öncelikle , kullandığınız Oracle'ın farklı sürümleri tablo istatistik hatasının nedeni - Oracle 10g Veritabanlarımızdan bazıları Sürüm 2'ye yükseltildiğinde aynı sorunu gördüm ve bazıları hala Sürüm 1’de ve DMP dosyalarını aralarında değiştiriyordum.

Benim için çalışan çözüm, farklı Veri Tabanı örneklerini vermek ve almak için exp ve imp araçlarının aynı sürümünü kullanmaktı. Tüm dışa aktarma ve içe aktarma komutlarını vermek için aynı bilgisayarı (veya Oracle Server'ı kullanarak) yapmak en kolay yoluydu.

İkincisi , ORA-00959: tablespace 'A_TBLSPACE' does not exist'yi aldığınızdan şüpheleniyorum çünkü bir .DMP dosyasını tam gelişmiş bir Oracle Veritabanından, varsayılan olarak tek bir veri kaynağı olan 10g Express Edition (XE) Veritabanına almaya çalışıyorsunuz. , sizin için USERS adı verilen önceden tanımlanmış tablo alanı.

Bu durumda, aşağıdakileri yapmanız gerekir.

  1. .DMP dosyanızla, yapıyı içeren bir SQL dosyası oluşturun (Tablolar):

    imp <xe_username>/<password>@XE file=<filename.dmp> indexfile=index.sql full=y

  2. İndexfile dosyasını (index.sql) tüm dosyanın üzerinde bulabilecek ve değiştirebilecek bir metin düzenleyicide açın ve aşağıdaki ifadeleri IN ORDER (tek tırnak işaretlerini dikkate almayın .. ') yazın:

    Find: 'REM<space>' Replace: <nothing>

    Find: '"<source_tablespace>"' Replace: '"USERS"'

    Find: '...' Replace: 'REM ...'

    Find: 'CONNECT' Replace: 'REM CONNECT'

  3. Dizin dosyasını kaydedin, ardından Oracle Express Edition hesabınıza karşı çalıştırın (yeni, boş bir XE kullanıcı hesabı oluşturmanın en iyi olduğunu düşünüyorum - ya da yeniliyorsam bırakıp yeniden oluşturun):

    sqlplus <xe_username>/<password>@XE @index.sql

  4. Son olarak, verileri, saklı yordamları, görünümleri vb. Almak için aynı hesaba karşı indeks dosyasını oluşturduğunuz aynı .DMP dosyasını çalıştırın:

    imp <xe_username>/<password>@XE file=<filename.dmp> fromuser=<original_username> touser=<xe_username> ignore=y

Oracle'ın Veritabanı İşleri gibi belirli nesneler oluşturmaya çalışırken, Oracle'ın aynı veritabanı tanımlayıcısını kullanmaya çalıştığından, muhtemelen farklı bir Veritabanında olduğunuz gibi başarısız olacak sayfalar almaya başlayabilirsiniz.

31
Andrew

Oracle 10g ve datapump kullanıyorsanız, REMAP_TABLESPACE yan tümcesini kullanabilirsiniz. örnek:

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
16
Neil Kodner

Benim için bu iş tamam (Oracle Database 10g Express Edition Sürüm 10.2.0.1.0):

impdp B/B full=Y dumpfile=DUMP.dmp REMAP_TABLESPACE=OLD_TABLESPACE:USERS

Ancak yeni geri yükleme için yeni tablo alanına ihtiyacınız var

Not; Belki yararlı http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php

6

Hangi Oracle sürümünü kullanıyorsunuz? 10 g veya daha büyükse, yine de alma/verme yerine Veri Pompasını kullanmaya bakmalısınız. Bu senaryoyu idare edip edemeyeceğinden% 100 emin değilim, ancak bekleyebilirim.

Veri Pompası , 10 g ve üzeri için exp/imp'nin yerine geçmiştir. Exp/imp'a çok benzer bir şekilde çalışır, (sözde, 9i ülkesinde sıkışıp kaldığım için kullanmıyorum) dışında daha iyi çalışıyor.

İşte Veri Pompası belgeleri

3
Matthew Watson

İki sunucu için farklı sunucularda (farklı veritabanlarında) farklı tablo alanlarında geliştirmek istiyorum

1 .İlk olarak, her iki sunucu için de geçici döküm için bir dizin oluşturun (veritabanları):

Sunucu 1:

CREATE OR REPLACE DIRECTORY tempdump AS '/temp/old_datapump/';
GRANT READ, WRITE ON DIRECTORY tempdump TO old_user;

sunucu # 2:

CREATE OR REPLACE DIRECTORY tempdump AS '/temp/new_datapump/';
GRANT READ, WRITE ON DIRECTORY tempdump TO new_user;

2 ..__ İhracat (sunucu no. 1):

expdp tables=old_user.table directory=tempdump dumpfile=adump.dmp logfile=adump.log

3 ..__ İthalat (sunucu # 2):

impdp directory=tempdump dumpfile=adump_table.dmp logfile=bdump_table.log
REMAP_TABLESPACE=old_tablespace:new_tablespace REMAP_SCHEMA=old_user:new_user
1
peter

benim çözümüm DUMP dosyasındaki tablo alanı adını değiştirmek için GSAR yardımcı programını kullanmaktır. Replce yaptığınızda, dump dosyasının boyutunun boşluk ekleyerek değişmediğinden emin olun.

gsar -f -s"TSDAT_OV101" -r"USERS      " rm_schema.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS      """ ENABLE STORAGE IN ROW CHUNK 8192 RETENTION" -r"                                                                   " rm_schema.n1.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS      """ LOGGING" -r"                                  " rm_schema.n1.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS      """ " -r"                             " rm_schema.n.dump rm_schema.n1.dump
1
Dmitry

Sorunun CLOB sütunları ile ilgisi var. Imp aracı başka bir tablo alanı kullanmak için create ifadesini yeniden yazamaz gibi görünüyor.

Kaynak: http://asktom.Oracle.com/pls/asktom/f?p=100:11:0::::: P11_QUESTION_ID:66890284723848

Çözüm: Şemayı el ile doğru çizelgede oluşturun. Şema oluşturmak için bir komut dosyanız yoksa, bunu imp aracının indexfile = komutunu kullanarak oluşturabilirsiniz.

Tüm kısıtlamaları kendiniz devre dışı bırakmanız gerekir, Oracle imp aracı bunları devre dışı bırakmaz. 

Bundan sonra aşağıdaki komutu kullanarak verileri alabilirsiniz:

imp b/*** dosyası = oracledump.dmp log = import.log fromuser = a touser = b istatistik = yok yoksay = y

Not: Yine de istatistiklere ihtiyacım vardı = diğer hatalardan dolayı hiçbiri.

veri pompası hakkında ek bilgi

Oracle 10'dan itibaren, içe/dışa aktarma iyileştirildi: veri pompası aracı ([ http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php fincan.com] )

Verileri yeni bir tablo alanına yeniden almak için bunu kullanmak:

  1. İlk önce geçici döküm için bir dizin oluşturun:

    CREATE OR DIRECTORY tempdump AS '/ temp/tempdump /';
    HİBE OKUYUN, YÖNETMEN YAZIN tempdump a;

  2. İhracat:

    expdp a/* schemas = bir dizin = tempdump dumpfile = adump.dmp logfile = adump.log

  3. İthalat:

    impdp b/* dizin = tempdump dumpfile = adump.dmp logfile = bdump.log REMAP_SCHEMA = a: b

Not: döküm dosyaları yerel (istemci) diskten değil, sunucu diskten depolanır ve okunur.

1
Michiel Overeem

Cevap zor, ama yapılabilir:

Durum: kullanıcı A ve tablo alanı X

  1. döküm dosyanızı farklı bir veritabanına içe aktarın (yalnızca orijinal belgenin bir kopyasını saklamanız gerekiyorsa gerekir)
  2. tablo alanını yeniden adlandır

    tabloları değiştir X yeniden adlandırın Y

  3. expdp komutu için bir dizin oluşturun

  4. expdp ile bir dökümü oluşturun
  5. eski kullanıcıyı ve eski tablo alanını kaldır (Y)
  6. yeni tablo alanını yarat (Y)
  7. yeni kullanıcı oluştur (yeni isimle) - bu durumda B - ve haklar ver (ayrıca 3. adımla yaratılan dizine)
  8. dökümü impdp ile içe aktar

    impdp B/B dizini = DIR dumpfile = DUMPFILE.dmp logfile = LOGFILE.log REMAP_SCHEMA = A: B

ve bu kadar...

1
Michiel Overeem

import (Oracle 12.1 | 2) 'a yerel bir veri tabanından (18c xe) exported olan bir dökümü yapmak istediğim için ve tüm hedef veritabanlarımın DATABASE_TABLESPACE adında erişilebilir bir tablo alanına sahip olacağını biliyordum, şema/kullanıcımı oluşturdum Varsayılan USERS yerine bu isimde yeni bir tablo alanı kullanmak için (hedef veritabanlarına erişimim yok):

-- don't care about the details
CREATE TABLESPACE DATABASE_TABLESPACE
  DATAFILE 'DATABASE_TABLESPACE.dat' 
    SIZE 10M
    REUSE
    AUTOEXTEND ON NEXT 10M MAXSIZE 200M;

ALTER DATABASE DEFAULT TABLESPACE DATABASE_TABLESPACE;

CREATE USER username
  IDENTIFIED BY userpassword
  CONTAINER=all;

GRANT create session TO username;
GRANT create table TO username;
GRANT create view TO username;
GRANT create any trigger TO username;
GRANT create any procedure TO username;
GRANT create sequence TO username;
GRANT create synonym TO username;
GRANT create synonym TO username;
GRANT UNLIMITED TABLESPACE TO username;

Bundan oluşturulan bir expimp 'ı hedefimde mutlu ediyor.

0
masterxilo