我想知道是否可以通过运行任何 sql 查询来知道 sql server 的实例是否在镜像/主体中?其次,我想每天凌晨 4 点自动在 60-80 个实例上运行它吗?我想用powershell以前用过,从经验上用起来挺容易的。Tks
问问题
4054 次
2 回答
0
有可能的。您将需要使用 SMO 对象。
$server = "dwhtest-new"
$srv = New-Object Microsoft.SqlServer.Management.Smo.Server $server
$db = New-Object Microsoft.SqlServer.Management.Smo.Database
$dbs = $srv.Databases
foreach ($db1 in $dbs)
{
$db = New-Object Microsoft.SqlServer.Management.Smo.Database
$db = $db1
$DatabaseName = $db.Name
Write-Host $DatabaseName
Write-Host "MirroringStatus:" $db.MirroringStatus
Write-Host "DBState:" $db.Status
Write-Host
}
如果您的数据库的镜像仍然完好无损,您将收到 MirroringStatus 的“已同步”,它的主数据库会显示状态为“正常”,如果是故障转移,它将显示“正在恢复”。不幸的是,据我所知,没有办法仅仅拉出“镜像”或“原则”的状态。您将不得不构建逻辑来检查这两个值。恢复
于 2012-04-20T22:08:25.560 回答
0
这取决于您将如何设置工作?
如果您想从收集所有信息的中央服务器运行它,那么 SMO 将是使用 PowerShell 的方式。KickerCost提供的答案可以工作,但需要更多工作才能为多台服务器运行它。最好以他的示例为例,将其转换为允许通过管道输入服务器名称的工作函数。
如果您只想在每台服务器上本地运行一个作业(计划任务或 SQL 代理作业),该作业可能指向网络共享上的脚本,那么可能将该信息输出到一个文件(如 servername_instance.log)中,您可以使用使用 SQLPS 的单线:
dir SQLSERVER:\SQL\KRINGER\Default\Databases | Select Name, MirroringStatus
KRINGER 是我的服务器名称,具有默认实例。如果您已命名实例,则将“默认”替换为实例名称。此命令的输出将与此类似:
Name MirroringStatus
---- ---------------
AdventureWorks None
AdventureWorksDW None
显然我没有涉及镜像的任何数据库。
于 2012-04-21T03:19:30.210 回答