Восстановление базы данных 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, если вы захотите запустить его в другом процессе / методе.

Другие вопросы по тегам