it-swarm-ko.tech

다른 테이블 스페이스에서 Oracle 덤프를 가져 오는 방법

Oracle 덤프를 다른 테이블 공간으로 가져오고 싶습니다.

사용자 A가 사용하는 테이블 스페이스 A가 있습니다.이 사용자에 대한 DBA를 취소하고 그에게 연결 및 자원을 부여했습니다. 그런 다음 명령으로 모든 것을 버렸습니다.

exp a/*** owner = a 파일 = oracledump.dmp log = log.log compress = y

이제 사용자 B가 사용하는 테이블 스페이스 B로 덤프를 가져 오려고합니다. 따라서 연결 및 자원 (DBA 없음)에 대한 권한을 부여했습니다. 그런 다음 다음 가져 오기를 실행했습니다.

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

결과는 많은 오류가있는 로그입니다.

IMP-00017 : 다음 오류가 Oracle 오류 20001과 함께 실패했습니다. "BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00003 : Oracle 오류 20001에서 ORA-20001이 발생했습니다 : 입력 값이 잘못되었거나 일치하지 않습니다

그 후 나는 같은 import 명령을 시도했지만 통계 = 없음 옵션을 사용했습니다. 그 결과 다음과 같은 오류가 발생했습니다.

ORA-00959 : 테이블 스페이스 'A_TBLSPACE'가 존재하지 않습니다

어떻게해야합니까?

참고 : 많은 열이 CLOB 유형입니다. 문제가 그와 관련이있는 것 같습니다.

참고 2 : Oracle 버전은 9.2, 10.1 및 10.1 XE가 혼합되어 있습니다. 그러나 나는 그것이 버전과 관련이 있다고 생각하지 않습니다.

36
Michiel Overeem

여기 몇 가지 문제가 있습니다.

먼저, 사용중인 다른 버전의 Oracle이 테이블 통계 오류의 원인입니다. Oracle 10g 데이터베이스 중 일부가 릴리스 2로 업그레이드되었지만 일부는 여전히 켜져 있습니다. 릴리스 1과 .DMP 파일을 서로 교환했습니다.

나를 위해 일한 해결책은 동일한 버전의 expimp 도구를 사용하여 다른 데이터베이스 인스턴스에서 내보내기 및 가져 오기를 수행하는 것이 었습니다. 동일한 PC (또는 Oracle Server)를 사용하여 모든 내보내기 및 가져 오기 명령을 실행하여 가장 쉽게 수행 할 수 있습니다.

둘째, 나는 당신이 ORA-00959: tablespace 'A_TBLSPACE' does not exist 전체 Oracle 데이터베이스에서 10g Express Edition (XE) 데이터베이스로 .DMP 파일을 가져 오려고하기 때문에 기본적으로 USERS라는 단일 사전 정의 된 테이블 스페이스를 작성합니다. .

이 경우 다음을 수행해야합니다.

  1. .DMP 파일을 사용하여 구조 (테이블)를 포함하는 SQL 파일을 작성하십시오.

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

  2. 전체 파일을 찾아서 바꿀 수있는 텍스트 편집기에서 색인 파일 (index.sql)을 열고 IN ORDER에서 다음 찾기 및 바꾸기 명령문을 실행하십시오 (작은 따옴표는 무시하십시오. ').

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

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

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

    Find: 'CONNECT' Replace: 'REM CONNECT'

  3. 색인 파일을 저장 한 다음 Oracle Express Edition 계정에 대해 실행하십시오 (빈 XE 사용자 계정을 새로 작성하거나 새로 고치면 삭제하고 다시 작성하는 것이 가장 좋습니다).

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

  4. 마지막으로 동일한 계정에 대해 색인 파일을 생성 한 동일한 .DMP 파일을 실행하여 데이터, 저장 프로 시저, 뷰 등을 가져옵니다.

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

Oracle이 동일한 데이터베이스 식별자를 사용하려고 할 때 데이터베이스 작업과 같은 특정 객체를 만들려고 할 때 Oracle 오류 페이지가 표시 될 수 있습니다. 이는 다른 데이터베이스에있을 때 실패 할 가능성이 높습니다.

33
Andrew

Oracle 10g 및 데이터 펌프를 사용하는 경우 REMAP_TABLESPACE 절을 사용할 수 있습니다. 예:

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
16
Neil Kodner

나를 위해이 작업은 괜찮습니다 (Oracle Database 10g Express Edition 릴리스 10.2.0.1.0).

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

그러나 새로운 복원을 위해서는 새로운 테이블 스페이스가 필요합니다

추신 아마도 유용하다 http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php

6
Grebets Kostyantyn

어떤 버전의 Oracle을 사용하고 있습니까? 10g 이상인 경우 어쨌든 가져 오기/내보내기 대신 데이터 펌프를 사용해야합니다. 이 시나리오를 처리 할 수 ​​있는지 100 % 확실하지 않지만 가능할 것으로 예상합니다.

데이터 펌프 는 10g 이상에서 exp/imp를 대체합니다. exp/imp와 매우 유사하게 작동하지만 (9i 랜드에 갇혀 있기 때문에 사용하지 않는 것 같습니다) 더 좋습니다.

데이터 펌프 문서는 다음과 같습니다

3
Matthew Watson

다른 서버 (데이터베이스)의 다른 테이블 공간에서 두 명의 사용자를 향상시키고 싶습니다.

1. 먼저 두 서버 (데이터베이스)에 대한 임시 덤프 용 디렉토리를 만듭니다.

서버 # 1 :

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

서버 # 2 :

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

2. 내보내기 (서버 # 1) :

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

. 가져 오기 (서버 # 2) :

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

내 솔루션은 GSAR 유틸리티를 사용하여 DUMP 파일의 테이블 공간 이름을 바꾸는 것입니다. replce를 수행 할 때 공백을 추가하여 덤프 파일의 크기가 변경되지 않았는지 확인하십시오. 예 :.

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

문제는 CLOB 열과 관련이 있습니다. imp 도구가 다른 테이블 스페이스를 사용하기 위해 create 문을 다시 작성할 수없는 것 같습니다.

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

해결책은 다음과 같습니다. 올바른 테이블 스페이스에서 수동으로 스키마를 작성하십시오. 스키마를 작성하는 스크립트가없는 경우 imp 도구의 indexfile =을 사용하여 스키마를 작성할 수 있습니다.

자체 제약 조건을 모두 비활성화해야하며 Oracle imp 도구는 이러한 제약 조건을 비활성화하지 않습니다.

그 후 다음 명령을 사용하여 데이터를 가져올 수 있습니다.

imp b/*** file = oracledump.dmp log = import.log fromuser = a touser = b statistics = 없음 무시 = y

참고 : 다른 오류로 인해 여전히 통계 = 없음이 필요했습니다.

데이터 펌프에 대한 추가 정보

Oracle 10부터 가져 오기/내보내기 기능이 향상되었습니다. 데이터 펌프 도구 ([ http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php] [1] )

이를 사용하여 데이터를 새 테이블 스페이스로 다시 가져 오기 :

  1. 먼저 임시 덤프 용 디렉토리를 작성하십시오.

    CREATE OR 디렉터리 교체 tempdump AS '/ temp/tempdump /';
    GRANT READ, WRITE ON DIRECTORY tempdump to a;

  2. 수출:

    expdp a/* 스키마 = 디렉토리 = tempdump dumpfile = adump.dmp logfile = adump.log

  3. 수입:

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

참고 : 덤프 파일은 로컬 (클라이언트) 디스크가 아닌 서버 디스크에서 저장되고 읽 힙니다.

1
Michiel Overeem

대답은 어렵지만 실행할 수 있습니다.

상황 : 사용자 A 및 테이블 스페이스 X

  1. 덤프 파일을 다른 데이터베이스로 가져 오기 (원본 파일의 사본을 보관해야하는 경우에만 필요)
  2. 테이블 스페이스 이름 바꾸기

    테이블 스페이스 변경 X 이름을 Y

  3. expdp 명령에 대한 디렉토리를 작성하십시오. en grant 권한

  4. expdp로 덤프 생성
  5. 이전 사용자와 이전 테이블 스페이스를 제거하십시오 ( Y )
  6. 새 테이블 스페이스를 만듭니다 ( Y )
  7. 새 사용자 (새 이름으로)를 작성하십시오 (이 경우 B -권한 부여 (3 단계로 작성된 디렉토리에도)
  8. impdp로 덤프 가져 오기

    impdp B/B 디렉토리 = DIR dumpfile = DUMPFILE.dmp logfile = LOGFILE.log REMAP_SCHEMA = A : B

그리고 그게 다야...

1
Michiel Overeem

로컬 개발 데이터베이스 (18c xe)에서 imported 된 덤프를 export (Oracle 12.1 | 2로)하고 싶었고 모든 대상 데이터베이스에 액세스 가능한 테이블 스페이스가 있음을 알고있었습니다. DATABASE_TABLESPACE, 방금 기본 USERS (대상 데이터베이스에 액세스 할 수 없음) 대신 해당 이름의 새 테이블 스페이스를 사용하도록 스키마/사용자를 작성했습니다.

-- 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은 (는) 내 목표에 imp을 (를) 만족시킵니다.

0
masterxilo