sourcetip

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

fileupload 2023. 2. 13. 20:38
반응형

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

이 부분은 간과되고 있는 부분이기 때문에 실제로 통찰력이 필요한 것 같습니다.베스트 프랙티스는 무엇입니까?

  • 업그레이드 절차 작성
  • 오류 발생 시 철회
  • 코드 및 데이터베이스 변경 동기화
  • 도입 전 테스트
  • 표를 수정하는 방법

기타...

리퀴베이스

liquibase.org:

  1. 동면 정의를 이해합니다.
  2. 휴지 상태보다 더 나은 스키마 업데이트 SQL을 생성합니다.
  3. 데이터베이스에 어떤 업그레이드가 이루어졌는지 기록합니다.
  4. 2단계 변경(즉, 열 "foo"를 삭제하고 다른 열의 이름을 "foo"로 변경)을 처리합니다.
  5. 조건부 업그레이드 개념을 처리합니다.
  6. 개발자는 실제로 커뮤니티의 소리에 귀를 기울인다('인' 군중이나 초보자가 아닌 경우, 동면 상태로, 기본적으로 무시된다).

http://www.liquibase.org

의견.

응용 프로그램은 스키마 업데이트를 처리해서는 안 됩니다.이것은 일어나기를 기다리고 있는 재앙이다.데이터는 응용 프로그램보다 오래되어 여러 응용 프로그램이 동일한 데이터(예를 들어 프로덕션 응용 프로그램+리포트 응용 프로그램)로 작업하려고 하면 두 응용 프로그램 모두 동일한 기본 회사 라이브러리를 사용할 수 있습니다.그 후 두 프로그램 모두 자체 DB 업그레이드를 수행하기로 결정합니다.그 난장판을 즐겨라.

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

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

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

Hibernates SchemaUpdate 기능을 사용하여 테이블 구조를 관리하는 데 큰 성공을 거두었습니다.업그레이드 스크립트는 실제 데이터 초기화 및 열 삭제만 처리하도록 합니다(SchemaUpdate에서는 처리되지 않습니다).

테스트에 관해서는 업그레이드는 어플리케이션의 일부이므로 어플리케이션 테스트 사이클의 일부가 됩니다.

심사숙고:여기 있는 다른 게시물들의 일부 비판에 동참하여, 규칙에는 "그것은 자신의 것"이라고 쓰여 있습니다.일반적으로 제품으로 판매되는 소프트웨어의 경우와 마찬가지로 애플리케이션이 스키마를 소유하고 있는 경우에만 적용됩니다.소프트웨어가 다른 소프트웨어와 데이터베이스를 공유하는 경우 다른 방법을 사용합니다.

좋은 질문입니다. (데이터베이스 정규화 대 비 정규화 논쟁으로 끝날 가능성이 높습니다.)시작은 안 할 건데...네, 입력해 주세요.)

즉석에서 한 일(시간이 더 있거나 휴식이 필요할 때 추가)

클라이언트 설계 - 여기서 인라인 SQL의 VB 메서드(준비된 스테이트먼트를 사용하더라도)에 문제가 발생합니다.당신은 그 진술들을 찾는 데 오랜 시간을 쓸 수 있습니다.Hibernate와 같은 것을 사용하여 명명된 쿼리에 SQL을 많이 넣으면 대부분의 SQL에 대해 단일 위치를 갖게 됩니다(일부 IF 문 안에 있는 SQL을 테스트하려고 시도하는 것과 마찬가지로 IF 문 테스트에서 "트리거" 기준에 도달하지 않는 것).휴지 상태(또는 다른 orms')를 사용하기 전에 JDBC 또는 ODBC에서 직접 SQL을 수행할 때 모든 SQL 문을 개체의 퍼블릭 필드(이름 지정 규칙 포함) 또는 속성 파일(PREP_STMT_xxxx 값 명명 규칙 포함)로 저장합니다.또한 a) 테스트 케이스 b) 어플리케이션 부팅 시 값을 반영 또는 반복하여 사용합니다(일부 rdbms에서는 실행 전에 준비된 스테이트먼트를 사용하여 사전에 컴파일할 수 있습니다.따라서 부팅 후 로그인 시 어플리케이션의 셀프테스트를 실시합니다.좋은 rdbms에 대해 100개의 스테이트먼트를 해도 그것은 몇 초밖에 되지 않으며, 단 한 번뿐입니다.그리고 그것은 내 엉덩이를 많이 구했다.한 프로젝트에서는 DBA가 (다른 나라의 다른 팀) 커뮤니케이션을 하지 않아 스키마가 아무 이유 없이 야간에 변경되는 것 같았습니다.또, 매일 아침, 기동시에, 애플리케이션을 망가뜨린 장소의 리스트를 입수했습니다.

애드혹 기능이 필요한 경우 쿼리의 팩토리(즉, 자동 결합 테스트에 도움이 되는 이름 지정 규칙)로 적절하게 명명된 클래스에 추가합니다.쿼리를 작성합니다).어쨌든 같은 코드를 올바르게 작성해야 합니다.그냥 테스트할 수 있는 곳에 두면 됩니다.같은 오브젝트 또는 다른 클래스에 몇 가지 기본적인 테스트 방법을 작성할 수도 있습니다.

