2008-09-15 31 views
32

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

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

exp a/*** chủ sở hữu = a file = oracledump.dmp log = log.log nén = y

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

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

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

IMP-00.017: tuyên bố sau thất bại với ORACLE lỗi 20001: "BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00.003: ORACLE lỗi 20001 gặp ORA-20001: không hợp lệ hoặc đầu vào không phù hợp giá trị

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

ORA-00.959: tablespace 'A_TBLSPACE' không tồn tại

thế nào điều này nên được thực hiện?

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

Lưu ý2: 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ĩ rằng nó có liên quan đến các phiên bản.

Trả lời

29

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à lý do cho các lỗi bảng thống kê - Tôi đã có vấn đề tương tự khi một số của Oracle 10g Cơ sở dữ liệu của chúng tôi đã nâng cấp lên Release 2, và một số vẫn còn trên phát hành 1 và tôi đã trao đổi các tập tin .DMP giữa chúng.

Giải pháp phù hợp với tôi là sử dụng cùng một phiên bản expimp công cụ để 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. Đây là cách dễ nhất để thực hiện bằng cách sử dụng cùng một PC (hoặc Oracle Server) để phát hành tất cả lệnh xuất và nhập.

Thứ hai, tôi nghi ngờ bạn đang nhận được ORA-00959: tablespace 'A_TBLSPACE' does not exist bởi vì bạn đang cố gắng để nhập một file .dmp từ một cơ sở dữ liệu Oracle toàn diện vào 10g Express Edition (XE) Cơ sở dữ liệu, trong đó, theo mặc định, tạo ra một vùng bảng được xác định trước, được gọi là USERS cho bạn.

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

  1. Với tập tin .dmp của bạn, tạo ra một tập tin SQL chứa cấu trúc (Bàn):

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

  2. Mở tệp chỉ mục (index.sql) trong trình chỉnh sửa văn bản có thể tìm và thay thế toàn bộ tệp và phát hành các câu lệnh tìm và thay thế sau đây trong ORDER (bỏ qua dấu ngoặc đơn .. '):

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

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

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

    Find: 'CONNECT' Replace: 'REM CONNECT'

  3. Save the indexfile, sau đó chạy nó chống lại tài khoản bản Oracle Express của bạn (tôi thấy nó là tốt nhất để tạo ra một người dùng XE trống mới tài khoản - 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 file .dmp cùng bạn tạo indexfile với so với cùng một tài khoản để nhập dữ liệu, các thủ tục lưu trữ, quan điểm vv:

    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 của Oracle lỗi khi cố gắng tạo ra một số đối tượng như Cơ sở dữ liệu Việc làm như Oracle sẽ cố gắng sử dụng cùng một định danh cơ sở dữ liệu, mà rất có thể sẽ thất bại khi bạn đang ở trên một cơ sở dữ liệu khác nhau.

+0

"được giới hạn trong một vùng bảng được xác định trước, được gọi là USERS". Điều này không đúng. Tôi đã có một số máy chủ XE oracle chạy và tất cả đều có nhiều người dùng và không gian bảng. Bạn đang nói về cái gì khác? –

+1

Bạn đúng - XE cho phép tạo Tabelspace. Tôi không biết nơi tôi nghĩ rằng tôi đã đọc mà nó không, vì vậy cảm ơn bạn đã chỉ nó ra! Đây là liên kết tài liệu Oracle giúp bạn sao lưu: http://download.oracle.com/docs/cd/B25329_01/doc/admin.102/b25107/storage.htm#CHDDACII – Andrew

+0

Nếu bạn chỉ muốn nhập giản đồ được chỉ định tệp kết xuất, bạn có thể sử dụng tính năng nhập với người gửi và người bán: imp /@XE file= indexfile=index.sql fromuser= touser=

1

Sự cố phải làm với các cột CLOB. Dường như công cụ imp không thể viết lại câu lệnh create để 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 giản đồ bằng tay trong tablespace đúng. Nếu bạn không có một kịch bản để tạo lược đồ, bạn có thể tạo nó bằng cách sử dụng indexfile = của công cụ imp.

Bạn phải tắt tất cả các ràng buộc của chính mình, công cụ oracle imp sẽ không tắt chúng.

Sau đó bạn có thể nhập dữ liệu với lệnh sau:

imp b/*** file = oracledump.dmp log = import.log fromuser = a touser = b liệu thống kê = none bỏ qua = y

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

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

Tính đến Oracle 10 việc nhập khẩu/xuất khẩu đượ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 này để tái nhập dữ liệu vào một tablespace mới:

  1. Đầu tiên tạo một thư mục cho các bãi chứa tạm thời:

    TẠO HOẶC THAY ĐỔI TRỰC TIẾP THEO D DIRI H AS TRỢ AS '/ temp/tempdump /';
    ĐỌC CẤP ĐỌC, VIẾT TRÊN MÃ TRẢNG TRỰC TIẾP ĐẾN a;

  2. Xuất:

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

  3. nhập:

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

Lưu ý: các tập tin dump được lưu trữ và đọc từ đĩa máy chủ, không phải từ địa phương (khách hàng) đĩa

+0

tôi SO hy vọng bạn có một câu trả lời tốt hơn. Nó chỉ chứng minh quan điểm "Bạn nên suy nghĩ về cách bạn sẽ khôi phục dữ liệu trước khi nghĩ về cách bạn sẽ sao lưu dữ liệu" –

+0

Đúng, Xuất/Nhập là giải pháp sao lưu "cuối cùng". –

+0

Trong trường hợp của tôi, nó không phải luôn luôn phải làm với sao lưu và khôi phục. Chúng tôi cũng đang di chuyển và sao chép cơ sở dữ liệu demo. Và đó có thể là giữa các máy chủ khác nhau hoặc chỉ là một bản sao trên cùng một máy chủ. –

3

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 anyway. Tôi không chắc chắn 100% nếu nó có thể xử lý kịch bản này, nhưng tôi mong đợi nó có thể.

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

Here is the Data Pump docs

+0

Có lẽ bạn có thể xây dựng trên những gì bơm chính xác là gì? Hoặc đưa ra một số gợi ý/liên kết –

+0

Liên kết tài liệu của Máy bơm dữ liệu không chính xác: nó cung cấp cho 404 –

+0

heh, thật kỳ lạ, nó hoạt động đối với tôi. –

14

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

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE 
1

Câu trả lời là rất khó, nhưng doable:

Tình hình là: hướng dẫn Một tablespaceX

  1. nhập tập tin dump của bạn thành một cơ sở dữ liệu khác nhau (điều này chỉ cần thiết nếu bạn cần để giữ một bản sao của bản chính)
  2. đổi tên vùng bảng

    thay đổi tablespace X đổi tên để Y

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

  4. tạo một bãi chứa với expdp
  5. loại bỏ người dùng cũ và tablespace cũ (Y)
  6. tạo vùng 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 vào thư mục được tạo ra với bước 3)
  8. nhập bãi với impdp

    impdp B/thư mục B = DIR dumpfile = DUMPFILE.dmp logfile = LOGFILE.log REMAP_SCHEMA = Một: B

và đó là nó ...

3

Đối với tôi công việc này ok (Oracle Database 10g Express Edition phiên bản 10.2.0.1.0):

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

Nhưng đối mới khôi phục bạn cần tablespace mới

T.B. Có thể hữu ích http://www.oracle-base.com/articles/10g/OracleDataPump10g.php

+0

Yup, REMAP_TABLESPACE = (..) là câu trả lời dễ dàng khi sử dụng impdp.exe –

1

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 làm lại, hãy chắc chắn rằng kích thước của tệp kết xuất không thay đổi bằng cách thêm dấu cách. 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 
+0

Thật không may tôi không còn làm việc với Oracle nữa, nhưng tôi sẽ cho bạn upvote. Có lẽ ai đó có thể xác nhận rằng điều này hoạt động? –

1

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

1. Đầu tiên tạo một thư mục cho các bãi chứa 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ủ # 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 (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

--- Tạo bảng mới:

CREATE TABLESPACE TABLESPACENAME DATAFILE 'D: \ ORACL \ ORADATA \ XE \ TABLESPACEFILENAME.DBF 'SIZE 350M AUTOEXTEND ON TIẾP THEO 2500M MAXSIZE UNLIMITED ĐĂNG KÝ PERMANENT QUẢN LÝ TIỆN ÍCH ĐỊA PHƯƠNG AUTOALLOCATE BLOCKSIZE 8K HƯỚNG DẪN QUẢN LÝ KHÔNG GIAN SEGMENT BẬT NGAY;

--- và sau đó nhập với bên dưới lệnh

CREATE USER BVUSER XÁC ĐỊNH THEO GIÁ TRỊ 'bvuser' DEFAULT TABLESPACE TABLESPACENAME

- nơi D: \ ORACL là con đường của cài đặt oracle

Các vấn đề liên quan