2017-05-26 11 views
3

状況設定:我々は、直接SQLサーバへのアクセスだけにはできませんが必要なホストされたアプリケーションを持っているSQLデータベースには、PowerShellを使用して復元する可変

を。回避策は、ホストがSFTP経由で毎週バックアップを提供することです。スクリプトは、WinSCPのスクリプトを実行するために走った

CMDバッチは、(保存されたとのWinSCPディレクトリで実行されていました)

WinSCP.com /script=sftpscript.txt 

WinSCPのスクリプトが実行された:

私は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 Variable $ bakをTSQLスクリプトで使用するようになっています。

PowershellとTSQLはどちらもエントリーレベルです。ここで

はコマンド式は以下のショーン・メルトンの回答に基づいて、これを完了するために使用されます。このコマンドは、WinSCPのコマンドの後に使用されている

USE [DB] 
GO 
CREATE USER [Reader] FOR LOGIN [Reader] 
GO 
USE [DB] 
GO 
ALTER ROLE [db_datareader] ADD MEMBER [Reader] 
GO 

許可スクリプトにバックアップを入れている

Restore-DBADatabase -SqlInstance localhost -path 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup' -WithReplace -UseDestinationDefaultDirectories 

invoke-sqlcmd -inputfile "Permission.sql" -serverinstance localhost 

ディレクトリ。

+0

あなたの会社がリストアを管理するdbaを考慮していない理由をもっと興味がある。あなたのシステムは単純な回復をしていますか?完全バックアップおよび/または差分バックアップを使用する場合は、前回の完全バックアップの時点から順次バックアップの順序を考慮する必要があります。 –

+0

single_userは何をしていますか?ドキュメントは新鮮な顔の変化を得ており、はるかに簡単に学ぶことができます。誰かがあなたにスクリプトをくれたとしても、あなたはこの変更を担当します。したがって、dba –

+0

に問い合わせてください。TSQLスクリプトでシェル環境変数を使用できるようです。 https://docs.microsoft.com/en-us/sql/relational-databases/scripting/sqlcmd-use-with-scripting-variablesのCセクションを参照してください。 – lit

答えて

1

dbatoolsというコミュニティベースのモジュールを利用できます。あなたが望むコマンドはRestore-DbaDatabase、完全なコードはhereです。

復元するたびにそのバックアップファイルを1つだけ保持する場合は、復元機能を呼び出して、そのディレクトリを指すようにします。それは単なる完全バックアップなので、バックアップをピックアップして復元します。

例として、バックアップファイルを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

関連する問題