운영 체제가 오류 21을 리턴했습니다 (장치가 준비되지 않았습니다.)


13

Windows를 재부팅 할 때마다 일부 데이터베이스의 경우이 오류가 발생합니다.

운영 체제가 오류 21을 리턴했습니다 (장치가 준비되지 않았습니다.)

  1. chkdsk /r불량 섹터가없는 디스크를 점검했습니다 .
  2. DBCC CHECKDB오류없이 실행 했습니다.

    *(CHECKDB found 0 allocation errors and 0 consistency errors in database)* 
  3. SQL Server를 다시 시작하면 오류가 사라집니다.

Windows 10 및 SQL Server 2016 Express

답변:


14

창을 재부팅 할 때마다 일부 데이터베이스의 경우이 오류가 발생합니다. (OS 오류 21-장치 준비 안 됨)

디스크가 오프라인 상태이거나 SQL Server가 시작될 때 온라인 상태가 아니거나 SQL Server가 온라인 상태가 된 후 상태가 전환 되었기 때문입니다.

3. SQL Server를 다시 시작하면 오류가 사라집니다.

예. 데이터베이스가 SQL Server 내부에 다시 ​​마운트 되었기 때문입니다. 디스크 장치가 수정되었다고 가정하면 데이터베이스를 오프라인-> 온라인 상태로 전환 할 수도 있습니다.

디스크에 데이터베이스를 배치하고 디스크를 비활성화하고 선택 쿼리를 실행하여 (오류가 발생 함) 디스크를 다시 온라인 상태로 만들고 선택이 여전히 동일한 오류로 실패 함을 알면 테스트 환경에서 쉽게 재현 할 수 있습니다. 다시 작동하고 OS 오류 21이 발생하지 않도록하려면 데이터베이스를 다시 마운트해야합니다.

어떻게해야합니까?

누군가 처음에 온라인으로 연결되지 않는 이유 또는 오프라인 상태가되는 이유 (상태 전환) 또는 왜 Windows에 준비가되었지만 실제로 표시되지 않는지 (다른 드라이버를로드해야 할 수 있음) 그것).

또한 서비스 / 시작 / 상태를 차단할 수 있으므로 안티 바이러스, 호스트 침입 방지 등과 같은 디스크 필터 드라이버가 최신인지 확인하십시오.


비슷한 문제가 있었고 5 분 후에 SQLServer / SqlLaunchPad 서비스를 다시 시작하는 스크립트를 추가했지만 작동하지 않습니다. 나중에 수동으로 다시 시작하면 문제없이 정상적으로 작동합니다. SQL Server2014의 동일한 구성은 문제없이 작동합니다
Rajesh

시작 모드를 자동에서 지연으로 변경하십시오. 이렇게하면 디스크가 마운트되고 작업을 수행 한 후 SQLService가 마지막에옵니다.
Jonathan Fite

6

원인을 찾은 것 같습니다.

대부분의 문제는 "빠른 시작"전원 옵션 으로 인한 것 입니다.

빠른 시작

부팅 시간을 줄이는 Windows 기술입니다. 빠른 시작은 콜드 셧다운 요소 와 최대 절전 모드 기능을 결합 합니다 .

여기에서 장단점에 대한 다른 기사 를 찾을 수 있습니다

사용 중지했으며 문제가 해결 된 것 같습니다.


큰. 이것은 그것을 보는 한 가지 방법입니다. 실제 원인은이 SQL 오류가 표시 될 때까지 일부 SQL 서비스가 시작되지 않았기 때문입니다. 특히 OS에 대해 "빠른 시작"을 사용하는 경우 "시작"으로 설정된 방식으로 인해 시작되지 않았습니다.
Chagbert

3

이것들은 저의 관찰 사항이며 어떻게 문제를 해결했는지 (동일한 문제가있는 다른 사람들의 이익을 위해)

  • SQL Server를 실행하는 Amazon EC2 인스턴스를 사용하고있었습니다.
  • EBS 블록 장치가 ec2 인스턴스에 연결되어 D : 드라이브에 매핑되었습니다.
  • 내 데이터와 로그는 D : 드라이브에있었습니다.
  • ec2 인스턴스를 중지하고 나중에 다시 가져올 때 항상 "device not ready"라는 오류가 발생하여 데이터베이스가 나타나지 않습니다.
  • "지연된 시작"으로 MSSQLSERVER 서비스를 설정하려고했습니다.
  • 그러나 SQL Server 로그에서 지연이 발생하지 않고 MSSQLSERVER가 부팅과 함께 시작되었음을 알았습니다.
  • 이벤트 뷰어에서 나는 D : 드라이브가 건강 해지는 시간을 관찰했습니다.
  • SQL Server 로그에서 SQL Server가 사용자 데이터베이스를 시작하는 시간을 기록했습니다.
  • D : 드라이브는 6 초 후에 만 ​​사용할 수 있습니다. "장치 준비 안 됨"오류가 나타납니다.
  • 또한 "MSSQLSERVER"를 시작하는 "SQL SERVER LaunchPad"라는 다른 서비스가 있었기 때문에 "지연된 시작"이 적용되지 않았다고 언급했습니다.
  • "런치 패드"의 분석 기능이 필요하지 않습니다. 그래서 그 서비스를 비활성화했습니다.
  • 이제 "MSSQLSERVER"가 지연되고 D : 드라이브 파일을 찾을 수 있습니다.

