gpt4 book ai didi

sql - PowerShell变量分配随机失败

转载 作者:行者123 更新时间:2023-12-02 23:47:23 25 4
gpt4 key购买 nike

我有一个奇怪的问题,大约只发生100次中的1次。我有一个使用SQL的SMO库执行PowerShell脚本的PowerShell脚本。这是我用来解决此问题的相关代码的片段:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | out-null
$now = get-date
########################################
$server = new-object Microsoft.SqlServer.Management.Smo.Server
$server.ConnectionContext.StatementTimeout = 86400 # Allow backups to take up to 24 hours per database
$databases = $server.Databases
$script:totalsteps = $databases.count
########################################
if($script:totalsteps -eq $null -or $script:totalsteps -eq 0) {
$body = "Backup start:" + $now.tostring("yyyy-MM-dd hh:mm:ss tt") + "`r`n" +
"Error: " + (get-date).tostring("yyyy-MM-dd hh:mm:ss tt") + "`r`n" +
"`$script:totalsteps: " + $script:totalsteps + "`r`n" +
"`$databases.count: " + $databases.count + "`r`n" +
"`$databases: " + $databases + "`r`n" +
"`$server: " + $server
send-mailmessage -from "me@example.com" -to "me@example.com" -subject "Server Null: $server" -smtpserver "mail.example.com" -body $body
}

问题是,有时if语句的评估结果为true,而我收到的电子邮件如下所示:
Backup start: 2013-04-30 07:50:58 AM
Error: 2013-04-30 08:02:19 AM
$script:totalsteps:
$databases.count: 4
$databases: [master] [model] [msdb] [tempdb]
$server: [serverA]

值得注意的是,脚本启动时间与错误时间大约为11分钟,这有点奇怪。我现在唯一的猜测是服务器承受着很大的压力,因此PowerShell默默地使变量赋值失败并继续运行。

100次中有99次if语句为假,并且我没有收到电子邮件。我不明白为什么 $script:totalsteps分配在100%的时间内都无法正常工作。有任何想法吗?我还能采取其他措施来解决此问题吗?

更新

为了测试惰性评估理论,我将代码更改为:
System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | out-null
$now = get-date
########################################
$server = new-object Microsoft.SqlServer.Management.Smo.Server
$server.ConnectionContext.StatementTimeout = 86400 # Allow backups to take up to 24 hours per database
$databases = $server.Databases
$script:totalsteps = $databases.count
############ NEW NEW NEW NEW ###########
if($script:totalsteps -eq $null -or $script:totalsteps -eq 0)
{
$script:totalsteps = $databases.count * 4
send-mailmessage -from "me@example.com" -to "me@example.com" -subject "Server Null: $server" -smtpserver "mail.example.com" -body "FIRST ATTEMPT"
}
########################################
if($script:totalsteps -eq $null -or $script:totalsteps -eq 0)
{
$body = "Backup start:" + $now.tostring("yyyy-MM-dd hh:mm:ss tt") + "`r`n" +
"Error: " + (get-date).tostring("yyyy-MM-dd hh:mm:ss tt") + "`r`n" +
"`$script:totalsteps: " + $script:totalsteps + "`r`n" +
"`$databases.count: " + $databases.count + "`r`n" +
"`$databases: " + $databases + "`r`n" +
"`$server: " + $server
send-mailmessage -from "me@example.com" -to "me@example.com" -subject "Server Null: $server" -smtpserver "mail.example.com" -body $body
}

最佳答案

只是在这里猜测,但是由于赋值是对$databases变量的首次访问:我相信对这些变量的求值是延迟的,因此,在尝试枚举数据库时您可能会超时,因为它首先需要打开连接。在那之后,您已经获取了数据,因此当您第二次使用它时就可以使用它。不过,有点难以验证。

我建议您也随电子邮件一起发送$Error变量,它实际上可能包含原因

关于sql - PowerShell变量分配随机失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16300303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com