Резервное копирование базы данных на жестком диске с другим размером сектора

В нашей среде разработки мы уже давно используем конкретный сценарий резервного копирования и восстановления для каждого из наших продуктов с помощью различных версий SQL Server и различных конфигураций среды без каких-либо проблем.

Недавно мы обновили до SQL Server 2012 в качестве нашего стандартного сервера разработки с уровнем совместимости SQL 2005 (90) для поддержки поддержки устаревших систем. Теперь мы обнаруживаем, что на одной конкретной машине dev мы получаем следующую ошибку при попытке резервного копирования базы данных:

Невозможно использовать файл резервной копии "D:\MyDB.bak", потому что он был первоначально отформатирован с размером сектора 512 и теперь находится на устройстве с размером сектора 4096. BACKUP DATABASE заканчивается ненормально.

С командой:

BACKUP DATABASE MyDB TO  DISK = N'D:\MyDB.bak' WITH  INIT , NOUNLOAD ,  NAME = N'MyDB backup',  NOSKIP ,  STATS = 10,  NOFORMAT

Любопытно то, что ни аппаратное обеспечение, ни разделы на этой машине-разработчике не изменились, хотя размер их сектора различен, и это ранее не было проблемой.

Из моих исследований (например, googling) этого вопроса не так много, кроме совета по использованию опции WITH BLOCKSIZE, но это дает мне то же сообщение об ошибке.

По моему запросу:

BACKUP DATABASE MyDB TO  DISK = N'D:\MyDB.bak' WITH  INIT , NOUNLOAD ,  NAME = N'MyDB backup',  NOSKIP ,  STATS = 10,  NOFORMAT, BLOCKSIZE = 4096

Может ли кто-нибудь пролить свет на то, как я могу создавать резервные копии и восстанавливать базу данных на жестких дисках с разными размерами сектора?

Ответ 1

Эта проблема возникает из-за разных размеров сектора, используемых разными дисками.

Вы можете исправить эту проблему, изменив исходную команду резервного копирования на:

BACKUP DATABASE MyDB TO  DISK = N'D:\MyDB.bak' WITH  INIT , NOUNLOAD ,  NAME = N'MyDB backup',  STATS = 10,  FORMAT

Обратите внимание, что я изменил NOFORMAT на FORMAT и удалил NOSKIP.

Нашел намек на решение этой проблемы в разделе комментариев следующего сообщения в блоге MSDN: пространства хранилища SQL Server/VHDx и размер сектора 4K

И более подробная информация о дисках сектора 4k: http://blogs.msdn.com/b/psssql/archive/2011/01/13/sql-server-new-drives-use-4k-sector-size.aspx

Ответ 2

Все, что вам нужно сделать, это создать резервную копию с другим именем.

Ответ 3

Мы столкнулись с той же проблемой, что и с 2005 по 2008 год. Проблема заключалась в том, что мы пытались использовать тот же файл резервной копии в 2008 году, который мы использовали в 2005 году (добавление резервных копий в один файл).

Мы сменили сценарий на резервное копирование на другой файл, и проблема была решена. Я бы предположил, что перемещение/удаление старого файла будет иметь такое же влияние

Ответ 4

Просто удалите существующий файл.bak и снова запустите.

Ответ 5

Я столкнулся с тем же вопросом, что и OP. На dev-машине у нас был сценарий PowerShell, который поддерживал базы данных с удаленных серверов баз данных и локально хранили файлы резервных копий. Сценарий перезаписывал те же файлы резервных копий снова и снова, и скрипт работал отлично в течение нескольких лет. Затем я клонировал прядильный носитель на SSD в dev-машине. Внезапно мы получили ту же ошибку, что и OP:

Backup-SqlDatabase: System.Data.SqlClient.SqlError: нельзя использовать файл резервной копии '\ DevMachine\Back-Up\Demo.bak', потому что он был первоначально отформатирован с размером сектора 4096 и теперь находится на устройстве с размером сектора 512.

Конечно, я могу удалить все существующие файлы .bak чтобы исправить эту проблему. Но что, если это произойдет, снова? Я хотел, чтобы решение командной строки постоянно работало.

Здесь наш оригинальный код:

Backup-SqlDatabase -ServerInstance "DBServer1" -Database "Demo" -BackupFile "\\DevMachine\Back-Up\Demo.bak" -BackupAction Database -CopyOnly -CompressionOption On -ConnectionTimeout 0 -Initialize -Checksum -ErrorAction Stop

После некоторого поворота я изменил его на следующее, чтобы решить проблему:

Backup-SqlDatabase -ServerInstance "DBServer1" -Database "Demo" -BackupFile "\\DevMachine\Back-Up\Demo.bak" -BackupAction Database -CopyOnly -CompressionOption On -ConnectionTimeout 0 -Initialize -Checksum -FormatMedia -SkipTapeHeader -ErrorAction Stop

В основном для устранения проблемы были добавлены следующие параметры:

-FormatMedia -SkipTapeHeader

Обратите внимание, что если вы прочитали документацию для командлета Backup-SqlDatabase, -FormatMedia будет указан только для применения к лентам, а не к резервным копиям на диске. Однако, как представляется, он выполняет работу по удалению существующего файла резервной копии при резервном копировании на диск.
- https://docs.microsoft.com/en-us/powershell/module/sqlps/backup-sqldatabase

Я обнаружил, что если бы я использовал параметр -FormatMedia сам по себе, он генерировал следующую ошибку:

Backup-SqlDatabase: свойства FormatMedia и SkipTapeHeader имеют конфликтующие настройки.

Я исправил вторую ошибку, добавив дополнительную опцию: -SkipTapeHeader. Очевидно, что это также предназначено для резервного копирования на магнитную ленту, но это сработало.

Ответ 6

У меня была та же проблема, но с восстановлением. Я получил эту ошибку в студии управления: "Указанный приказ недействителен (SqlManagerUI)"... и эта ошибка в запросе: "SQL Server не может обработать это семейство мультимедиа".

Затем я сделал простую вещь: я выполнил набор резервных копий в папку резервного копирования по умолчанию. Например: C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS2008R2\MSSQL\Backup\bckup.bak Это сработало. Я восстановил его с этого места. : -S Похоже, что SQL - это сектор -S iz чувствительный.