2012-02-08 2 views
1

연결되지 않고 연결 불가능한 2 개의 별도 Oracle 데이터베이스가 있습니다. 가능한 한 신속하고 고통없이 정보를 다른 사람에게 제공해야합니다.2 개의 별도 Oracle 데이터베이스 간 데이터 병합

일반적으로이 상황에서 병합을 완료 할 때까지 가져올 데이터 (기본적으로 데이터를 저장하기위한 임시 테이블)의 준비 영역을 만들 때까지 지금까지 무엇을했는지. 의 데이터를 모두으로 복사하여 해당 준비 영역의 소스에서 필요합니다. 그런 다음 두 테이블이 연결되어있는 것처럼 데이터를 병합합니다. 즉, 그 당시 필요하지 않은 데이터를 필터링 할 수 있다는 것을 의미합니다.

여기 현재의 문제가 있습니다. 원본 테이블은 이며 매우 크고 완전히 색인이 생성되지 않았습니다 (내가 제어 할 수없는 것, 우). 즉, 어떤 방식 으로든 필터를 적용하지 않으면 이 (가)으로 필요한 데이터를 가져올 수 있습니다. 또한 대상 테이블은 실제로 수행 할 작업을 수행하기 위해 상대적으로 작은 데이터 하위 집합 만 필요합니다. 한 번에 수천 개 또는 수 개의 고유 한 행이 필요합니다. 이 경우에 나는 일 수있는 데이터의 모든을 복사하고 싶지 않습니다. 난 단지 정확히 데이터를 복사하거나 가능한 한 가까이에 복사하고 싶습니다.

TL : DR 버전

정확히 어떻게 나는 그들이 서로 통신 할 수없는 경우 대상 테이블에서 필요에 따라 소스 테이블에 나의 선택 제한합니까?

예를 들어 대상에 필요한 데이터의 ID를 선택하고이를 기반으로 원본 테이블에 대한 쿼리를 작성할 수 있습니다. 그러나 이로 인해 수천 개의 OR 절이 포함 된 쿼리가 생성 될 수 있습니다.

SELECT x, y FROM z WHERE (ID = 1 OR ID = 2 ... OR ID = 10000 OR ID = 10001...) 
또는 이와 비슷한 결과가 발생할 수 있습니다. 그것을하는 더 좋은 방법이 있습니까?

+1

두 데이터베이스가 서로 통신 할 수없는 경우에도 두 데이터베이스와 동시에 통신 할 수 있도록 클라이언트를 배치 할 수 있습니까? –

+0

당신이 필요한 것을 어떻게 알았습니까? 특정 날짜 이후의 새로운 행인가, 아니면 좀 더 미묘한 것입니까? – Gaius

+0

특정 날짜 이후 추가 된 외래 키의 고유 ID 집합입니다. 따라서 초기 선택은 "SELECT DISTINCT FOREIGN_KEY_ID from TABLEX WHERE DATE_ADDED> '2012-01-01';" –

답변

3

두 개의 oracle 데이터베이스 사이에 일시적으로 dblink를 만들 수 있습니까? 이렇게하면 서로 다른 두 데이터베이스의 테이블을 참조하는 SQL 문을 작성할 수 있습니다.

+0

나는 그들 중 하나에 대한 실제 DBA가 아니며 소스에 대한 SELECT 권한과 대상에 대한 SELECT, INSERT, UPDATE 및 DELETE 권한에 거의 제한되어 있습니다. dblink가 DBA와 독립적으로 수행 될 수없는 경우가 아니라면 이는 선택 사항이 아닙니다. 그것이 독립적이라면, 그것은 내가해야 할 일처럼 들립니다. –

+0

하나를 만들면 훨씬 쉽게 만들 수 있습니다. DBA와 대화를 나누고 DBA와 연락을 취하십시오. –

+0

분명히 dblink가 반드시 공개해야하는 소스에 액세스 할 수없는 것들이 있습니다. 그게 기술의 실패, 또는 ​​인력의 실패인지 모르겠지만, 그것은 그들의 최종 답변입니다. –

1

방화벽이나 DB 인스턴스가 통신하지 못하게하는 것이 있습니까?
그렇다면 항상 원본에서 탭으로 구분 된 데이터 세트로 추출한 다음 대상에서로드하십시오. 선택 항목은 다음과 유사 할 수 있습니다.

SELECT x, y FROM z WHERE ID IN (1, 2, ..., 10000, 10001, ...) 

목록 항목이 너무 많으면 항목을 임시 테이블에 넣고 조인 할 수 있습니다. OR 톰 카이트의 예를 수행 할 수 http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:210612357425 http://tkyte.blogspot.com/2006/06/varying-in-lists.html

가장 쉬운 것은 대상 인스턴스에서 인스턴스를 소스에 연결하고, 그 다음 말 예 :

insert into staging (SELECT x, y FROM [email protected] WHERE ID IN (1, 2, ..., 10000, 10001, ...)) 
0

소스에 ID 세트를로드하는 것이 좋습니다. 이것은 잠재적으로 일상적으로해야 할 필요가 있다고 들린다. 소스에 정점 응용 프로그램을 넣을 수 있습니까?

요즘에는 ID가 포함 된 csv를 선언적으로로드 할 수있는 응용 프로그램을 설정할 수있는 표준 응용 프로그램 기능이 있습니다 (또는 APEX 인터페이스에서 데이터 옵션을 제공 할 수 있습니다). 필요한 행 및 당신은 csv로 그들을 다운로드 할 수 있습니다 ... 난 10 000 행이 당신 에게이 기술과 어떤 문제를 줄 생각하지 않아요)

에이펙스는이 매우 빠르고 간단하게 만들 수 있어야합니다!

0

dbms_output을 사용하여 원본 데이터베이스의 데이터를 배열로 가져올 수 있습니다. 그런 다음 select 절에서 배열을 사용하십시오. 파일에

PL/SQL procedure successfully completed. 

OBJECT_ID OBJECT_NAME 
---------- ------------------------------ 
     100 ORA$BASE 
     116 DUAL 

스풀 쿼리 결과 및 대상 DB에로드 : 이것은 SQLPLUS

VARIABLE cur REFCURSOR 

declare t DBMSOUTPUT_LINESARRAY; 
    numlines integer; 
    c sys_refcursor; 
begin 
    dbms_output.enable; 
    dbms_output.put_line(100); 
    dbms_output.put_line(116); 
    -- add more object ids .... 
    dbms_output.get_lines(t,numlines); 
    open :cur for select object_id,object_name 
    from all_objects o where o.object_id in 
    (select * from table(t)); 
end; 
/

print cur 

에서 어떻게 작동하는지 것은 나에게 제공합니다.