2017-05-26 37 views
3

現狀:SQL數據庫恢復使用PowerShell設置可變

我們有一個託管的應用程序,我們需要直接訪問SQL服務器,但無法。解決方法是Host通過SFTP提供每週備份。

我有下載使用WinSCP賦予備份的腳本:

CMD批處理腳本跑到運行WinSCP賦予腳本(保存和WinSCP賦予目錄RAN)

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腳本纔會恢復備份。

我的問題是讓我的TSQL腳本中使用Powershell變量$ bak。

請注意當涉及到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命令後使用已經把備份成該目錄。

+0

進一步好奇,爲什麼貴公司不考慮dba來管理恢復。你的系統是否只是簡單的恢復?如果它使用完整備份和/或差異備份,則必須考慮從上次完全備份時起進行順序備份的順序。 –

+0

你知道single_user做什麼嗎?文檔已經有了新的改版,並且更容易學習。即使有人給了你一個腳本,你也要對這個改變負責。因此問一個dba –

+0

看來,TSQL腳本可以使用shell環境變量。請參閱https://docs.microsoft.com/en-us/sql/relational-databases/scripting/sqlcmd-use-with-scripting-variables的C部分 – lit

回答

1

您可以使用一個名爲dbatools的基於社區的模塊。你想要的命令是Restore-DbaDatabase,完整的代碼可以找到here

如果每次恢復時只保留一個備份文件,則可以簡單地調用恢復功能並將其指向目錄。它會選擇備份並進行恢復,因爲它只是一個完整備份。

所以作爲一個例子,如果您將備份文件下載到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腳本。

+0

這工作完美。這是我爲我的需要運行的命令:Restore-DBADatabase -SqlInstance localhost -path'C:\ Program Files \ Microsoft SQL Server \ MSSQL12.MSSQLSERVER \ MSSQL \ Backup'-WithReplace -UseDestinationDefaultDirectories – Cody