문제

괜찮습니다 그것을 실행하는 최대 절전 모드로 구성한 응용 프로그램 hbm2ddl.auto=update 데이터베이스를 업데이트 스키마 생산 환경에서는?

도움이 되었습니까?

해결책

아니요, 안전하지 않습니다.

Hibernate 팀의 최선의 노력에도 불구하고 자동 업데이트에 의존 할 수는 없습니다. 생산 중. 자신의 패치를 작성하고 DBA로 검토 한 다음 테스트 한 다음 수동으로 적용하십시오.

이론적으로, if HBM2DDL 업데이트 개발에서 일하면서 생산에서도 작동해야합니다. 그러나 실제로는 항상 그런 것은 아닙니다.

괜찮더라도 최적이 될 수 있습니다. DBA는 이유가 많이 지불됩니다.

다른 팁

우리는 미션 크리티컬이 아니며 직원에게 고임금 DBA가없는 응용 프로그램을 통해 생산에서 수행합니다. 인적 오류의 대상이되는 수동 프로세스는 하나뿐입니다. 응용 프로그램은 차이를 감지하고 올바른 일을 할 수 있으며 다양한 개발 및 테스트 환경에서 테스트했을 것입니다.

한 가지주의 사항 - 클러스터 된 환경에서 여러 앱이 동시에 등장하고 나쁜 스키마를 수정하려고 시도 할 수 있기 때문에 피할 수 있습니다. 또는 하나의 인스턴스 만 스키마를 업데이트 할 수있는 메커니즘을 넣습니다.

최대 절전 모드 제작자는 책의 제작 환경에서 그렇게하는 것을 낙담시킵니다. "최대 절전 모드와의 자바 지속성":

경고 : 최대 절전 모드 사용자가 SchemaUpDate를 사용하여 프로덕션 데이터베이스의 스키마를 자동으로 업데이트하려고하는 것을 보았습니다. 이것은 재난으로 빠르게 끝날 수 있으며 DBA는 허용되지 않습니다.

업데이트의 변화를 보관하려면 Liquibase XML을 확인하십시오. 나는 올해까지 그것을 사용한 적이 없지만 DB 개정 제어/마이그레이션/변경 관리를 매우 쉽게 배우고 쉽게 배우는 것이 매우 쉽다는 것을 알았습니다. 나는 그루비/성배 프로젝트에서 일하고 있으며, 성배는 모든 ORM ( "Gorm")에 최대 절전 모드를 사용합니다. 우리는 Liquibase를 사용하여 모든 SQL 스키마 변경을 관리합니다. 앱이 새로운 기능으로 발전함에 따라 상당히 자주 수행합니다.

기본적으로 응용 프로그램이 발전함에 따라 계속 추가하는 XML 파일 파일을 유지합니다. 이 파일은 나머지 프로젝트와 함께 GIT (또는 사용중인 무엇이든)로 유지됩니다. 앱이 배포되면 Liquibase는 연결중인 DB의 ChangElog 테이블을 확인하여 이미 적용된 내용을 알게되면 파일에서 아직 적용되지 않은 변경 사항이 지능적으로 적용됩니다. 실제로는 절대적으로 훌륭하게 작동하며 모든 스키마 변경에 사용하는 경우 체크 아웃 및 배포 코드가 항상 완전히 호환되는 데이터베이스 스키마에 연결할 수 있다고 100% 확신 할 수 있습니다.

굉장한 점은 랩톱에서 완전히 빈 슬레이트 MySQL 데이터베이스를 가져 와서 앱을 발사하고 스키마를 즉시 설정할 수 있다는 것입니다. 또한 로컬 데브에 적용하거나 먼저 스키마 변경을 쉽게 테스트 할 수 있습니다.

시작하는 가장 쉬운 방법은 아마도 기존 DB를 가져간 다음 Liquibase를 사용하여 초기 Baseline.xml 파일을 생성하는 것입니다. 그런 다음 미래에 당신은 그것에 추가하고 Liquibase가 스키마 변경 관리를 인수하게 할 수 있습니다.

http://www.liquibase.org/

최대 절전 모드는 사항에 대해를 이용하지 않는 자동 업데이트를 자극을 커버할 때 자신을 모르는 사람들이 무엇을 사용하는 경우에는 사용하지 않아야 합니다.

수여하는 상황이지 않는 데 사용될 것을 찾을 수 많은 사람니다.

내가 사용한 그것은 몇 년 동안에서의 많은 다른 프로젝트 및 적이 없다 하나의 문제입니다.는 아이 대답하며,그것은 카니다.그것은 역사적인 사실이다.

는 사람이"그것을 결코 하지 않는 생산에서"생각하고의 특정 배포 생산,즉 그는 사람은 익숙(의 회사,그 산업,etc.).

우주의"생산 배포"는 방대하고 다양합니다.

