프로덕션 데이터베이스에 대한 스키마 업그레이드를 어떻게 관리합니까?

StackOverflow https://stackoverflow.com/questions/29744

  •  09-06-2019
  •  | 
  •  

문제

통계를 실제로 사용할 수있는 간과 된 영역 인 것 같습니다.다음에 대한 모범 사례는 무엇입니까?

  • 업그레이드 절차 만들기
  • 오류 발생시 취소
  • 코드 및 데이터베이스 변경 동기화
  • 배포 전 테스트
  • 표 수정 메커니즘

    기타 ...

도움이 되었습니까?

해결책

좋은 질문입니다. (이로 인해 정규화 대 비정규 화 데이터베이스 논쟁이 끝날 가능성이 높습니다. 시작하지 않겠습니다 ... 이제 일부 입력은 괜찮습니다.)

내가했던 일들 (시간이 더 있거나 휴식이 필요할 때 더 추가 될 것임)

클라이언트 디자인-인라인 SQL의 VB 방법 (준비된 명령문 포함)이 문제를 일으키는 부분입니다. AGES는 해당 진술을 찾는 데 소비 할 수 있습니다. Hibernate와 같은 것을 사용하고 명명 된 쿼리에 SQL을 많이 넣는 경우 대부분의 SQL에 대해 단일 위치를 사용할 수 있습니다 (일부 IF 문 내부에있는 SQL을 테스트하는 것보다 더 나쁜 것은 없으며 "트리거"를 누르지 않습니다. 해당 IF 문에 대한 테스트 기준). JDBC 또는 ODBC에서 직접 SQL을 수행 할 때 최대 절전 모드 (또는 다른 orms ')를 사용하기 전에 모든 SQL 문을 객체의 공용 필드 (이름 지정 규칙 사용) 또는 속성 파일 (이름 지정 값에 대한 규칙은 PREP_STMT_xxxx라고 말합니다. 그리고 a) 테스트 케이스에서 시작시 값에 대해 리플렉션을 사용하거나 반복합니다. b) 응용 프로그램 시작 (일부 rdbms를 사용하면 실행 전에 준비된 명령문으로 사전 컴파일 할 수 있으므로 시작 후 로그인 I 시작시 prep-stmts를 미리 컴파일하여 응용 프로그램 자체 테스트를 수행합니다. 좋은 rdbms에 대한 100 개의 명령문에 대해 몇 초 밖에 걸리지 않습니다. 단 한 번뿐입니다. 그리고 그것은 내 엉덩이를 많이 절약했습니다. 한 프로젝트에서 DBA는 의사 소통을하지 않고 (다른 국가의 다른 팀) 스키마는 이유없이 밤마다 변경되는 것처럼 보였습니다. 그리고 매일 아침 시작할 때 애플리케이션이 중단 된 정확한 위치 목록을 받았습니다.

임시 기능이 필요한 경우 쿼리를위한 일종의 팩토리 역할을하는 잘 명명 된 클래스 (즉, 자동 결합 테스트에 도움이되는 이름 지정 규칙)에 넣으십시오 (예 : 쿼리 작성). 어쨌든 동등한 코드를 올바르게 작성해야 할 것입니다. 테스트 할 수있는 곳에 두십시오. 동일한 객체 또는 별도의 클래스에 몇 가지 기본 테스트 메서드를 작성할 수도 있습니다.

가능하다면 저장 프로시 저도 사용해보세요. 위와 같이 테스트하기가 조금 더 어렵습니다. 일부 db는 또한 런타임에만 컴파일 타임에 스키마에 대해 저장된 procs의 sql을 사전 검증하지 않습니다. 일반적으로 스키마 구조의 복사본 (데이터 없음)을 가져온 다음이 복사본에 대해 저장된 모든 procs를 생성하는 작업이 포함됩니다 (db 팀이 변경 한 내용이 올바르게 검증되지 않은 경우). 따라서 구조를 확인할 수 있습니다. 그러나 변경 관리의 포인트로서 저장된 procs는 훌륭합니다. 변화에 모든 것을 얻으십시오. 특히 DB 변경이 비즈니스 프로세스 변경의 결과 인 경우. 그리고 모든 언어 (java, vb 등이 변경됨)

보통 내가 사용하는 system_setting 등의 테이블도 설정합니다.이 테이블에서 우리는 VERSION 식별자를 유지합니다. 이는 클라이언트 라이브러리가이 버전의 스키마에 유효한지 연결하고 유효성을 검사 할 수 있도록하기위한 것입니다. 스키마 변경 사항에 따라 클라이언트가 스키마를 손상시킬 수있는 경우 연결을 허용하지 않습니다 (즉, db에 많은 참조 규칙이 없지만 클라이언트에 있음). 여러 클라이언트 버전을 가질 것인지 여부에 따라 다릅니다 (비 웹 앱에서 발생합니다. 즉, 잘못된 바이너리를 실행하고 있음). 배치 도구 등을 사용할 수도 있습니다. 내가 수행 한 또 다른 접근 방식은 일종의 속성 파일 또는 system_info 테이블에서 작업 버전에 대한 스키마 집합을 정의하는 것입니다. 이 테이블은 로그인시로드되고 각 "관리자"(일반적으로 대부분의 db 작업을 수행하는 일종의 클라이언트 측 API가 있음)가 해당 작업이 올바른 버전인지 확인하는 데 사용됩니다. 따라서 대부분의 작업은 성공할 수 있지만 오래된 메서드에서 실패 (일부 예외 발생)하고 그 이유를 알려줍니다.

스키마 변경 관리-> 테이블을 업데이트하거나 새 테이블에 1-1 관계를 추가합니까?

es? 이런 이유로 항상 뷰를 통해 데이터에 액세스하는 많은 상점을 보았습니다. 이렇게하면 테이블 이름, 열 등을 변경할 수 있습니다. COM의 인터페이스와 같은 뷰를 실제로 처리한다는 아이디어를 가지고 놀았습니다. 즉. 새로운 기능 / 버전에 대한 새로운 VIEW를 추가합니다. 종종 여기서 얻을 수있는 것은 테이블 형식을 가정하는 많은 보고서 (특히 최종 사용자 사용자 정의 보고서)를 가질 수 있다는 것입니다. 뷰를 통해 새로운 테이블 형식을 배포 할 수 있지만 기존 클라이언트 앱을 지원합니다 (성가신 임시 보고서를 모두 기억하세요).

또한 업데이트 및 롤백 스크립트를 작성해야합니다. 그리고 다시 TEST, TEST, TEST ...

------------ OKAY-이것은 약간의 무작위 토론 시간입니다. --------------

사실 우리가 같은 문제를 안고있는 대규모 상업 프로젝트 (예 : 소프트웨어 상점)가있었습니다. 아키텍처는 2 계층이었고 PHP와 비슷하지만 PHP 이전의 제품을 사용하고있었습니다. 같은 것. 다른 이름. 어쨌든 버전 2에 들어 왔습니다 ...

업그레이드하는 데 많은 비용이 들었습니다. 많이. 즉. 현장에서 몇 주 동안 무료 컨설팅 시간을 제공합니다.

새로운 기능을 추가하거나 코드를 최적화하려는 시점에 이르렀습니다. 기존 코드 중 일부는 저장 프로 시저를 사용했기 때문에 코드를 관리 할 수있는 공통점이있었습니다. 그러나 다른 영역은 HTML에 포함 된 SQL 마크 업이었습니다. 빠르게 시장에 출시하는 데는 좋았지 만 새로운 기능이 상호 작용할 때마다 테스트 및 유지 관리 비용이 두 배 이상 증가했습니다. 그래서 우리가 PHP 유형 코드를 꺼내고 데이터 레이어 (2001-2002 년, ORM 이전 등)를 추가하고 많은 새로운 기능 (고객 피드백)을 추가 할 때이 문제는 업그레이드를 엔지니어링하는 방법에 대해 살펴 보았습니다. 시스템에. 업그레이드를 올바르게 수행하려면 많은 비용이 들기 때문에 큰 문제입니다. 자, 대부분의 패턴과 사람들이 어느 정도 에너지를 가지고 논의하는 다른 모든 것들은 실행중인 OO 코드를 다룹니다.하지만 데이터가 a)이 논리에 통합되어야한다는 사실은 어떻습니까? b) 의미와 구조도 데이터는 시간이 지남에 따라 변경 될 수 있으며 종종 데이터가 작동하는 방식으로 인해 해당 데이터-> 임시보고 또는 복잡한 사용자 정의보고 및 배치 작업이 필요한 클라이언트 조직의 많은 하위 프로세스 / 애플리케이션으로 끝납니다. 맞춤 데이터 피드 등에 대해 수행되었습니다.

