it-swarm-eu.dev

Jak importovat výpis Oracle v jiném tabulkovém prostoru

Chci importovat výpis Oracle do jiného tabulkového prostoru.

Mám tabulkový prostor A, který používá uživatel A. Zrušil jsem DBA u tohoto uživatele a přidělil mu grantové připojení a zdroje. Pak jsem s příkazem vyhodil všechno

exp a/*** owner = soubor = oracledump.dmp log = log.log komprese = y

Nyní chci importovat výpis do tabulkového prostoru B používaného uživatelem B. Takže jsem mu dal granty na připojení a zdroje (bez DBA). Pak jsem provedl následující import:

imp b/*** soubor = oracledump.dmp log = import.log fromuser = touser = b 

Výsledkem je protokol se spoustou chyb:

IMP-00017: následující příkaz se nezdařil s chybou Oracle 20001: "BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00003: Došlo k chybě Oracle 20001 ORA-20001: Neplatné nebo nekonzistentní vstupní hodnoty

Poté jsem vyzkoušela stejný příkaz importu, ale s volbou statistika = none. Výsledkem jsou následující chyby:

ORA-00959: tablespace 'A_TBLSPACE' neexistuje

Jak by se to mělo udělat?

Poznámka: mnoho sloupců je typu CLOB. Vypadá to, že problémy s tím mají něco společného.

Poznámka 2: Verze Oracle jsou směsí 9.2, 10.1 a 10.1 XE. Ale nemyslím si, že to souvisí s verzemi.

33
Michiel Overeem

Máte tady pár otázek.

Za prvé , různé verze Oracle, které používáte, jsou důvodem chyby v statistice tabulky - měl jsem stejný problém, když některé z našich databází Oracle 10g byly upgradovány na verzi 2 a některé byly stále na vydání 1 a Mezi nimi jsem si vyměňoval soubory .DMP.

Řešením, které pracovalo pro mě, bylo použít stejnou verzi nástrojů exp a imp k exportu a importu v různých instancích databáze. To bylo nejjednodušší pomocí stejného počítače (nebo serveru Oracle), abyste vydali všechny příkazy pro export a import.

Za druhé , mám podezření, že získáváte ORA-00959: tablespace 'A_TBLSPACE' does not exist, protože se pokoušíte importovat soubor .DMP z plnohodnotné databáze Oracle do databáze 10g Express Edition (XE), která ve výchozím nastavení vytvoří jeden , předdefinovaný tabulkový prostor nazvaný USERS pro vás.

Pokud tomu tak je, musíte provést následující kroky:.

  1. Pomocí souboru .DMP vytvořte soubor SQL obsahující strukturu (tabulky):

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

  2. Otevřete indexfile (index.sql) v textovém editoru, který může najít a nahradit celý soubor a vydat následující příkazy Najít a nahradit IN ORDER (ignorovat jednotlivé uvozovky .. '):

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

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

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

    Find: 'CONNECT' Replace: 'REM CONNECT'

  3. Uložte indexový soubor a poté jej spusťte proti účtu Oracle Express Edition (je nejlepší vytvořit nový, prázdný uživatelský účet XE - nebo jej aktualizovat, pokud obnovuji):

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

  4. Nakonec spusťte stejný .DMP soubor, který jste vytvořili s indexfile proti stejnému účtu pro import dat, uložených procedur, pohledů atd:

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

Při pokusu o vytvoření určitých objektů, jako jsou například databázové úlohy, se může stát, že se stránky chyb Oracle dostanou do stejné databáze Identifikátor, který s největší pravděpodobností selže, protože se nacházíte v jiné databázi.

31
Andrew

Pokud používáte Oracle 10g a datapump, můžete použít klauzuli REMAP_TABLESPACE. příklad:

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
16
Neil Kodner

Pro mě je tato práce v pořádku (Oracle Database 10g Express Edition Release 10.2.0.1.0):

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

Ale pro nové obnovení potřebujete nový tablespace

P.S. Možná užitečné http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php

6

Jakou verzi Oracle používáte? Pokud je jeho 10g nebo více, měli byste se podívat na použití datové pumpy místo importu/exportu. Nejsem si 100% jistý, jestli zvládne tento scénář, ale očekával bych, že to bude možné.

Data Pump je náhrada za exp/imp pro 10g a vyšší. Funguje to velmi podobně jako exp/imp, kromě jeho (údajně ho nepoužívám, protože jsem uvízl v 9i zemi) lépe.

Zde jsou dokumenty Data Pump

3
Matthew Watson

Chci se zlepšit pro dva uživatele v různých tabulkových prostorech na různých serverech (databáze)

1. Nejprve vytvořte adresáře pro dočasný výpis pro oba servery (databáze):

server # 1:

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

server # 2:

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

2. Export (server č. 1):

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

3. Import (server č. 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

mým řešením je použít nástroj GSAR k nahrazení názvu tabulkového prostoru v souboru DUMP. Když provedete replce, ujistěte se, že velikost souboru výpisu se nezmění přidáním mezer. Např.

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

Problém souvisí se sloupci CLOB. Zdá se, že nástroj imp nemůže přepsat příkaz create a použít jiný tabulkový prostor.

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

Řešení je: Vytvořte schéma ručně ve správném tabulkovém prostoru. Pokud nemáte skript pro vytvoření schématu, můžete jej vytvořit pomocí indexfile = nástroje imp.

Musíte zakázat všechna omezení sebe sama, nástroj Oracle imp nebude je deaktivovat. 

Poté můžete data importovat pomocí následujícího příkazu:

imp b/*** soubor = oracledump.dmp log = import.log fromuser = a touser = b statistika = žádný ignorovat = y

Poznámka: Stále jsem potřeboval statistiky = žádné kvůli jiným chybám.

další informace o pumpě dat

Jak od Oracle 10 je import/export vylepšen: nástroj pro čerpání dat ([ http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php] [1] )

Pomocí tohoto můžete data znovu importovat do nového tabulkového prostoru:

  1. Nejdříve vytvořte adresář pro dočasný výpis:

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

  2. Vývozní:

    expdp a/* schemas = adresář = tempdump dumpfile = adump.dmp logfile = adump.log

  3. Import:

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

Poznámka: soubory výpisu jsou uloženy a přečteny z disku serveru, nikoli z místního (klientského) disku

1
Michiel Overeem

Odpověď je obtížná, ale realizovatelná:

Situace je: userAa tablespaceX

  1. importovat soubor s výpisem do jiné databáze (je to nutné pouze v případě, že potřebujete kopii původní kopie)
  2. přejmenovat tablespace

    pozměnit tabulkový prostorXpřejmenovat naY

  3. vytvořte adresář pro příkaz expdp en grant rights

  4. vytvořit výpis s expdp
  5. odebrat starého uživatele a starý tabulkový prostor (Y)
  6. vytvořit nový tabulkový prostor (Y)
  7. vytvořit nového uživatele (s novým názvem) - v tomto případěB- a udělit práva (také do adresáře vytvořeného pomocí kroku 3)
  8. importovat výpis s impdp

    impdp B/B adresář = DIR dumpfile = DUMPFILE.dmp logfile = LOGFILE.log REMAP_SCHEMA =A:B

a to je vše...

1
Michiel Overeem

Protože jsem chtěl import (do Oracle 12.1 | 2) vytvořit výpis, který byl exported z lokální databáze pro vývoj (18c xe), a věděl jsem, že všechny mé cílové databáze budou mít přístupný tablespace nazvaný DATABASE_TABLESPACE, právě jsem vytvořil své schéma/uživatele použít nový tabulkový prostor tohoto názvu namísto výchozího USERS (ke kterému nemám přístup v cílových databázích):

-- 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;

exp vytvořené z tohoto je imp šťastný na mém cíli.

0
masterxilo