경험있는 최대 절전 모드 개발자를 정확히 알 수 있 DDL 은 결과에서 지정된 매핑을 구성합니다.만큼 당신 테스트하고 검증하는 무엇을 기대에서 끝나 DDL(에서 개발,qa,준비,etc.),아무 문제도 없습니다.

를 추가하는 경우 많은 기능,자동 스키마를 업데이트할 수 있습니다 실제 시간을 크게 절약할 수 있습니다.

목록 재료의 자동 업데이트를 처리하지 않은 끝이없는,하지만 몇 가지 예는 데이터 마이그레이션을 추가,null 을 허용하지 않는 열을,열 이름을 변경,etc.,etc.

또한 당신은 당신이 처리해야에서 클러스터 환경입니다.

그러나 다시는 경우,당신이 알고 있던 모든 물건,되지 않을 묻기 이 질문입니다.Hmm...인 경우,당신은 당신이 질문할 때까지 기다려야 합니다 당신이 많은 경험을 최대 절전 모드와 자동 스키마 전에 업데이트를 사용하는 방법에 대해 생각에 prod.

나는 투표 할 것이다. 최대 절전 모드는 열의 데이터 타입이 변경된시기를 이해하지 못하는 것 같습니다. 예제 (MySQL 사용) :

String with @Column(length=50)  ==> varchar(50)
changed to
String with @Column(length=100) ==> still varchar(50), not changed to varchar(100)

@Temporal(TemporalType.TIMESTAMP,TIME,DATE) will not update the DB columns if changed

문자열 열의 길이를 255 이상으로 밀고 텍스트, 중간 텍스트 등으로 변환하는 등의 다른 예제도있을 것입니다.

물론, 새 열을 만들고 데이터를 복사하고 이전 열을 날려 버리지 않고 "데이터 유형을 변환"하는 방법이 실제로 없다고 생각합니다. 그러나 데이터베이스가 현재 최대 절전 모드 매핑을 반영하지 않는 열이있는 순간에 매우 위험하게 살고 있습니다 ...

Flyway는이 문제를 다루는 좋은 옵션입니다.

http://flywaydb.org

내가 설명했듯이 이 기사, 사용하는 것은 좋은 생각이 아닙니다 hbm2ddl.auto 생산 중.

데이터베이스 스키마를 관리하는 유일한 방법은 점진적인 마이그레이션 스크립트를 사용하는 것입니다.

  • 스크립트는 코드 기반을 따라 VCS에 있습니다. 지점을 확인하면 전체 스키마를 처음부터 재현합니다.
  • 증분 스크립트는 생산에 적용되기 전에 QA 서버에서 테스트 할 수 있습니다.
  • 스크립트를 실행할 수 있으므로 수동 중재가 필요하지 않습니다. 비행장, 따라서 스크립트 실행과 관련된 인간 오류의 가능성이 수동으로 감소합니다.

심지어 최대 절전 모드 가이드 사용하지 말라고 조언하십시오 hbm2ddl 생산 환경을위한 도구.

enter image description here

보존되어야 할 데이터를 잃어 버릴 수 있기 때문에 위험하지 않을 것입니다. HBM2DDL.AUTO = 업데이트는 순전히 DEV 데이터베이스를 최신 상태로 유지하는 쉬운 방법입니다.

우리는 몇 달 동안 생산을 진행하는 프로젝트에서 그것을하고 지금까지 문제가 없었습니다. 이 레시피에 필요한 두 가지 성분을 명심하십시오.

  1. 뒤로 호환성 접근 방식으로 객체 모델을 설계하십시오. 더 이상 객체와 속성을 제거/변경하는 대신. 즉, 객체 또는 속성의 이름을 변경 해야하는 경우 이전 이름을 그대로두고 새 이름을 추가하고 마이그레이션 스크립트를 작성하십시오. 객체 간의 연관성을 변경 해야하는 경우 이미 제작중인 경우 디자인이 처음에 잘못되었음을 의미하므로 이전 데이터에 영향을 미치지 않고 새로운 관계를 표현하는 새로운 방법을 생각해보십시오.

  2. 언제나 지원 배포 전에 데이터베이스.

내 의미는 -이 게시물을 읽은 후에 -이 토론에 참여하는 사람들의 90%가 프로덕션 환경에서 이와 같은 자동화를 사용한다는 생각에 불과하다는 것입니다. 약간 공을 던져 DBA에서. 모든 생산 환경이 DBA를 제공하는 것은 아니며 많은 DEV 팀이 (적어도 중간 크기 프로젝트의 경우)를 감당할 수는 없다는 것을 고려하십시오. 따라서 모든 사람이 모든 일을 해야하는 팀에 대해 이야기하고 있다면 공이 있습니다.