이 점을 염두에두고 저는 필드에서 약간 왼쪽으로 플레이하기 시작했습니다. 또한 몇 가지 가정이 있습니다. a) 데이터는 쓰기보다 많이 읽습니다. b) 업데이트가 발생하지만 은행 수준에서는 발생하지 않습니다. 1 초에 1 ~ 2 회 아이디어는 CONCRETE 테이블 세트 (스키마 변경에 따라 달라짐)를 통해 클라이언트가 데이터에 액세스하는 방법에 COM / 인터페이스보기를 적용하는 것이 었습니다. 업데이트, 삭제, 삽입 및 읽기와 같은 각 유형 작업에 대해 별도의보기를 만들 수 있습니다. 이것은 중요하다. 뷰는 테이블에 직접 매핑되거나 실제 업데이트 또는 삽입 등을 수행하는 더미 테이블을 트리거 할 수 있습니다. 제가 실제로 원했던 것은 크리스탈 보고서 등에서 여전히 사용할 수있는 일종의 트랩 가능한 수준 간접 지정이었습니다. -삽입, 업데이트 및 삭제의 경우 저장된 procs를 사용할 수도 있습니다. 그리고 제품의 각 버전에 대한 버전이 있습니다. 이렇게하면 버전 1.0에 해당 버전의 스키마가 있고 테이블이 변경된 경우 버전 1.0 VIEWS를 사용할 수 있지만 필요에 따라 새 테이블에 매핑하는 새로운 백엔드 로직이 있지만 지원할 버전 2.0 뷰도 있습니다. 새 필드 등. 이것은 실제로 임시보고를 지원하기위한 것이 었습니다. 코더가 아닌 비즈니스 담당자라면 제품을 보유한 이유의 전체 지점 일 것입니다. (귀하의 제품은 엉망이 될 수 있지만 세계에서 최고의 보도를 보유하고 있다면 여전히 이길 수 있지만 그 반대는 사실입니다. 귀하의 제품은 현명한 최고의 기능이 될 수 있지만보고가 더 나쁠 경우 매우 쉽게 풀릴 수 있습니다.)

