Powershell在SQL Server中查找主体/镜像

Powershell在SQL Server中查找主体/镜像,sql,tsql,powershell,Sql,Tsql,Powershell,我想知道是否可以通过运行任何sql查询来知道sql server实例是否在镜像/优先级中?第二,我想每天早上4点在60-80个实例上运行它,这是自动可能的吗?我想使用powershell,以前使用过它,从经验来看很容易使用。这是可能的。您需要使用SMO对象 $server = "dwhtest-new" $srv = New-Object Microsoft.SqlServer.Management.Smo.Server $server $db = New-Object Microsoft.Sq

我想知道是否可以通过运行任何sql查询来知道sql server实例是否在镜像/优先级中?第二,我想每天早上4点在60-80个实例上运行它,这是自动可能的吗?我想使用powershell,以前使用过它,从经验来看很容易使用。这是可能的。您需要使用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的“Synchronized”(已同步)及其主镜像,其状态将显示为“Normal”(正常),如果故障切换,则显示为“Restoring”(恢复)。不幸的是,据我所知,没有办法摆脱“镜像”或“原则”的状态。您必须构建逻辑来检查这两个值。
恢复

这取决于如何设置作业

如果您想从一台收集所有信息的中央服务器上运行它,那么SMO将是PowerShell的最佳选择。由提供的答案可以工作,但需要更多的工作才能在多台服务器上运行它。最好以他的例子为例,将其转换为一个工作函数,允许通过管道输入服务器名称

如果要在每个服务器上本地运行一个作业(计划任务或SQL代理作业),该作业可能指向网络共享上的脚本,然后可能会将该信息输出到一个文件(如servername_instance.log),您可以使用SQLPS的一行程序:


dir SQLSERVER:\SQL\KRINGER\Default\Databases | Select Name, MirroringStatus
KRINGER是我的服务器名,带有一个默认实例。如果已命名实例,则将“默认”替换为实例名称。 此命令的输出类似于:


Name                     MirroringStatus
----                     ---------------
AdventureWorks           None
AdventureWorksDW         None
显然,镜像中没有涉及任何数据库