1

MSSMS를 통해 로컬 기본 MS SQL 인스턴스 (2017)에 연결할 때 발생하는 전체 오류는 다음과 같습니다.

파일 'D : \ MSSQL \ DATA \ tempdev.mdf'에서 오프셋 0x000000000ae000을 읽는 동안 운영 체제에서 오류 21 (장치가 준비되지 않았습니다.)을 SQL Server에 반환했습니다. SQL Server 오류 로그 및 운영 체제 오류 로그의 추가 메시지가 더 자세한 정보를 제공 할 수 있습니다. 이는 데이터베이스 무결성을 위협하는 심각한 시스템 수준 오류 조건이므로 즉시 수정해야합니다. 전체 데이터베이스 일관성 검사 (DBCC CHECKDB)를 완료하십시오. 이 오류는 여러 가지 요인으로 인해 발생할 수 있습니다. 자세한 내용은 SQL Server 온라인 설명서를 참조하십시오. (Microsoft SQL Server, 오류 : 823) 도움말을 보려면 다음을 클릭하십시오. http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=823&LinkId=20476

tempdb를 새 D 드라이브로 옮긴 후에 이것을 얻기 시작했습니다. SQL 서비스를 시작 / 중지하면 오류가 제거됩니다. 모든 것이 C에있을 때이 오류가 발생하지 않았습니다. 두 드라이브 모두 SSD이며 Bitlocker로 암호화되어 있습니다. 문제가 될 수 있는지 확실하지 않습니다. 운영 체제가 필요로하기 때문에 C 드라이브가 매우 일찍 잠금 해제되고 나중에 D 드라이브가 잠금 해제됩니다 .

  1. Max의 답변 ( https://dba.stackexchange.com/a/175115 )에 따라 "빠른 시작"을 비활성화하면 문제가 해결되었습니다. 기사에 따르면 Max는 ( https://www.howtogeek.com/243901/the-pros-and-cons-of-windows-10s-fast-startup-mode/ ) 링크를 통해 " 전원 버튼의 기능 "을 선택한 다음"현재 사용할 수없는 설정 변경 "을 선택하십시오.
  2. Venvig의 답변 ( https://dba.stackexchange.com/a/226115 ) 과 달리 "SQL Server"서비스를 시작 유형 = "자동 (지연된 시작)"으로 설정하면 Windows'Fast Startup re- 가능).

0

나는 같은 문제를 여러 번 겪었고 해결책을 공유해야한다고 생각했습니다 (이미 제공된 답변에도 불구하고).

그래서 두 개의 SQL 인스턴스 (SQL 2008 및 SQL 2017)가 있습니다. 오류가 SQL08 인스턴스가 아니라 SQl17에 나타납니다. 이는 각 SQL 인스턴스의 설치 / 설정 중에 제공된 "계정 자격 증명"으로 인해 발생합니다.

여기에 이미지 설명을 입력하십시오

이것은 Windows 서비스에서 볼 수 있습니다. SQL08은 "로컬 시스템 계정"을 사용하도록 설정되었으며 실패한 SQL17은 "NETWORK ACCOUNT"로 설정되었습니다. 따라서 변경하고 여기에서 SQL 서비스를 다시 시작하십시오 (또는 SQL 브라우저에서 인스턴스를 다시 시작하십시오).

이 문제의 두 번째 부분은 SQL Server Management Studio V17을 사용할 때 SQL Server 2017 CTP 2.0에 고유합니다.이 경우 SMO는 로컬 디스크의 여유 공간 정보를 얻기 위해 이전 " xp_fixeddrives " 대신 " sys.dm_os_enumerate_fixed_drives " 를 사용하도록 전환했습니다. . 이 문제를 해결하려면 장치 관리자로 이동하여 인용 된 드라이브를 일시적으로 비활성화하십시오 (제 경우에는 DVD-ROM 드라이브 인 "G"드라이브였습니다).


0

이 문제는 나를 자극했다. SQL Server 인스턴스에 5 개의 DB가 연결되어 있는데 그 중 3 개는 정상적으로 작동하지만 2 개는 불평합니다.

파일 'E : \ xxxxxxxx.mdf'의 오프셋 0x00000000204000에서 읽는 동안 운영 체제에서 오류 21 (장치가 준비되지 않았습니다.)을 SQL Server에 반환했습니다.

여기 내 해결책이 있습니다.

  1. Services.msc를 켜고 SQL Server (인스턴스 이름) 라는 서비스 를 찾은 다음 마우스 오른쪽 단추를 클릭하고 다시 시작 하십시오.
  2. ssms로 돌아가서 DB를 새로 고치면 문제가 해결됩니다.

참고로, DB 오프라인 / 온라인 방법을 사용하려고했습니다. 내 경우에는 작동하지 않았습니다. sqlserver 서비스를 다시 시작하는 무차별 대입은 훌륭하게 작동했습니다. 이것은 모든 DB를 오프라인으로 전환하려는 지분이 너무 높은 사람들에게는 문제가 될 수 있습니다. 그러나 나처럼 로컬 개발을하고 있다면이 솔루션이 좋을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.