Восстановление базы данных SQL с помощью набора переменных Powershell
Ситуация:
У нас есть размещенное приложение, которое нам необходимо иметь прямой доступ к серверу SQL, но не в состоянии. Обходной путь - хост обеспечивает еженедельное резервное копирование через SFTP.
У меня есть скрипт, который загружает резервную копию с помощью WinSCP:
CMD Batch Script запущен для запуска WinSCP Script (сохранен и запущен в каталоге WinSCP)
WinSCP.com /script=sftpscript.txt
Скрипт WinSCP работал:
open sftp://<<Serveraddress and login>><<REMOTE SFTP DIRECTORY>>
synchronize local -delete "<<LOCAL DIRECTORY" "<<REMOTE SFTP DIRECTORY>>"
exit
Загруженная резервная копия имеет метку времени в конце имени файла:BACKUP_20170526_222744.BAK
Мне нужно сделать запрос на обновление имени файла автоматически и использовать это имя в качестве переменной для восстановления резервной копии. Я выяснил, как вытащить имя файла и установить в качестве переменной в Powershell здесь:
set-location -path '<<LOCAL BACKUP DIRECTORY>>'
$bak = ls | where-object {$_.Name -Like '*.BAK'} | select-object -expandproperty name
Чтобы восстановить базу данных в TSQL, я в настоящее время использую следующий скрипт, но вручную введите имя файла резервной копии:
USE [master]
ALTER DATABASE [DB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
RESTORE DATABASE [DB] FROM DISK = N'<<LOCAL DIRECTORY>>\<<BACKUP FILE>>' WITH FILE = 1, MOVE N'DB' TO N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\DB.mdf', MOVE N'DB_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\DB_log.ldf', NOUNLOAD, REPLACE, STATS = 5
GO
ALTER DATABASE [DB] SET MULTI_USER
GO
USE [DB]
GO
CREATE USER [Reader] FOR LOGIN [Reader]
GO
USE [DB]
GO
ALTER ROLE [db_datareader] ADD MEMBER [Reader]
GO
И сценарии Powershell, и TSQL работают так, как задумано в настоящее время. Powershell устанавливает переменную $bak в качестве правильного имени файла для резервной копии. SQL-скрипт восстанавливает резервную копию, но только если вручную вводит имя файла резервной копии.
Моя проблема заключается в том, чтобы использовать переменную Powershell $bak в моем сценарии TSQL.
Обратите внимание, что я на начальном уровне, когда дело доходит до Powershell и TSQL.
Вот команда, используемая для завершения этого на основе ответа Шона Мелтона ниже:
Restore-DBADatabase -SqlInstance localhost -path 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup' -WithReplace -UseDestinationDefaultDirectories
invoke-sqlcmd -inputfile "Permission.sql" -serverinstance localhost
Скрипт разрешения
USE [DB]
GO
CREATE USER [Reader] FOR LOGIN [Reader]
GO
USE [DB]
GO
ALTER ROLE [db_datareader] ADD MEMBER [Reader]
GO
Эта команда используется после того, как команда WinSCP поместит резервную копию в каталог.
1 ответ
Вы можете использовать основанный на сообществе модуль под названием dbatools. Команда, которую вы хотели бы это Restore-DbaDatabase
Полный код можно найти здесь.
Если вы каждый раз сохраняете только один файл резервной копии для восстановления, вы можете просто вызвать функцию восстановления и указать ее в каталоге. Он подберет резервную копию и затем восстановит ее, так как это всего лишь полная резервная копия.
Так, в качестве примера, если вы перетащите файл резервной копии в C:\MSSQL\Backups
где ваш экземпляр SQL Server также имеет доступ к этому каталогу. Вы можете запустить этот код:
Import-Module dbatools
Restore-DbaDatabase -SqlServer SQLInstanceName -Path 'C:\MSSQL\Backups' -WithReplace `
-DestinationDataDirectory 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\' `
-DestinationLogDirectory 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\'
Вы можете просмотреть справку команды, чтобы увидеть другие параметры параметров. Я часто использую добавить -OutputScriptOnly
это сгенерирует для вас скрипт T-SQL, если вы захотите запустить его в другом процессе / методе.