0

我想知道是否可以通过运行任何 sql 查询来知道 sql server 的实例是否在镜像/主体中?其次,我想每天凌晨 4 点自动在 60-80 个实例上运行它吗?我想用powershell以前用过,从经验上用起来挺容易的。Tks

4

2 回答 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 回答