2011-12-13 27 views
0

我試圖自動化我的SQL數據庫備份過程。我的目標是使用Cloudberry Powershell cmdlet讓我直接控制和訪問S3存儲桶。我可以手動執行此操作,但無法讓我的SQL作業使用此功能。如何從計劃的SQL代理作業中使用Cloudberry Powershell管理單元(用於Amazon S3)?

根據Cloudberry的安裝說明,如果Powershell已經安裝,我不應該註冊Cloudberry Powershell管理單元。我發現這是錯誤的。我試圖註冊它,無論是64位還是32位都沒有運氣。

當從ISE執行手動/明確這工作:

Add-PSSnapin CloudBerryLab.Explorer.PSSnapIn 

$today = Get-Date -format "yyyy.MM.dd.HH.mm.ss" 
$key = "mykeygoeshere" 
$secret = "mysecretgoeshere" 

$s3 = Get-CloudS3Connection -Key $key -Secret $secret 
$destination = $s3 | Select-CloudFolder -path "ProductionBackups/MyClient/log/" | Add-CloudFolder $today 
$src = Get-CloudFilesystemConnection | Select-CloudFolder "X:\backups\MyClient\current\" 
$src | Copy-CloudItem $destination -filter "log.trn" 

^當這個命令在SQL代理執行作業時,出現此消息:

作爲用戶執行: DB-MAIN \ SYSTEM。作業步驟在PowerShell腳本的第1行收到錯誤。相應的行是'Add-PSSnapin CloudBerryLab.Explorer.PSSnapIn'。糾正腳本並重新安排作業。 PowerShell返回的錯誤信息是:'術語'Add-PSSnapin'不被識別爲cmdlet,函數,腳本文件或可操作程序的名稱。檢查名稱的拼寫,或者如果包含路徑,請驗證路徑是否正確,然後重試。 」。處理退出代碼-1。該步驟失敗。

我看過this blog post SQLPS.exe無法執行'Add-PSSnapin'命令嗎?真的嗎?我無法找到有關此主題的任何澄清...

如何將我的SQL備份文件自動化到Amazon S3雲?我已經嘗試了一切。 TNT驅動器是一個巨大的浪費時間。我希望Cloudberry可以做到,任何提示?

+2

它看起來像腳本正在運行的系統用戶。您是否嘗試過以系統帳戶手動運行腳本?您可以使用sysinternals工具psexec.exe -i -s「C:\ ... \ powershell.exe」作爲系統帳戶啓動Powershell.exe實例。另外爲什麼不將它作爲Windows計劃任務運行? – 2011-12-14 07:08:45

+0

我最終將其作爲Windows計劃任務運行,並且工作正常。我根本無法讓它從SQL代理作業執行。 – D3vtr0n 2012-01-17 23:16:56

回答

1

您可以使用Amazon AWS .Net SDK。你可以從這裏下載: http://aws.amazon.com/sdkfornet/

這裏的例子函數從S3下載文件:

function DownloadS3File([string]$bucket, [string]$file, [string]$localFile) 
{ 
if (Test-Path "C:\Program Files (x86)") 
{ 
    Add-Type -Path "C:\Program Files (x86)\AWS SDK for .NET\bin\AWSSDK.dll" 
} 
else 
{ 
    Add-Type -Path "C:\Program Files\AWS SDK for .NET\bin\AWSSDK.dll" 
} 

$secretKeyID= $env:AWS_ACCESS_KEY_ID 
$secretAccessKeyID= $env:AWS_SECRET_ACCESS_KEY 

$client=[Amazon.AWSClientFactory]::CreateAmazonS3Client($secretKeyID,$secretAccessKeyID) 

$request = New-Object -TypeName Amazon.S3.Model.GetObjectRequest 
$request.BucketName = $bucket 
$request.Key = $file 
$response = $client.GetObject($request) 

$writer = new-object System.IO.FileStream ($localFile ,[system.IO.filemode]::Create) 
[byte[]]$buffer = new-object byte[] 4096 
[int]$total = [int]$count = 0 
do 
    { 
    $count = $response.ResponseStream.Read($buffer, 0, $buffer.Length)  
    $writer.Write($buffer, 0, $count) 
    } 
    while ($count -gt 0) 

$response.ResponseStream.Close() 
$writer.Close() 

echo "File downloaded: $localFile" 
}