문제

우리는 큰 데이터 세트를 가진 몇몇 고객이 있으며 업그레이드 절차 중에 다양한 테이블의 스키마를 수정해야합니다 (일부 열 추가, 다른 열 변경, 때로는 데이터 유형을 변경하지만 드물다).

이전에는 새로운 스키마가있는 임시 테이블을 통해 원본을 삭제하고 온도 테이블을 바꾸는 것이지만 사용하여 극적으로 속도를 높이기를 바라고 있습니다. ALTER table ... 대신에.

내 질문은 데이터 무결성 및 오류 처리 문제를 고려해야 할 사항입니다. 트랜잭션에서 테이블에 대한 모든 변경 사항을 동봉해야합니까 (그렇다면 어떻게?) DBMS가 변경 작업에 대한 원자력과 무결성을 보장합니까?

업그레이드를 시작하기 전에 고객이 데이터를 백업하는 것이 좋습니다.

우리는 SQLServer 2005와 Oracle을 대상으로해야하지만, 다른 접근법이 필요한 경우 조건부 코드를 추가 할 수 있습니다.

도움이 되었습니까?

해결책

Oracle에 대한 의견 :

  • 테이블 변경은 DDL이므로 트랜잭션의 개념은 적용되지 않습니다. 모든 DDL 문은 작업 기간 동안 테이블을 잠그고 성공하거나 실패합니다.

  • (Nullable!) 열을 추가하거나 기존 열 이름을 바꾸는 것은 비교적 가벼운 프로세스이며 테이블 잠금을 얻을 수있는 경우 아무런 문제가 없습니다.

  • 구속 조건을 추가/수정하는 경우 (NULL 또는 기타 복잡한 검사 제약 조건이 아님) Oracle은 ENABLE NOVALIDATE 절을 제약 조건 DDL에 추가하지 않는 한 기존 데이터를 확인합니다. 기존 데이터의 검증은 큰 테이블의 긴 프로세스가 될 수 있습니다.

  • SQL*Plus 스크립트로 업그레이드를 스크립팅하는 경우 "SQLERROR EXIT SQL.SQLCODE"지시 사항을 사용하여 "SQLERROR EXIT SQL.SQLCODE"지시를 사용하여 많은 두통을 저장하십시오. 업그레이드가 더 쉽습니다.

  • 트랜잭션을 제어하거나 놓칠 수없는 라이브 시스템에서 업그레이드를 수행 해야하는 경우, Oracle DBMS_REDEFINITION 패키지 사용을 고려하십시오. Oracle DBMS_REDEFINITION 패키지를 고려하십시오.이 패키지는 자동으로 임시 테이블의 임시 구성 및 트리거를 생성하여 기내 트랜잭션을 캡처하여 테이블을 재정의합니다. 백그라운드에서". 경고 -이 옵션에 대한 많은 작업과 가파른 학습 곡선.

다른 팁

SQL Server를 사용하는 경우 DDL 문은 트랜잭션이므로 트랜잭션을 마무리하십시오 (이것은 Oracle에 적용되지 않는다고 생각합니다).

업그레이드를 특정 기능과 함께 개별 패치로 나눕니다. 적용되는 패치가 a database_patch_history 테이블, 어떤 패치가 적용되었는지 쉽게 알 수 있고 다시 롤백하는 방법을 쉽게 알 수 있습니다.

당신이 말했듯이, 시작하기 전에 백업을하는 것이 중요합니다.

나는 과거에 이와 같은 변화를해야했고 항상 데이터 손실에 대해 매우 편집증이었다. 이러한 위험을 완화하기 위해 스키마와 데이터의 대상 데이터베이스를 가능한 한 가깝게 반영하는 "샌드 박스"데이터베이스에 대해 수많은 테스트를 수행했습니다. 응용 프로그램의 다른 영역과 마찬가지로 롤아웃하기 전에 가능한 한 많은 프로세스를 테스트하십시오.

예를 들어 Varchar를 INT로 변경하는 등 데이터 유형의 열을 극적으로 변경하면 DBMS가 당황하고 해당 데이터를 잃게 될 것입니다. 운 좋게도 오늘날 DBMS는 데이터를 잃지 않고 일부 데이터 유형 변환을 수행 할만 큼 지능적이지만 변경시 IT를 손상시킬 위험을 실행하고 싶지는 않습니다.

열을 바꾸어 데이터를 잃어서는 안되며 새 열을 추가하여 확실히하지 않아야합니다. 걱정 해야하는 데이터에 대한 데이터를 이동할 때입니다.

먼저 스키마와 데이터 전체 테이블을 백업하므로 순간 통지에서 이전 스키마로 롤백 할 수 있습니다. 둘째, 당신이 만들려고하는 변경을보고, 그들이 얼마나 과감한 지 확인하십시오 - 변화가 필요한 것을 정확하게 알아 내십시오. 데이터 유형 변환을 사용하는 경우 해당 데이터가 먼저 3 개의 열, 외국 키 (ID 또는 행을 찾을 수있는 모든 것을 찾을 수 있음), 기존 데이터 및 새 열을 사용하여 해당 데이터를 중개자 테이블로 푸시합니다. 그런 다음 이전 데이터를 새 열로 직접 푸시하거나 응용 프로그램 수준에서 변환하십시오.

그것이 올바른 유형에 있고 모든 것이 성공적이었을 때, Alter 문을 실행하고 데이터베이스를 다시 채 웁니다! 할 수있을만큼 간단하고 논리적 사고 과정이 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top