it-swarm-vi.tech

Cách nhập kết xuất Oracle trong một vùng bảng khác

Tôi muốn nhập một kết xuất Oracle vào một vùng bảng khác.

Tôi có một không gian bảng A được sử dụng bởi Người dùng A. Tôi đã thu hồi DBA trên người dùng này và cấp cho anh ta các kết nối và tài nguyên tài trợ. Sau đó, tôi đã đổ mọi thứ với lệnh

exp a/*** own = a file = oracledump.dmp log = log.log nén = y

Bây giờ tôi muốn nhập kết xuất vào vùng bảng B được sử dụng bởi Người dùng B. Vì vậy, tôi đã cấp cho anh ta các khoản trợ cấp về kết nối và tài nguyên (không có DBA). Sau đó, tôi đã thực hiện nhập sau:

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

Kết quả là một bản ghi có rất nhiều lỗi:

IMP-00017: tuyên bố sau không thành công với lỗi Oracle 20001: "BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00003: Đã xảy ra lỗi Oracle 20001.

Sau đó, tôi đã thử cùng một lệnh nhập nhưng với tùy chọn thống kê = không có. Điều này dẫn đến các lỗi sau:

ORA-00959: không tồn tại bảng 'A_TBLSPACE'

Làm sao nó có thể hoàn thành?

Lưu ý: rất nhiều cột có kiểu CLOB. Có vẻ như các vấn đề có liên quan đến điều đó.

Lưu ý 2: Các phiên bản Oracle là hỗn hợp của 9.2, 10.1 và 10.1 XE. Nhưng tôi không nghĩ nó phải làm với các phiên bản.

33
Michiel Overeem

Bạn đã có một vài vấn đề ở đây.

Thứ nhất , các phiên bản khác nhau của Oracle bạn đang sử dụng là nguyên nhân gây ra lỗi thống kê bảng - Tôi gặp vấn đề tương tự khi một số Cơ sở dữ liệu Oracle 10g của chúng tôi được nâng cấp lên Phiên bản 2 và một số vẫn còn trên Phiên bản 1 và Tôi đã hoán đổi các tập tin .DMP giữa chúng.

Giải pháp hiệu quả với tôi là sử dụng cùng một phiên bản của các công cụ expimp để thực hiện việc xuất và nhập trên các phiên bản Cơ sở dữ liệu khác nhau. Điều này dễ thực hiện nhất bằng cách sử dụng cùng một PC (hoặc Máy chủ Oracle) để phát hành tất cả các lệnh xuất và nhập.

Thứ hai , tôi nghi ngờ bạn đang nhận ORA-00959: tablespace 'A_TBLSPACE' does not exist vì bạn đang cố nhập tệp .DMP từ Cơ sở dữ liệu Oracle đầy đủ vào Cơ sở dữ liệu 10g Express Edition (XE), theo mặc định, sẽ tạo một tệp duy nhất , không gian bảng được xác định trước được gọi là USERS cho bạn.

Nếu đó là trường hợp, thì bạn sẽ cần phải làm như sau ..

  1. Với tệp .DMP của bạn, tạo tệp SQL chứa cấu trúc (Bảng):

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

  2. Mở tệp indexfile (index.sql) trong trình soạn thảo văn bản có thể tìm và thay thế toàn bộ tệp và đưa ra các câu lệnh tìm và thay thế sau IN ORDER (bỏ qua các dấu ngoặc đơn .. '):

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

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

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

    Find: 'CONNECT' Replace: 'REM CONNECT'

  3. Lưu tệp chỉ mục, sau đó chạy nó với tài khoản Oracle Express Edition của bạn (Tôi thấy tốt nhất là tạo tài khoản người dùng XE mới, trống - hoặc thả và tạo lại nếu tôi đang làm mới):

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

  4. Cuối cùng chạy cùng một tệp .DMP mà bạn đã tạo tệp chỉ mục với cùng một tài khoản để nhập dữ liệu, thủ tục được lưu trữ, chế độ xem, v.v.

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

Bạn có thể nhận được các trang lỗi của Oracle khi cố gắng tạo một số đối tượng nhất định như Cơ sở dữ liệu vì Oracle sẽ cố gắng sử dụng cùng một Mã định danh cơ sở dữ liệu, rất có thể sẽ thất bại khi bạn sử dụng Cơ sở dữ liệu khác.

31
Andrew

Nếu bạn đang sử dụng Oracle 10g và datapump, bạn có thể sử dụng mệnh đề REMAP_TABLESPACE. thí dụ:

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
16
Neil Kodner

Đối với tôi công việc này ok (Phiên bản Express 10g cơ sở dữ liệu Oracle 10.2.0.1.0):

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

Nhưng để khôi phục mới, bạn cần không gian bảng mới

P.S. Có thể hữu ích http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php

6
Grebets Kostyantyn

Phiên bản nào của Oracle bạn đang sử dụng? Nếu 10g hoặc lớn hơn, bạn nên xem xét sử dụng Data Pump thay vì nhập/xuất. Tôi không chắc chắn 100% nếu nó có thể xử lý tình huống này, nhưng tôi hy vọng nó có thể.

Bơm dữ liệu là sự thay thế cho exp/imp trong 10g trở lên. Nó hoạt động rất giống với exp/imp, ngoại trừ (được cho là tôi không sử dụng nó vì tôi bị kẹt ở đất 9i) tốt hơn.

Đây là tài liệu Bơm dữ liệu

3
Matthew Watson

Tôi muốn cải thiện cho hai người dùng ở cả hai không gian bảng khác nhau trên các máy chủ (cơ sở dữ liệu) khác nhau

1 . Đầu tiên tạo thư mục cho kết xuất tạm thời cho cả hai máy chủ (cơ sở dữ liệu):

máy chủ 1:

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

máy chủ số 2:

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

2 . Xuất (máy chủ số 1):

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

3 . Nhập (máy chủ số 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

giải pháp của tôi là sử dụng tiện ích GSAR để thay thế tên vùng bảng trong tệp DUMP. Khi bạn thay thế, hãy đảm bảo rằng kích thước của tệp kết xuất không thay đổi bằng cách thêm khoảng trắng . Ví dụ:.

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

Vấn đề phải làm với các cột CLOB. Có vẻ như công cụ imp không thể viết lại câu lệnh tạo để sử dụng một vùng bảng khác.

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

Giải pháp là: Tạo lược đồ bằng tay trong không gian bảng chính xác. Nếu bạn không có tập lệnh để tạo lược đồ, bạn có thể tạo tập lệnh bằng cách sử dụng indexfile = của công cụ imp.

Bạn phải tự vô hiệu hóa tất cả các ràng buộc của mình, công cụ imp của Oracle sẽ không vô hiệu hóa chúng. 

Sau đó, bạn có thể nhập dữ liệu bằng lệnh sau:

imp b/*** file = oracledump.dmp log = import.log fromuser = a touser = b stats = none ign = y

Lưu ý: Tôi vẫn cần số liệu thống kê = không có do lỗi khác.

thông tin thêm về máy bơm dữ liệu

Kể từ Oracle 10, quá trình nhập/xuất được cải thiện: công cụ bơm dữ liệu ([ http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php[[1] )

Sử dụng điều này để nhập lại dữ liệu vào một vùng bảng mới:

  1. Đầu tiên tạo một thư mục cho kết xuất tạm thời:

    TẠO OR THAY THẾ TRỰC TIẾP tempdump AS '/ temp/tempdump /';
    CẤP ĐỌC, VIẾT TRÊN tempump TRỰC TIẾP ĐẾN a;

  2. Xuất khẩu:

    expdp a/* schemas = một thư mục = tempdump dumpfile = adump.dmp logfile = adump.log

  3. Nhập khẩu:

    impdp b/* thư mục = tempdump dumpfile = adump.dmp logfile = bdump.log REMAP_SCHema = a: b

Lưu ý: các tệp kết xuất được lưu trữ và đọc từ đĩa máy chủ, không phải từ đĩa cục bộ (máy khách)

1
Michiel Overeem

Câu trả lời là khó, nhưng có thể thực hiện được:

Tình huống là: người dùng A và không gian bảng X

  1. nhập tệp kết xuất của bạn vào một cơ sở dữ liệu khác (điều này chỉ cần thiết nếu bạn cần giữ một bản sao của cơ sở dữ liệu gốc)
  2. đổi tên không gian bảng

    thay đổi không gian bảng X đổi tên thành Y

  3. tạo một thư mục cho lệnh expdp en cấp quyền

  4. tạo một bãi chứa với expdp
  5. xóa người dùng cũ và không gian bảng cũ (Y)
  6. tạo không gian bảng mới (Y)
  7. tạo người dùng mới (có tên mới) - trong trường hợp này là B - và cấp quyền (cũng cho thư mục được tạo ở bước 3)
  8. nhập bãi chứa với impdp

    thư mục B/B impdp = DIR dumpfile = DUMPFILE.dmp logfile = LOGFILE.log REMAP_SCHema = A: B

và đó là ...

1
Michiel Overeem

Bởi vì tôi muốn import (với Oracle 12.1 | 2) một kết xuất được export từ cơ sở dữ liệu phát triển cục bộ (18c xe) và tôi biết rằng tất cả các cơ sở dữ liệu đích của tôi sẽ có một không gian bảng có thể truy cập được gọi là DATABASE_TABLESPACE để sử dụng một vùng bảng mới của tên đó thay vì USERS mặc định (mà tôi không có quyền truy cập vào cơ sở dữ liệu đí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;

Một exp được tạo từ điều này làm cho imp hạnh phúc trên mục tiêu của tôi.

0
masterxilo