운영 체제가 오류 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.