【问题标题】:Start-AzureSqlDatabaseExport Object Reference not set to an instance of an objectStart-AzureSqlDatabaseExport 对象引用未设置为对象的实例
【发布时间】:2017-01-04 22:39:06
【问题描述】:

我不确定如何调试它,假设这不是 cmdlet 的问题。我正在尝试用自动化工作流替换自动化 SQL 导出,但我似乎无法让 Start-AzureSqlDatabaseExport 工作——它不断收到以下警告和错误消息。

d4fc0004-0c0b-443e-ad1b-310af7fd4e2a:[localhost]:客户端会话 ID: 'c12c92eb-acd5-424d-97dc-84c4e9c4f914-2017-01-04 19:00:23Z'

d4fc0004-0c0b-443e-ad1b-310af7fd4e2a:[localhost]:客户端请求 ID: 'd534f5fd-0fc0-4d68-8176-7508b35aa9d8-2017-01-04 19:00:33Z'

Start-AzureSqlDatabaseExport : 对象引用未设置为对象的实例。

在 DBBackup:11 字符:11 + + CategoryInfo : NotSpecified: (:) [Start-AzureSqlDatabaseExport], NullReferenceException + FullyQualifiedErrorId : Microsoft.WindowsAzure.Commands.SqlDatabase.Database.Cmdlet.StartAzureSqlDatabaseExport

这似乎与其他一些问题相似,但它们似乎没有答案或不适用。我在 Powershell 环境中确实有类似的过程。我用 Azure 的自动导出替换了该过程,现在这似乎是一个糟糕的选择!我尝试了许多变体,例如使用 sqlcontext 和 databasename 而不是数据库。

这是我的代码,其中敏感部分替换为 ****:

workflow DBBackup {

param(
    [parameter(Mandatory=$true)]  
    [string] $dbcode
    )

$cred = Get-AutomationPSCredential -Name "admindbcredentials"
$VerbosePreference = "Continue"

inlineScript {

    $dbcode = $using:dbcode
    $cred = $using:cred

    if ($dbcode -eq $null) 
    {
        Write-Output "Database code must be specified"
    }
    Else
    {
        $dbcode = $dbcode.ToUpper() 

        $dbsize = 1
        $dbrestorewait = 10
        $dbserver = "kl8p7d444a"
        $stacct = $dbcode.ToLower()
        $stkey = "***storagekey***"


        Write-Verbose "DB Server '$dbserver' DB Code '$dbcode'"
        Write-Verbose "Storage Account '$stacct'"
        $url = "https://$dbserver.database.windows.net"             
        $sqlctx = New-AzureSqlDatabaseServerContext -ManageUrl $url -Credential $cred
        # $sqlctx = New-AzureSqlDatabaseServerContext -ManageUrl $url -Credential $cred
        $stctx = New-AzureStorageContext -StorageAccountName $stacct -StorageAccountKey $stkey
        $dbname = "FSUMS_" + $dbcode        
        $dt = Get-Date
        $timestamp = $dt.ToString("yyyyMMdd") + "_" + $dt.ToString("HHmmss") 
        $bkupname = $dbname + "_" + $timestamp + ".bacpac"

        $stcon = Get-AzureStorageContainer -Context $stctx -Name "backups"
        $db = Get-AzureSqlDatabase -Context $sqlctx -DatabaseName $dbname

        Write-Verbose "Backup $dbname to $bkupname in storage account $stacct"
        Start-AzureSqlDatabaseExport $sqlctx -DatabaseName $dbname -StorageContainer $stcon -BlobName $bkupname        
    }
}
}

【问题讨论】:

    标签: azure automation export backup workflow


    【解决方案1】:

    改用New-AzureRmSqlDatabaseExport。此命令将返回导出状态对象。如果您想要同步导出,您可以在循环中检查“导出状态”。

    【讨论】:

    • 它告诉我它不承认这一点。我还没有转换为使用资源组——这可能是问题吗?我只是使用了默认资源组。错误消息:New-AzureRmSqlDatabaseExport:术语“New-AzureRmSqlDatabaseExport”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,如果包含路径,请验证路径是否正确并重试。
    • 检查是否安装了 AzureRM 模块。获取模块 –ListAvailable AzureRM* 。如果不。执行安装-模块 AzureRM 和安装-AzureRM。再试一次 New-AzureRmSqlDatabaseExport
    • 我正在尝试从自动化中执行此操作。我看到我的本地 PowerShell 上 AzureRM.Sql 的版本是 2.4.0,但是当我从 Automation 运行它时它是 1.0.3。
    • 我实际上已经崩溃并开始向 Microsoft 提出支持请求 - 认为发生了一些有趣的事情。
    【解决方案2】:

    添加以下行更正了问题:

    inlineScript 之前的工作流程中:

    $cred = Get-AutomationPSCredential -Name "admincredentials"
    
        (where admincredentials was an asset with my admin login credentials)
    

    并且在 inlineScript 内部:

    Add-AzureAccount $cred
    Select-AzureSubscription "My subscription"
    

    一些运行手册似乎不需要这个,但最好总是包含它。

    【讨论】:

    • 在对 Azure 资源进行任何操作时,始终需要进行身份验证。否则 Azure 不知道你是谁以及你是否被允许做任何事情。
    • Azure 自动化提供默认凭据和订阅,但我认为最好不要依赖它。在我的情况下,它有时会选择错误的订阅,没有明显的原因(它不是默认的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    相关资源
    最近更新 更多