检测SQL集群
我正在尝试编写一些代码来确定SQL服务器列表是否启动。我尝试过每台服务器的WMI,SQLDMO,SqlDataSourceEnumerator和Ping端口1433,但都取得了不同程度的成功(请参阅下面的结果)。检测SQL集群
使用SQLDMO和SqlDataSourceEnumerator,我发现3中有6个,必须说3个缺少SQL服务器中的2个组成了一个群集。
Pinging端口1433在6个中找到4个,缺少2个是组成SQL集群的2个服务器。
WMI证明是最不成功的,因为它只在6台服务器中找到1台。
这里是我以前的原型服务器发现的代码:
private void buildServerMap(bool useLibCOM)
{
sqlServersMap = new Dictionary<string, string>();
if (useLibCOM)
{
//get all available SQL Servers
SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass();
SQLDMO.NameList sqlServers = sqlApp.ListAvailableSQLServers();
ArrayList servs = new ArrayList();
for (int i = 0; i < sqlServers.Count; i++)
{
object srv = sqlServers.Item(i + 1);
if (srv != null)
{
sqlServersMap.Add(srv.ToString(), srv.ToString());
}
}
}
else
{
System.Data.Sql.SqlDataSourceEnumerator enumSQL = System.Data.Sql.SqlDataSourceEnumerator.Instance;
System.Data.DataTable table = enumSQL.GetDataSources();
foreach (System.Data.DataRow row in table.Rows)
{
foreach (System.Data.DataColumn col in table.Columns)
{
sqlServersMap.Add((string)row[col], (string)row[col]);
}
}
}
}
private bool pingSqlServer(string server)
{
bool success = false;
TcpClient client = new TcpClient();
try
{
client.Connect(server, 1433);
success = true;
}
catch (Exception)
{
//throw;
}
return success;
}
public StringBuilder buildWmiServerList(string path, string sqlServer, string sqlServerServiceName, StringBuilder sb, out bool reportNeeded)
{
reportNeeded = false;
try
{
ManagementScope ms = new ManagementScope(path);
ms.Connect();
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Service WHERE Started = TRUE AND DisplayName='" + sqlServerServiceName + "'");
searcher.Scope = ms;
if (searcher != null && searcher.Get() != null)
{
foreach (ManagementObject service in searcher.Get())
{
sb.Append(sqlServer + " SQL Server service - RUNNING\n");
}
}
}
catch (Exception e)
{
sb.Append(sqlServer + " SQL Server service - UNVERIFIABLE\n");
reportNeeded = true;
}
return sb;
}
在如何解决任何想法/检测形成SQL集群SQL服务器?
我不知道DMO,不管怎么说都不推荐使用,但在SMO中可以使用Server.IsClustered。
,你可能也想看看这个: http://www.sqldbatips.com/showarticle.asp?ID=45
为什么不试试SQL ping?这里有源代码,所以你可以看到他们是如何做到的。
无论如何,一些想法:
你们是不是在物理服务器,集群名称或虚拟服务器名称(S)如phys1,phys2,vclus,vserv1,vserv2(假设主动/主动)?
您是从客户端使用tcp还是命名管道?你尝试过tcp:vserv1吗? 例如,如果已禁用然后启用命名管道,则可以在集群IIRC上使用命名管道。 使用的协议列在SQL日志中,以及使用的tcp端口(名为instance = random)
您能在客户端上创建系统DSN吗?从这里,你可以计算出在HKLM \ SW \ Microsoft \ MSSQLServer下使用什么端口和协议?
无法保证服务器正在使用端口1433。 – 2009-01-23 16:03:04
任何完整的解决方案源代码? – Kiquenet 2011-01-26 20:43:29