Вопрос или проблема
Не удается восстановить базу данных AWS RDS, в которой есть данные, оптимизированные для памяти.
У меня есть резервная копия в S3, и когда я пытаюсь выполнить восстановление в RDS:
exec msdb.dbo.rds_restore_database
@restore_db_name="MyDatabase",
@s3_arn_to_restore_from='arn:aws:s3:::myBucket/myBackup.bak'
это завершается неудачей с:
RESTORE требует MAXTRANSFERSIZE=327680, но было указано 65536.
RESTORE FILELIST завершается аномально.
Задача была прервана из-за сбоя задачи или одновременного запроса RESTORE_DB.
Задача была отменена.
Получен пустой результат списка файлов для восстановления.
что имеет смысл, поскольку в источнике: https://docs.microsoft.com/en-us/sql/t-sql/statements/backup-transact-sql?view=sql-server-2017
При создании резервных копий с использованием службы SQL Writer, если база данных имеет настроенный FILESTREAM или включает оптимизированные для памяти файловые группы, то MAXTRANSFERSIZE во время восстановления должен быть больше или равен MAXTRANSFERSIZE, который использовался при создании резервной копии.
Но я изначально создал резервную копию базы данных с:
BACKUP DATABASE [MyDatabase]
TO DISK = 'C:\Data\Backups\MyBackup.bak'
WITH INIT, MAXTRANSFERSIZE = 65536, STATS = 1;
Есть ли способ восстановить эту базу данных? “Команда RDS” msdb.dbo.rds_restore_database
не позволяет мне указать параметр MAXTRANSFERSIZE.
Рекомендуется использовать опцию ‘WITH NO_COMPRESSION’ для резервного копирования, чтобы отключить сжатие. Это происходит потому, что сжатие автоматически настраивает значение MAXTRANSFERSIZE.
Начиная с SQL Server 2019 (15.x) CU5, установка MAXTRANSFERSIZE больше не требуется для активации этого оптимизированного алгоритма сжатия с TDE. Если команда резервного копирования указана с WITH COMPRESSION или настройка по умолчанию для сжатия резервных копий на сервере установлена в 1, MAXTRANSFERSIZE автоматически увеличивается до 128 K для активации оптимизированного алгоритма. Если MAXTRANSFERSIZE указано в команде резервного копирования со значением > 64 K, указанное значение будет применено. Иными словами, SQL Server никогда автоматически не уменьшает значение, а только увеличивает его. Если вам нужно создать резервную копию базы данных, зашифрованной с TDE, с MAXTRANSFERSIZE = 65536, необходимо указать WITH NO_COMPRESSION или убедиться, что настройка по умолчанию для сжатия резервных копий на сервере установлена в 0.
Ответ или решение
Восстановление базы данных AWS RDS с использованием памяти оптимизированных файловых групп и резервной копии из Amazon S3 может быть непростой задачей, особенно когда возникают ошибки, связанные с параметром MAXTRANSFERSIZE. Давайте подробно рассмотрим проблему и возможные решения.
Проблема
Вы пытаетесь восстановить базу данных с использованием командного вызова:
exec msdb.dbo.rds_restore_database
@restore_db_name="MyDatabase",
@s3_arn_to_restore_from='arn:aws:s3:::myBucket/myBackup.bak'
Однако, процесс восстановления завершается с ошибкой:
RESTORE requires MAXTRANSFERSIZE=327680 but 65536 was specified.
RESTORE FILELIST is terminating abnormally.
Aborted the task because of a task failure or a concurrent RESTORE_DB request.
Task has been aborted
Empty restore file list result retrieved.
Эта ошибка указывает на то, что используется неподходящее значение MAXTRANSFERSIZE. В частности, для баз данных, которые настроены на использование FILESTREAM или содержат оптимизированные по памяти файловые группы, значение MAXTRANSFERSIZE при восстановлении должно быть больше или равно значению, использованному при создании резервной копии.
Причина ошибки
При создании резервной копии вашей базы данных вы использовали следующий код:
BACKUP DATABASE [MyDatabase]
TO DISK = 'C:\Data\Backups\MyBackup.bak'
WITH INIT, MAXTRANSFERSIZE = 65536, STATS = 1;
В этом случае значение MAXTRANSFERSIZE было установлено на 65536, что является причиной проблемы при восстановлении. Параметр MAXTRANSFERSIZE фактически определяет размер блока данных, передаваемого во время операции резервного копирования и восстановления. Поэтому, если база данных использует функции, которые требуют более высокого значения, например максимальное значение 327680, то выполнение операции завершится неудачно.
Решение
-
Создание новой резервной копии: Вам нужно создать новую резервную копию базы данных, используя значение MAXTRANSFERSIZE, равное или больше 327680. Для этого используйте следующую команду (замените путь к файлу на актуальный):
BACKUP DATABASE [MyDatabase] TO DISK = 'C:\Data\Backups\MyBackup.bak' WITH INIT, MAXTRANSFERSIZE = 327680, NO_COMPRESSION, STATS = 1;
Использование
WITH NO_COMPRESSION
гарантирует, что MAXTRANSFERSIZE будет правильно обрабатываться, предотвращая автоматическую корректировку этого параметра. -
Загрузка резервной копии в S3: После создания резервной копии, загрузите её обратно в Amazon S3, используя доступные методы, такие как AWS CLI или AWS SDK.
-
Выполнение восстановления: Теперь, когда вы имеете резервную копию с необходимым размером блоков, вы можете снова выполнить операцию восстановления:
exec msdb.dbo.rds_restore_database @restore_db_name="MyDatabase", @s3_arn_to_restore_from='arn:aws:s3:::myBucket/myBackup.bak'
Заключение
Восстановление баз данных в AWS RDS может быть затруднено из-за специфики использования памяти оптимизированных файловых групп и некорректной настройки значений для MAXTRANSFERSIZE. Следуя указанным выше шагам, вы сможете успешно восстановить вашу базу данных. Не забудьте протестировать процесс резервного копирования и восстановления в тестовой среде, чтобы избежать сюрпризов на продакшн-системах.