알겠습니다. 이러한 아이디어가 도움이되기를 바랍니다.

다른 팁

리퀴베이스

liquibase.org :

  1. 최대 절전 모드 정의를 이해합니다.
  2. 최대 절전 모드보다 더 나은 스키마 업데이트 SQL을 생성합니다.
  3. 데이터베이스에 적용된 업그레이드를 기록합니다.
  4. 2 단계 변경을 처리합니다 (예 : "foo"열을 삭제 한 다음 다른 열의 이름을 "foo"로 변경)
  5. 조건부 업그레이드의 개념을 처리합니다.
  6. 개발자는 실제로 커뮤니티의 의견을 경청합니다 ( "in"군중이나 초보자가 아닌 경우 최대 절전 모드로-기본적으로 무시됩니다.)

    http://www.liquibase.org

의견

애플리케이션이 스키마 업데이트를 처리하지 않아야 합니다.이것은 일어나기를 기다리는 재앙입니다.데이터는 애플리케이션보다 오래 지속되며 여러 애플리케이션이 동일한 데이터 (예 : 프로덕션 앱 +보고 앱)로 작업을 시도하자마자 둘 다 동일한 기본 회사 라이브러리를 사용할 가능성이 있습니다.자신의 DB 업그레이드를 수행하십시오 ... 엉망으로 즐기십시오.

저는 SQL 패키지를 생성하여 데이터베이스 스키마를 업데이트하는 데 도움이되는 Red Gate 제품의 열렬한 팬입니다..버전 관리 및 롤백을 돕기 위해 데이터베이스 스크립트를 소스 제어에 추가 할 수 있습니다.

일반적으로 내 규칙은 "애플리케이션이 자체 스키마를 관리해야합니다."입니다.

즉, 스키마 업그레이드 스크립트는 애플리케이션 업그레이드 패키지의 일부이며 애플리케이션이 시작될 때 자동으로 실행됩니다. 오류가 발생하면 응용 프로그램이 시작되지 않고 업그레이드 스크립트 트랜잭션이 커밋되지 않습니다. 단점은 애플리케이션이 스키마에 대한 전체 수정 액세스 권한을 가져야한다는 것입니다 (이는 DBA를 괴롭 힙니다).

나는 테이블 구조를 관리하기 위해 Hibernates SchemaUpdate 기능을 사용하여 큰 성공을 거두었습니다. 실제 데이터 초기화 및 가끔 열 제거 만 처리하도록 업그레이드 스크립트를 그대로 둡니다 (SchemaUpdate는이를 수행하지 않음).

테스트와 관련하여 업그레이드는 애플리케이션의 일부이므로 테스트는 애플리케이션 테스트주기의 일부가됩니다.

이후 검토 : 여기에있는 다른 게시물의 일부 비판에 참여하면서 규칙에 "자신의 것"이라고 적혀 있습니다. 일반적으로 제품으로 판매되는 소프트웨어의 경우처럼 애플리케이션이 스키마를 소유 하는 경우에만 실제로 적용됩니다. 소프트웨어가 다른 소프트웨어와 데이터베이스를 공유하는 경우 다른 방법을 사용하십시오.

모두 중요한 주제이지만 여기에 업데이트 권장 사항이 있습니다.

플랫폼을 지정하지 않았지만 NANT 빌드 환경에서는 타란티노 .커밋 할 준비가 된 모든 데이터베이스 업데이트에 대해 RedGate 또는 다른 도구를 사용하여 변경 스크립트를 만듭니다.프로덕션으로 빌드 할 때 Tarantino는 스크립트가 데이터베이스에서 실행되었는지 확인합니다 (추적을 위해 데이터베이스에 테이블을 추가 함).그렇지 않은 경우 스크립트가 실행됩니다.데이터베이스 버전 관리에서 모든 수동 작업 (읽기 : 인적 오류)이 필요합니다.

Pat이 말했듯이 liquibase를 사용하십시오.특히 자체 개발 데이터베이스를 가진 여러 개발자가있는 경우 프로덕션 데이터베이스의 일부가 될 변경 작업

현재 하나의 프로젝트에서와 같이 개발자가 하나 뿐인 경우 (ha) SQL 텍스트 파일로 스키마 변경 사항을 CVS 저장소에 커밋하고 코드가 생성 될 때 프로덕션 서버에서 일괄 적으로 체크 아웃변경 사항이 발생합니다.

하지만 liquibase는 그것보다 더 잘 정리되어 있습니다!

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