Резервное копирование базы данных на жестком диске с другим размером сектора
В нашей среде разработки мы уже давно используем конкретный сценарий резервного копирования и восстановления для каждого из наших продуктов с помощью различных версий 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 чувствительный.