이 경우, 왜 두 세계를 모두 최대한 활용하려고 노력하지 않겠습니까? 이와 같은 도구는 여기에 도움이되며, 신중한 디자인과 계획을 통해 많은 상황에서 도움이 될 수 있습니다. 그리고 저를 믿습니다. 관리자는 처음에는 설득하기 어려울 수 있지만 공이 손에 있지 않다는 것을 알고 있다면 사랑할 것입니다.

개인적으로, 나는 모든 유형의 스키마를 확장하기 위해 직접 스크립트를 작성하는 것으로 돌아가지 않았지만 그것은 단지 내 의견 일뿐입니다. 그리고 최근 NOSQL 스키마리스 데이터베이스를 채택하기 시작한 후, 조만간이 스키마 기반 작업이 과거에 속할 것임을 알 수 있으므로 관점을 바꾸고 앞으로 살펴보기 시작하는 것이 좋습니다.

  • 내 경우 (Hibernate 3.5.2, Postgresql, Ubuntu), 설정 hibernate.hbm2ddl.auto=update 새 테이블 만 만들고 이미 기존 테이블에 새 열을 만들었습니다.

  • 테이블을 삭제하거나 열을 드롭하거나 열을 변경하지 않았습니다. 안전한 옵션이라고 할 수 있지만 hibernate.hbm2ddl.auto=create_tables add_columns 더 분명 할 것입니다.

지 안전하지 않는 것이 좋습니다,하지만 그것이 가능합니다.

나에 경험이 있는 응용 프로그램을 사용하여 자동 업데이트 옵션에서 생산입니다.

만,주요한 문제와 위험이에서 발견되는 이 솔루션은:

  • 에 배포하는 잘못된 데이터베이스.는 경우에 당신은 실수를 저 응용 프로그램을 실행하려면 서버는 오래된 버전의 응용 프로그램(EAR/전쟁/etc)잘못된 데이터베이스...당신은 많은 새로운 열,테이블,해외 키와 오류가 있습니다.동일 문제가 발생할 수 있습니다 간단한 실수에서 데이터 소스 파일(복사/붙여 파일을 잊을 변경하는 데이터베이스)입니다.에서,이력서 상황을 재앙이 될 수 있습니다 데이터베이스에서.
  • 응용 프로그램 서버를 시작하는 데 시간이 오래 걸림.이 때문에 발생할 최대 절전 모드를 찾아보십시오들이블/열/등 모든 시간을 당신은 응용 프로그램을 시작합니다.그는 알 필요가 무슨(테이블,열 등)요구를 만들 수 있습니다.이 문제는 것만으로 데이터베이스 테이블을 성장합니다.
  • 데이터베이스의 도구로 사용하는 것이 거의 불가능.데이터베이스를 만드 스크립트를 실행하는 새로운 버전으로,당신은 당신에 대해 생각해야 될 것입니다 무엇에 의해 만들어 자동 업데이트를 시작한 후 응용 프로그램 서버에 있습니다.당를 들어,필요할 경우를 채우기 위해 새로운 열과 데이터를 시작해야 합 응용 프로그램 서버를 최대 절전 모드 크레타운 열과 SQL 스크립트를 실행한 후에만다.으로 볼 수 있는 데이터베이스 마이그레이션 도구(처럼 행동이,Liquibase,etc.)그것은 거의 불가능을 사용하여 자동 업데이트와 함께 사용됩니다.
  • 데이터베이스가 변경되지 않은 중앙 집중식.과 가능성의 최대 절전 모드 테이블을 만들고 다른 모든 것,그것의 하드 시청에서 변경 사항 데이터베이스에서의 각 버전은 응용 프로그램이기 때문에,그들의 대부분은 자동으로 합니다.
  • 을 장려하에 쓰레기를 데이터베이스.의 용이성 때문에 자동 업데이트 할 수있는 기회가 귀하의 팀을 무시하여 드롭 old 열전 테이블이 있습니다.
  • 절박한 재해.절박한 위험이 어떤 재난에서 발생하는 생산(같은 일부 사람들에 언급된 다른 답변).심지어 응용 프로그램으로 실행하고 업데이트할 수 있는 동안,나는 생각하지 않는다 안전합니다.내가 결코 안전한 느낌과 함께 이 옵션이 있습니다.

그래서 나를 사용하지 않는 것이 좋습니다 자동 업데이트에 생산.

당신이 정말로 원하는 경우 사용하는 자동 업데이트를 생산,나는 추천합니다:

  • 분리된 네트워크.테스트 환경에 액세스할 수 없 체 환경입니다.이러한 문제를 방지하는 데 도움이 배포될 수 있 테스트 환경에서 변경 승인 데이터베이스입니다.
  • 스크립트 관리 순서.당신이해야를 구성하는 스크립트를 실행하기 전에 당신의 배포(구조 표 변경,삭제이블/열)과 후에 스크립트는 배포(기입한 정보를 위한 새로운 열/테이블).