가능하면 스토어드 프로시저도 사용해 보겠습니다.위와 같이 테스트하기가 조금 어렵습니다.또한 일부 DB는 컴파일 시에만 저장된 proc의 SQL을 스키마에 대해 사전 검증하지 않습니다.일반적으로 스키마 구조의 복사본(데이터 없음)을 가져온 다음 이 복사본에 대해 저장된 모든 프로세스를 만듭니다(변경 내용을 수행한 DB 팀이 DID를 올바르게 검증하지 못한 경우).따라서 구조를 확인할 수 있지만, 변경 관리 측면에서는 저장된 프로세서가 매우 좋습니다.변경 시 모두 알 수 있습니다.특히 DB 변경이 비즈니스 프로세스 변경의 결과인 경우에는 더욱 그렇습니다.또한 모든 언어(java, vb 등)에 변경이 적용됩니다.

system_setting 등이라고 하는 테이블도 자주 셋업하고 있습니다.이 표에서는 VERSION ID를 유지합니다.이를 통해 클라이언트 라이브러리가 이 버전의 스키마에 대해 유효한지 여부를 연결하고 검증할 수 있습니다.스키마의 변경 사항에 따라 스키마를 손상시킬 수 있는 경우(즉, 클라이언트가 스키마를 손상시킬 수 있는 경우) 클라이언트의 연결을 허용하지 않을 수 있습니다.DB에 참조 규칙이 많지 않지만 클라이언트에 있습니다.)클라이언트 버전도 여러 개(NON - 웹 응용 프로그램, 즉 잘못된 바이너리를 실행하고 있는 경우)에 따라 달라집니다.배치 도구 등을 사용할 수도 있습니다.또 다른 접근법은 일종의 속성 파일 또는 system_info 테이블에서 동작하는 버전의 스키마를 정의하는 것입니다.이 테이블은 로그인 시 로드되며 각 "manager"(대부분의 db 작업을 수행하기 위한 클라이언트 측 API를 가지고 있습니다)가 올바른 버전인지 확인하기 위해 사용합니다.따라서 대부분의 작업은 성공할 수 있지만 오래된 메서드에서 실패(일부 예외 발생)할 수도 있으며 그 이유를 알 수 있습니다.

스키마 변경 관리 -> 테이블을 갱신하거나 새로운 테이블에 1-1 관계를 추가합니까?이러한 이유로 항상 뷰로 데이터에 접속하는 상점을 많이 보았습니다.이를 통해 테이블 이름, 열 등을 변경할 수 있습니다.실제로 뷰를 COM의 인터페이스와 같이 취급하는 것을 생각해 왔습니다.즉, 새로운 기능/버전에 새로운 VIEW를 추가하는 것입니다.대부분의 경우 테이블 형식을 가정한 보고서(특히 최종 사용자의 사용자 지정 보고서)가 대량으로 생성될 수 있습니다.뷰를 사용하면 새로운 테이블 형식을 도입할 수 있지만 기존 클라이언트 앱을 지원할 수 있습니다(모든 귀찮은 애드혹 보고서를 기억하십시오).

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

-------------------------------------------------------------------------------------------------------------------------

실제로 같은 문제가 발생한 대규모 상업 프로젝트(소프트웨어 숍)가 있었습니다.아키텍처는 2계층이었고 PHP와 비슷한 제품을 사용했지만 pre-php를 사용했습니다.같은 거, 다른 이름어쨌든 버전 2에 들어갔는데...

업그레이드를 하는 데 많은 비용이 들었습니다.많은 경우, 즉 현장에서 몇 주간의 무료 컨설팅 시간을 줍니다.

