it-swarm-id.com

Cara Mengimpor dump Oracle di tablespace yang berbeda

Saya ingin mengimpor dump Oracle ke tablespace yang berbeda.

Saya memiliki tablespace A yang digunakan oleh Pengguna A. Saya telah mencabut DBA pada pengguna ini dan memberinya hibah terhubung dan sumber daya. Lalu aku sudah membuang semuanya dengan perintah

exp/*** pemilik = file = oracledump.dmp log = log.log kompres = y

Sekarang saya ingin mengimpor dump ke tablespace B yang digunakan oleh Pengguna B. Jadi saya telah memberinya hibah untuk koneksi dan sumber daya (tanpa DBA). Kemudian saya telah menjalankan impor berikut:

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

Hasilnya adalah log dengan banyak kesalahan:

IMP-00017: pernyataan berikut gagal dengan Oracle error 20001: "BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00003: Oracle error 20001 temui ORA-20001: Nilai input tidak valid atau tidak konsisten

Setelah itu saya sudah mencoba perintah impor yang sama tetapi dengan opsi statistik = tidak ada. Ini menghasilkan kesalahan berikut:

ORA-00959: tablespace 'A_TBLSPACE' tidak ada

Bagaimana ini harus dilakukan?

Catatan: banyak kolom bertipe CLOB. Sepertinya masalahnya ada hubungannya dengan itu.

Note2: Versi Oracle adalah campuran dari 9.2, 10.1 dan 10.1 XE. Tapi saya pikir itu tidak ada hubungannya dengan versi.

33
Michiel Overeem

Anda punya beberapa masalah di sini.

Pertama , versi berbeda dari Oracle yang Anda gunakan adalah alasan untuk kesalahan statistik tabel - Saya memiliki masalah yang sama ketika beberapa Oracle 10g Database kami ditingkatkan ke Rilis 2, dan beberapa masih pada Rilis 1 dan Saya bertukar file .DMP di antara mereka.

Solusi yang berhasil bagi saya adalah dengan menggunakan versi yang sama dari alat exp dan imp untuk melakukan ekspor dan impor pada berbagai contoh Database. Ini paling mudah dilakukan dengan menggunakan PC yang sama (atau Oracle Server) untuk mengeluarkan semua perintah ekspor dan impor.

Kedua , saya curiga Anda mendapatkan ORA-00959: tablespace 'A_TBLSPACE' does not exist karena Anda mencoba mengimpor file .DMP dari Database Oracle yang lengkap ke Database 10g Express Edition (XE), yang, secara default, membuat satu , tablespace standar yang disebut USERS untuk Anda.

Jika itu masalahnya, maka Anda harus melakukan yang berikut ..

  1. Dengan file .DMP Anda, buat file SQL yang berisi struktur (Tabel):

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

  2. Buka file indeks (index.sql) dalam editor teks yang dapat menemukan dan mengganti seluruh file, dan terbitkan temuan berikut dan ganti pernyataan DALAM PESANAN (abaikan tanda kutip tunggal .. '):

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

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

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

    Find: 'CONNECT' Replace: 'REM CONNECT'

  3. Simpan indexfile, kemudian jalankan di akun Oracle Express Edition Anda (saya menemukan yang terbaik untuk membuat akun pengguna XE baru yang kosong - atau jatuhkan dan buat ulang jika saya menyegarkan):

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

  4. Terakhir jalankan file .DMP yang sama dengan yang Anda buat di indexfile dengan akun yang sama untuk mengimpor data, prosedur tersimpan, tampilan dll:

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

Anda mungkin mendapatkan halaman kesalahan Oracle ketika mencoba membuat objek tertentu seperti Pekerjaan Database karena Oracle akan mencoba menggunakan Pengidentifikasi Database yang sama, yang kemungkinan besar akan gagal karena Anda berada di Database yang berbeda.

31
Andrew

Bagi saya pekerjaan ini ok (Oracle Database 10g Express Edition Release 10.2.0.1.0):

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

Tetapi untuk pemulihan baru Anda perlu tablespace baru

P.S. Mungkin bermanfaat http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php

6

Versi Oracle apa yang Anda gunakan? Jika 10g atau lebih, Anda harus melihat menggunakan Data Pump alih-alih impor/ekspor. Saya tidak 100% yakin apakah ini bisa menangani skenario ini, tapi saya harapkan bisa.

Pompa Data adalah pengganti exp/imp untuk 10g ke atas. Ia bekerja sangat mirip dengan exp/imp, kecuali itu (seharusnya, saya tidak menggunakannya karena saya terjebak di tanah 9i) lebih baik.

Berikut ini adalah data Pump docs

3
Matthew Watson

Saya ingin meningkatkan untuk dua pengguna baik di tablespace yang berbeda di server yang berbeda (database)

1 . Pertama buat direktori untuk dump sementara untuk kedua server (database):

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 . Ekspor (server # 1):

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

3 . Impor (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

solusi saya adalah menggunakan utilitas GSAR untuk mengganti nama tablespace dalam file DUMP. Ketika Anda melakukan replce, pastikan bahwa ukuran file dump tidak berubah dengan menambahkan spasi . E.g.

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

Masalahnya berkaitan dengan kolom CLOB. Tampaknya alat imp tidak dapat menulis ulang pernyataan create untuk menggunakan tablespace lain.

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

Solusinya adalah: Buat skema dengan tangan di tablespace yang benar. Jika Anda tidak memiliki skrip untuk membuat skema, Anda dapat membuatnya dengan menggunakan indexfile = dari alat imp.

Anda harus menonaktifkan semua kendala Anda sendiri, alat Oracle imp tidak akan menonaktifkannya. 

Setelah itu Anda dapat mengimpor data dengan perintah berikut:

imp b/*** file = oracledump.dmp log = import.log fromuser = touser = b statistik = tidak ada abaikan = y

Catatan: Saya masih membutuhkan statistik = tidak ada karena kesalahan lain.

info tambahan tentang pompa data

Pada Oracle 10 impor/ekspor ditingkatkan: alat pompa data ([ http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php[[1] )

Menggunakan ini untuk mengimpor kembali data ke tablespace baru:

  1. Pertama buat direktori untuk dump sementara:

    BUAT OR REPLACE DIRECTORY tempdump AS '/ temp/tempdump /';
    BACA DITERIMA, TULIS DIREKTORI tempdump KE a;

  2. Ekspor:

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

  3. Impor:

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

Catatan: file dump disimpan dan dibaca dari disk server, bukan dari disk (klien) lokal

1
Michiel Overeem

Jawabannya sulit, tetapi bisa dilakukan:

Situasi adalah: userAdan tablespaceX

  1. impor file dump Anda ke database yang berbeda (ini hanya diperlukan jika Anda perlu menyimpan salinan yang asli)
  2. ganti nama tablespace

    ubah tablespaceXganti nama menjadiY

  3. buat direktori untuk perintah expdp dan berikan hak

  4. buat dump dengan expdp
  5. hapus pengguna lama dan tablespace lama (Y)
  6. buat tablespace baru (Y)
  7. buat pengguna baru (dengan nama baru) - dalam hal iniB- dan berikan hak (juga ke direktori yang dibuat dengan langkah 3)
  8. impor dump dengan impdp

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

dan hanya itu ...

1
Michiel Overeem

Karena saya ingin import (ke Oracle 12.1 | 2) dump yang export dari database pengembangan lokal (18c xe), dan saya tahu bahwa semua basis data target saya akan memiliki tablespace yang dapat diakses yang disebut DATABASE_TABLESPACE, saya baru saja membuat skema/pengguna saya untuk menggunakan tablespace baru dari nama itu alih-alih USERS default (yang saya tidak punya akses pada database target):

-- 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 yang dibuat dari ini membuat imp bahagia di target saya.

0
masterxilo