큰 데이터 이동


11

schema1.table1에서 new schema2.table2로 수십억 행을 이동하고 싶습니다. 여기서 table2는 table1에서 리팩토링 된 행입니다. 따라서 테이블 구조가 다릅니다. table1과 table2는 모두 분할되었지만 table2는 비어 있습니다. 이 두 스키마는 모두 동일한 Oracle DB에 있습니다. 이 데이터 마이그레이션을 수행하는 성능 효율적인 방법은 무엇입니까? 맨 끝에서만 커밋을 수행하거나 증분 커밋을 선택 하시겠습니까? 즉, 몇 시간이 걸리는 작업의 99 %를 완료 한 후 데이터 마이그레이션이 실패한다고 가정 해 봅시다. 지금 롤백합니까? 증분 커밋을 수행하면 실패를 어떻게 처리합니까?

답변:


8

병렬 INSERT APPENDNOLOGGING이 작업을 수행 할 수있는 방법이 될 것입니다, 모든 NOLOGGING 작업과 마찬가지로, 완료에 즉시 백업을 수행. 인덱스를 먼저 사용할 수 없음으로 표시하고 제약 조건을 비활성화하고 테이블을 변경하고 작업을 수행 한 다음 제약 조건을 다시 활성화하십시오.

Append는 Oracle이 항상 현재 상위 워터 마크를 초과하는 여유 공간을 확보하게하므로 세그먼트의 공간을 재사용하는 데 비효율적이지만 자유 목록 및 UNDO 오버 헤드를 피할 수는 없습니다. 어떤 이유로 든 다시 시작해야하는 경우에는 TRUNCATE하지 마십시오 DELETE.

증분 커밋에 관해서는 데이터가 어떻게 세그먼트 화되는지에 달려 있습니다. 한 번에 한 달의 가치 이동을 쉽게 말할 수 있습니까 (예 : 파티셔닝 구성표가 소스 및 대상에서 동일합니까)? 어떤 술어를 만족시켜야한다면 분명히 속도가 느려질 것입니다. 작업이 논리적으로 실패하지 않는지 (예 : 소스 및 대상의 호환되지 않는 데이터 유형) 테스트 한 후 충분한 자원을 할당하고 한 번의 트랜잭션으로 진행하십시오. 행운을 빕니다!


온라인 redef 사용이 느리다는 것을 알고 있지만 dbms_redef가 위의 시나리오를 지원하지 않을 수도 있습니까?
John

3

파티션 구성표가 동일하면 (표 1의 part a 데이터가 표 2의 partition a 등으로 이동) 여러 세션을 진행하고 각 세션에서 '자신의'파티션에 데이터를 추가하게합니다. 이것은 많은 잠금을 방지하고 최고 속도를 갖습니다. 하드웨어에 따라 목까지 HBA 카드를 채울 수 있습니다. 각 파티션에 대해 몇 행 이상을 가정하면 모든 파티션에 대한 커밋은 문제가되지 않으며 확실히 그렇게 할 것입니다. 마이그레이션 중에 애플리케이션이 다운되었다고 가정하면 폴백은 간단합니다. 최소한 두 번째 실행이 발생하기 전에 앱이 데이터를 변경 한 부분에 대해서는 다시 시도하기 전에 앱을 변경하지 않고 table2의 파티션을 자르십시오.

이게 도움이 되길 바란다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.