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가 혼합되어 있습니다. 그러나 나는 그것이 버전과 관련이 있다고 생각하지 않습니다.
여기 몇 가지 문제가 있습니다.
먼저, 사용중인 다른 버전의 Oracle이 테이블 통계 오류의 원인입니다. Oracle 10g 데이터베이스 중 일부가 릴리스 2로 업그레이드되었지만 일부는 여전히 켜져 있습니다. 릴리스 1과 .DMP 파일을 서로 교환했습니다.
나를 위해 일한 해결책은 동일한 버전의 exp
및 imp
도구를 사용하여 다른 데이터베이스 인스턴스에서 내보내기 및 가져 오기를 수행하는 것이 었습니다. 동일한 PC (또는 Oracle Server)를 사용하여 모든 내보내기 및 가져 오기 명령을 실행하여 가장 쉽게 수행 할 수 있습니다.
둘째, 나는 당신이 ORA-00959: tablespace 'A_TBLSPACE' does not exist
전체 Oracle 데이터베이스에서 10g Express Edition (XE) 데이터베이스로 .DMP 파일을 가져 오려고하기 때문에 기본적으로 USERS
라는 단일 사전 정의 된 테이블 스페이스를 작성합니다. .
이 경우 다음을 수행해야합니다.
.DMP 파일을 사용하여 구조 (테이블)를 포함하는 SQL 파일을 작성하십시오.
imp <xe_username>/<password>@XE file=<filename.dmp> indexfile=index.sql full=y
전체 파일을 찾아서 바꿀 수있는 텍스트 편집기에서 색인 파일 (index.sql)을 열고 IN ORDER에서 다음 찾기 및 바꾸기 명령문을 실행하십시오 (작은 따옴표는 무시하십시오. ').
Find: 'REM<space>' Replace: <nothing>
Find: '"<source_tablespace>"' Replace: '"USERS"'
Find: '...' Replace: 'REM ...'
Find: 'CONNECT' Replace: 'REM CONNECT'
색인 파일을 저장 한 다음 Oracle Express Edition 계정에 대해 실행하십시오 (빈 XE 사용자 계정을 새로 작성하거나 새로 고치면 삭제하고 다시 작성하는 것이 가장 좋습니다).
sqlplus <xe_username>/<password>@XE @index.sql
마지막으로 동일한 계정에 대해 색인 파일을 생성 한 동일한 .DMP 파일을 실행하여 데이터, 저장 프로 시저, 뷰 등을 가져옵니다.
imp <xe_username>/<password>@XE file=<filename.dmp> fromuser=<original_username> touser=<xe_username> ignore=y
Oracle이 동일한 데이터베이스 식별자를 사용하려고 할 때 데이터베이스 작업과 같은 특정 객체를 만들려고 할 때 Oracle 오류 페이지가 표시 될 수 있습니다. 이는 다른 데이터베이스에있을 때 실패 할 가능성이 높습니다.
Oracle 10g 및 데이터 펌프를 사용하는 경우 REMAP_TABLESPACE 절을 사용할 수 있습니다. 예:
REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
나를 위해이 작업은 괜찮습니다 (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
어떤 버전의 Oracle을 사용하고 있습니까? 10g 이상인 경우 어쨌든 가져 오기/내보내기 대신 데이터 펌프를 사용해야합니다. 이 시나리오를 처리 할 수 있는지 100 % 확실하지 않지만 가능할 것으로 예상합니다.
데이터 펌프 는 10g 이상에서 exp/imp를 대체합니다. exp/imp와 매우 유사하게 작동하지만 (9i 랜드에 갇혀 있기 때문에 사용하지 않는 것 같습니다) 더 좋습니다.
다른 서버 (데이터베이스)의 다른 테이블 공간에서 두 명의 사용자를 향상시키고 싶습니다.
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
내 솔루션은 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
문제는 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] )
이를 사용하여 데이터를 새 테이블 스페이스로 다시 가져 오기 :
먼저 임시 덤프 용 디렉토리를 작성하십시오.
CREATE OR 디렉터리 교체 tempdump AS '/ temp/tempdump /';
GRANT READ, WRITE ON DIRECTORY tempdump to a;
수출:
expdp a/* 스키마 = 디렉토리 = tempdump dumpfile = adump.dmp logfile = adump.log
수입:
impdp b/* directory = tempdump dumpfile = adump.dmp logfile = bdump.log REMAP_SCHEMA = a : b
참고 : 덤프 파일은 로컬 (클라이언트) 디스크가 아닌 서버 디스크에서 저장되고 읽 힙니다.
대답은 어렵지만 실행할 수 있습니다.
상황 : 사용자 A 및 테이블 스페이스 X
테이블 스페이스 이름 바꾸기
테이블 스페이스 변경 X 이름을 Y
expdp 명령에 대한 디렉토리를 작성하십시오. en grant 권한
impdp로 덤프 가져 오기
impdp B/B 디렉토리 = DIR dumpfile = DUMPFILE.dmp logfile = LOGFILE.log REMAP_SCHEMA = A : B
그리고 그게 다야...
로컬 개발 데이터베이스 (18c xe)에서 imp
orted 된 덤프를 exp
ort (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
을 (를) 만족시킵니다.