2012-04-18 3 views
1

데이터베이스가 복원되기 전에 작업중인 시스템을 종료해야합니다. 고객이이를 수행하지 않으면 응용 프로그램 서버의 메모리 내 상태가 데이터베이스와 일치하지 않기 때문에 심각한 문제가 발생할 수 있습니다. 손상된 데이터베이스로 인해 오류가 발생하고 시스템이 작동을 멈추고 데이터베이스를 사용할 수 없게 될 때까지 약간의 시간이 걸릴 수 있습니다.SQL Server : 응용 프로그램이 실행되는 동안 데이터베이스 복원을 방지하거나 검색하는 방법

그래서이 상황을 감지하고 문제를 피하려고합니다.

  • 응용 프로그램 서버는 반드시이 대부분의 아마 실 거예요 도움이 같은 연결 살아, 그래서 단일 사용자 모드 및 물건을 보관하지 않습니다.
  • 복원에 실패했거나 서버가 종료 되었더라도 상관 없습니다. 그냥 무시해서는 안됩니다..
  • 모든 컴퓨터의 SQL Server 도구로 데이터베이스를 복원 할 수 있습니다. 나는 내 도구에 의지 할 수 없다.

누구나 이미 이러한 문제를 해결 했습니까?

SQL Server 2005 이상, .NET (C#), SMO를 사용하고 있습니다.


편집 : 때문에 몇 가지 오해와 응용 프로그램 디자인에 대한 논의의

, 나는 문제가 어디에서 오는지 설명 할 필요가있다.

하이 로우 발생기 : 어플리케이션이 하이 로우 번호 생성기의 하이 값을 가진다 NHibernate에 캐시를 사용한다. Hi-Values는 데이터베이스에서 읽어 와서 응용 프로그램이 데이터베이스로 돌아가서 다른 숫자 범위를 가져올 때까지 특정 수의 기본 키를 생성 할 수 있습니다. 데이터베이스에 저장된 Hi-Value는 증분되지만 결코 감소하지 않습니다 (이전 버전의 데이터베이스가 복원되지 않는 한). 이것은 Hi-Lo 제너레이터의 개념입니다. 도 아니고 스스로 구현하지도 않았고도 구현하지 않았습니다.

캐시 : 캐시에서 기본 키는 데이터베이스의 레코드를 식별하는 데 사용됩니다. 데이터베이스의 정상적인 사용에서는 기본 키가 절대로 변경되지 않습니다. 복원의 경우, 기본 키가 더 이상 동일한 레코드를 식별하지 못하고 캐시가 단순한 잘못입니다. 도이를 감지 할 수 없습니다.. 예를 들어 새로운 레코드에 잘못된 외래 키를 설정하는 결과를 초래할 수 있습니다.

DB 복원은과 데이터베이스의 다른 일반적인 사용과 비교할 수 없습니다. 복원은 모든 데이터 처리 규칙을 어기 게됩니다.

나는 많은 응용 프로그램이 실행 중일 때 연결을 열어 두어 복원이 불가능하다고 생각합니다. 대부분의 다른 응용 프로그램은 데이터베이스가 복원되고 나중에 데이터베이스에 액세스하려고 할 때 충돌이 발생할 수 있습니다. 제 경우에는 한동안 계속 달릴 수도 있습니다. 이것은 문제입니다.

대부분의 사람들은 응용 프로그램이 실행 중일 때 데이터베이스를 복원하려고 시도하지 않는다고 생각합니다.

이론적으로는 응용 프로그램이 여전히 메모리에있는 동안 데이터베이스가 복원 될 때 무언가가 완전히 잘못 될 위험이 있다고 생각됩니다. 나는 이것이 전혀 문제가되지 않는다는 말을 듣고 싶지 않다. 단지 대부분의 응용 프로그램이 그것을 처리하지 못하기 때문이다.

+0

자격을 얻을 수 있습니까? 메모리 상태가 의미하는 바가 있습니다. SQL Server 버퍼 캐시, 캐싱 계층에 대해 이야기하고 있습니까? 정확히 무엇입니까? –

+0

응용 프로그램 메모리 일뿐입니다. 캐시, 수업 시간 등은별로 중요하지 않습니다. 하나의 큰 문제는 숫자의 범위를 예약 NHibernates hilo - 생성기에 의해 발생합니다. 이 번호는 다른 데이터베이스에서 유효하지 않습니다. –

+0

나는 당신이 당신의 상황과 질문을 더 분명하고 명확하게 설명 할 필요가 있다고 생각한다. 지금까지의 설명을 통해 나 자신과 다른 사람들의 반응은 완벽하게 유효합니다. 특히, 이러한 인 메모리 캐시가 현재 복원 작업보다 더 평범한 소스에서 데이터베이스의 데이터 변경으로부터 어떻게 보호 받고 있는지 알고 싶습니다. 운영자, 에이전트 작업, ETL proc 등이 캐시와 모든 데이터 관계를 무효화하는 중요한 테이블을 업데이트하지 않았다는 것을 어떻게 알 수 있습니까? 우리가 알고 있다면 복원과 같은 더 희귀 한 경우로 확장 할 수 있습니다. – RBarryYoung

답변

0

유용한 답을 얻지 못했기 때문에이 문제에 대한 일반적인 해결책이 없다고 가정합니다. 데이터베이스가 또 다른 하나입니다 있는지 확인하기 위해 모든 트랜잭션의 시작에서 쿼리를 실행

  • :

    나는 두 그것을 해결하는 방법을 참조하십시오. 예 : 마지막으로 described here으로 복원되었습니다. 이로 인해 성능이 저하되고 사용 권한 문제가 발생할 수도 있습니다.

  • 데이터베이스가 복원되지 않도록 데이터베이스에 "연결 유지"연결을 엽니 다. 이것은 구현하기가 훨씬 쉬울 수 있습니다. 연결을 낭비하기 때문에 좋지 않습니다.
0

연결 논리로 구축 할 수있는 데이터베이스에 연결하는 방법을 알지 못하면 별도의 상태 또는 시스템 데이터베이스에서 검사를 실행하여 데이터베이스의 상태를 확인하십시오.

연결을 시도하거나 잡을 때 실패하면 상태를 확인하고 그 시점에서 다시 사용자에게보고하십시오. 얼마나 자주 당신이 당신의 코드에서 최적의 장소를 결정하는 것은 몇 가지 생각을 필요로 할 것입니다 복원 있는지 확인하십시오.

SELECT DATABASEPROPERTYEX ('DatabaseName', 'Status') 

http://msdn.microsoft.com/en-us/library/ms186823.aspx

+0

나는 이것을 이해하지 못한다. 이 수표는 실제로 무엇을 확인합니까? 어떤 상태가 여기에서 확인됩니까? 복원이 진행되는 동안 서버는 아무 것도하지 않습니다. 복원 후에 활성 상태가되고 데이터베이스가 대체되었음을 인식하지 못합니다. –

+0

이렇게하면 복원이 발생하고 있음을 알 수 있습니다. 그런 다음 복원이 완료되었음을 알 수 있고 현재 상태를 저장할 수 있습니까? ddl 트리거를 통해 복원이 시작되었음을 트랩 할 수 없습니다. 그것을 처리하는 이벤트가 있지만. SQL 2012를 사용하는 경우이 문제를 처리하는 한 가지 방법은 클라이언트의 로컬 DB를 통해 동기화 프레임 워크 및 변경 내용 추적을 사용하는 것입니다. – u07ch

+0

"ddl 트리거를 통해 복원이 시작되었음을 트래핑 할 수 없습니다"- 솔루션 ' 내가 찾고있어. 이것에 대해 좀 더 자세히 설명해 주시겠습니까? 문서에서 이와 같은 것을 찾았지만 찾지 못했습니다. –

0

당신은 그것을 어떤 연결이 동안 전체는 SQL 서버의 데이터베이스에 복원 할 수 없습니다.

SQL Server는 SQL Server의 메모리 내 상태를 손상시키지 않습니다. 그리고 당신은 그런 일을하기까지 열심히 노력해야합니다.

+0

상황을 이해하지 못했습니다. 서버는 실행 중일 때 반드시 연결을 유지하지 않습니다. 손상은 SQL Server 오류가 아닙니다. 응용 프로그램 서버는 새 데이터베이스에 적용되지 않는 이전 데이터베이스의 정보를 사용하여 데이터베이스에 데이터를 저장합니다. 이것은 "메모리 상태"문제입니다. 응용 프로그램 서버는 전체 데이터베이스가 대체되었음을 인식하지 못합니다. –

+0

나는 주된 질문에 답하고있다. – RBarryYoung