그리고,다른 다른 게시물에,나는 생각하지 않는 자동 업데이트 사용과 관련된"아주 잘 지불"Dba(로에서 언급된 기타의 게시물)...Dba 가 더 중요한 것보다 작성 SQL 문을 만들/변경/삭제 테이블과 열이 있습니다.이러한 간단한 일상 작업을 수행할 수 있습고 자동으로 개발자와 유달리는 DBA 팀이 검토하고,필요로하지 않는 최대 절전 모드 및 Dba"아주 잘 지불하는"그들을 쓰기.

아니, 절대하지 마십시오. 최대 절전 모드는 데이터 마이그레이션을 처리하지 않습니다. 예, 스키마를 올바르게 보이게하지만 프로세스에서 귀중한 생산 데이터가 손실되지는 않습니다.

  • 일반적으로 대기업의 엔터프라이즈 애플리케이션은 특권이 줄어들면서 운영됩니다.

  • 데이터베이스 사용자 이름에는 없을 수 있습니다 DDL 열을 추가하기위한 특권 hbm2ddl.auto=update 필요합니다.

나는 블라디미르에 동의합니다. 우리 회사의 관리자는 내가 그러한 과정을 제안했다면 분명히 감사하지 않을 것입니다.

또한, 최대 절전 모드를 맹목적으로 신뢰하는 대신 SQL 스크립트를 만들면 더 이상 사용되지 않는 필드를 제거 할 수 있습니다. 최대 절전 모드는 그렇게하지 않습니다.

또한 생산 스키마를 새로운 스키마와 비교하면 데이터 모델에서 변경된 WAT에 대한 더 나은 통찰력을 제공합니다. 물론, 당신은 그것을 만들었 기 때문에, 그러나 이제 당신은 한 번에 모든 변화를 볼 수 있습니다. 당신을 "heck?"처럼 당신을 만드는 사람들조차도.

스키마 델타를 만들 수있는 도구가 있으므로 어려운 일도 아닙니다. 그리고 당신은 무슨 일이 일어날 지 정확히 알고 있습니다.

응용 프로그램의 스키마는 진화할 수 있습에서 시간당신은 몇 가지가 있다면 설치할 수 있는 다른 버전에,당신은 어떤 방법이 있는지 확인하는 응용 프로그램의 어떤 종류의 도구 또는 스크립트의 가능한 스키마를 마이그레이션과 데이터를 하나의 버전에서 단계별 어떤 다음과 같은 하나입니다.

모든 당신의 지속성에서 최대 절전 모드 매핑(또는 주석)아주 좋은 방법에 대한 유지 스키마의 진화를 통제의 밑에 있습니다.

을 고려해야한다는 스키마를 진화의 여러 측면을 고려되어야한다:

  1. 진화의 데이터베이스에서 스키마 추가 더 많은 열과 테이블

  2. 반납의 오래된 열,테이블 및 관계

  3. 채 새로운 열과 함께 기본값

최대 절전 모드는 도구에서 중요한 특정한 경우에(같은 내 경험에)당신은 다른 버전의 동일한 응용 프로그램에 많은 다른 종류의 데이터베이스가 있습니다.

점 3 은 매우 민감한 경우에는 최대 절전 모드를 사용하여,같은 경우에 당신을 소개하는 새로운 부울 값 속성이나 숫자 하는 경우,최대 절전 모드를 찾을 것입니다.null 값에서 이러한 열면 예외가 발생합니다.

그래서 나는 무엇을 할 것입니다:실로 최대 절전 모드를 사용하여 도구는 용량의 스키마 업데이트,하지만 당신은 추가해야와 함께 그것의 일부 데이터와 스키마를 유지은과 같이,콜백을 위해 충전물 기본값으로 떨어지고,더 이상 사용되는 열을,그리고 비슷합니다.이 방법으로 당신은 이점이(데이터베이스의 독립적인 스키마 업데이트 스크립트를 피하고 중복되는 코딩의 업데이트 peristence 에서 스크립트)그러나 당신은 또한 커버의 모든 측면 작업입니다.

그래서 예를 들어,만약 버전 업데이트로 구성되어 있는 단순히 추가 varchar 소중한 자산(따라서 열을)수 있습니다 기본적으로 null,으로 자동 업데이트를 수행 할 수 있습니다.더 복잡도는 필요한 일이 더 필요할 것이다.

이것은 가정할 때 응용 프로그램 업데이트할 수 있는데키(수행 할 수 있습),이는 또한어야 한다는 것을 의미가 있는 사용자 권한을 이렇게 스키마에.만약 이 정책의 고객을 방지이(가능성 도마뱀의 뇌우),당신은 당신을 제공하는 데이터베이스 특정 스크립트가 있습니다.

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