그리고 새로운 기능을 추가하거나 코드를 최적화해야 할 지경에 이르렀습니다.기존 코드 중 일부는 스토어드 프로시저를 사용했기 때문에 코드를 관리할 수 있는 공통 포인트가 있었습니다.다른 부분은 html에 포함된 SQL 마크업입니다.이는 빠른 출시에는 매우 도움이 되었지만, 새로운 기능을 상호 운용할 때마다 테스트 및 유지 보수 비용이 최소 2배 이상 증가했습니다.php 타입의 코드를 추출해, 데이터 레이어(이것은 2001~2002년, ORM의 이전 등)를 도입해, 많은 신기능(고객의 피드백)을 추가하는 것을 검토했을 때에, 시스템에 업그레이드를 엔지니어링 하는 방법에 관한 이 문제를 검토했습니다.업그레이드에는 많은 비용이 들기 때문에 이는 매우 중요합니다.대부분의 패턴과 다른 모든 것은 어느 정도 에너지로 논의되는 OO 코드를 다루고 있습니다.그러나 데이터가 이 논리에 통합되어야 한다는 사실은 어떨까요?b) 데이터의 의미와 구조는 시간이 지남에 따라 변경될 수 있으며, 많은 하위 프로세스/애플리케이션으로 귀결되는 경우가 많습니다.데이터 -> 애드혹리포트 또는 복잡한 커스텀리포트 및 커스텀 데이터 피드 등에 대해 수행된 배치 작업이 필요한 고객 조직의 ns.

이 점을 염두에 두고, 나는 조금 남은 것을 가지고 놀기 시작했다.또한 몇 가지 가정도 있습니다.a) 데이터는 쓰기보다 많이 읽힌다.b) 갱신은 이루어지지만 은행 수준에서는 이루어지지 않는다.1초에 1, 2회 발언할 수 있습니다.

COM/Interface 뷰를 COM/Interface 뷰에 적용하여 (스키마 변경에 따라 달라짐) COMETRIC 테이블 세트를 통해 데이터에 액세스하는 방법을 제안했습니다.업데이트, 삭제, 삽입 및 읽기 작업 유형별로 별도의 보기를 만들 수 있습니다.이게 중요해요.뷰는 테이블에 직접 매핑되거나 실제 업데이트 또는 삽입 등을 수행하는 더미 테이블을 트리거할 수 있습니다.제가 실제로 원했던 것은 Crystal Report 등에서 사용할 수 있는 일종의 트래퍼블 수준의 간접입니다.주의 - 삽입, 업데이트 및 삭제에 대해서는 저장된 proc를 사용할 수도 있습니다.그리고 당신은 제품의 각 버전에 대한 버전을 가지고 있었다.따라서 버전 1.0에는 스키마 버전이 있고 테이블이 변경되어도 버전 1.0 VIEWS는 있지만 필요에 따라 새로운 테이블에 매핑할 수 있는 새로운 백엔드 로직이 있지만 새로운 필드 등을 지원하는 버전 2.0 뷰도 있습니다.이는 애드혹리포트를 지원하기 위한 것일 뿐입니다.코더가 아닌 비즈니스 담당자가 제품을 사용하는 이유의 핵심이 될 수 있습니다.(당신의 제품은 형편없을 수 있지만 세계 최고의 보고서를 가지고 있다면 그 반대입니다.당신의 제품은 최고의 기능을 갖추고 있을 수 있지만, 보고가 나쁘면 쉽게 느슨해질 수 있습니다.)

좋아요, 그 아이디어들이 도움이 됐으면 좋겠네요.

이것들은 모두 중요한 토픽이지만, 여기 업데이트를 위한 권장 사항이 있습니다.

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

iBA에 대해 좋은 얘기를 많이 들었어요.TIS 3 스키마 이행 시스템:

사용자 가이드: http://svn.apache.org/repos/asf/ibatis/java/ibatis-3/trunk/doc/en/iBATIS-3-Migrations.pdf

팻의 말대로 리퀴바제를 사용하세요.특히 자체 개발 데이터베이스를 가진 여러 개발자가 프로덕션 데이터베이스의 일부가 되는 변경 작업을 수행하는 경우.

현재 진행 중인 하나의 프로젝트에서와 같이 하나의 dev가 있는 경우(ha)에는 SQL 텍스트 파일로 스키마 변경을 CVS repo로 커밋합니다.CVS repo는 코드 변경 시 운영 서버에서 일괄 체크아웃합니다.

하지만 리퀴베이스는 그것보다 더 잘 짜여져 있어!

언급URL : https://stackoverflow.com/questions/29744/how-do-you-manage-schema-upgrades-to-a-production-database

반응형