본문 바로가기

softwares/quick reference

[Hyper-V] SQL Server 백업/복원 on VM

Case1
물리서버/SQLServer에서 (Hyper-V)가상서버/SQLServer 로 로그 전달을 구성 시 아래의 경고 메시지가 발생한다.

The tail of the log for database DATABASE_DBN is being rewritten to match the new sector size of 4096 bytes.2048 bytes at offset 836282368 in file X:\dblog\DATABASE_DBN.ldf will be written

Case2
물리서버/SQLServer에서 백업된 풀백업/트랜잭션 백업 데이터를 (Hyper-V)가상서버/SQLServer 에서 복원 시 (restore database) 메시지 9004 로 오류가 발생한다.

 

이와 같은 문제가 발생하는 원인은 일반적으로 물리 서버일 경우 디스크의 Physical Secor Size가 512byte 혹은 512e의 4k 에뮬레이션을 사용합니다만, Windows Server 2012 이후의 Hyper-V 에서 채택하고 있는 VHDX 디스크 이미지에서는 4K (혹은 Native 4K) 의 방식을 기본으로 사용하기 때문에 물리적 디스크의 구성을 최대한 활용하려는 알고리즘을 가진 SQLServer에서 이 디스크 환경의 차이를 인식하지 못하여 (align을 정확히 맞추지 못하여) Case1처럼 오버헤드가 발생하거나, Case2 와 같은 SQLServer 내부의 버그로 인한 복원 오류가 발생 합니다.

해결방법은 "Set-VHD –Path c:\test.vhdx –PhysicalSectorSizeBytes 512" 명령어를 통해 VHDX 파일을 4K에서 512 byte 디스크의 형식으로 바꾸어 주면 됩니다. 원본도 4K 에서 백업되었고, 복원도 4K에서 한다면 문제가 없을 걸로 보여 (VMtoVM), 물리toVM 에 대한 문제로 오해할 수 있겠지만, 실제로는 물리서버와 가상화 서버의 환경 (정확히는 설정)의 차이로 이와 같은 문제가 발생합니다. 2번의 케이스에서 SQLServer 2008 에서는 복원 시 9004에 대한 핫픽스 (정확히는 Service Pack2)를 제공 하고 있지만 (제보로는 제대로 안 된다고...-_-;;), SQLServer 2012에서는 이와같은 핫픽스를 (아직까지는) 제공하지 않고 있습니다.

이와같은 NTFS 의 Physical sector size 는 fsutil fsinfo ntfsifno X: 명령어로 확인할 수 있고, 아래와 같이 총 4개의 케이스로 나뉘어집니다. 일반적인 컴퓨팅에서는 문제가 없으나, 디스크 섹터 단위로 align을 맞추는 SQLServer 에서는 위에서 설명한 것과 같이 갖가지의 문제가 발생할 가능성이 있습니다. 특별한 설정을 하지 않고 생성된 .VHDX 는 기본적으로 4K 포맷으로 생성 되어있고 (.VHD 는 512byte) 이를 512 byte의 .VHDX 로 변환하기 위해서는 할당 된 VM 의 디스크를 종료 / Set-VHD cmdlet 으로 간단히 변경할 수 있습니다. (작업은 데이터 유실 없이 곧바로 진행 됩니다)

섹터당 바이트 512
실제 섹터당 바이트 512

섹터당 바이트 512
실제 섹터당 바이트 <지원되지 않음>

섹터당 바이트 512
실제 섹터당 바이트 4096

섹터당 바이트 4096
실제 섹터당 바이트 4096

 

추가로, 하드웨어 기반의 SQL Server 에서는 디스크의 성능을 개선하기 위한 튜닝 방법으로 Disk Partition Alignment 라는 방법이 사용 되는데, 요약하면 RAID Logical Volume 의 Stripe Size 와 NTFS Allocation SIze (클러스터당 바이트)를 같은 크기로 생성하여 최소 단위 작업 (혹은 Queue) 발생 시 물리적 디스크와 NTFS의 클러스터 사이즈의 align을 맞추어 주는 작업입니다. Windows 2003 까지만 하더라도 디스크 Partition 의 start offset을 수동으로 지정하여야 했지만, 2008 이후로는 이러한 작업이 필요 없는 상황입니다. 따라서, Hyper-V를 운영하는 호스트의 경우에도 이와 같이 64K Stripe SIze, 64K NTFS 로 설정하고 VM Guest 내부에서 사용 되는 데이터 디스크의 클러스터 사이즈도 64KB 로 맞추어주면 이론상으로는 최적의 성능을 낼 수 있습니다.

 

references
https://technet.microsoft.com/en-us/library/hh848561(v=wps.630).aspx
https://support.microsoft.com/en-us/kb/2987585
https://msdn.microsoft.com/en-us/library/windows/desktop/hh848035(v=vs.85).aspx
http://support.microsoft.com/kb/2624272
http://blogs.msdn.com/b/psssql/archive/2011/09/27/after-applying-sql-server-2008-r2-sp1-error-9013-is-logged-the-tail-of-the-log-for-database-ls-is-being-rewritten-to-match-the-new-sector-size-of-d-bytes.aspx
http://blogs.msdn.com/b/psssql/archive/2011/01/13/sql-server-new-drives-use-4k-sector-size.aspx
http://www.seagate.com/kr/ko/tech-insights/advanced-format-4k-sector-hard-drives-master-ti/
https://technet.microsoft.com/en-us/library/dd758814(v=sql.100).aspx
https://blog.workinghardinit.work/2012/07/10/windows-server-2012-with-hyper-v-the-new-vhdx-format-lead-the-way/