最近公司SQL服务器老是无故掉线,想查查原因,准备用VS2005 C#写一监测程序,需要达到以下功能:1.监测某一端口的通讯状态(打开还是关闭,主要监测1433端口是否正常)
2.监测某一服务的运行状态(运行还是关闭,SQL服务是否正常)上面的监测方案正不正确(或完善)?
要实现上面两个监测功能怎么实现?(要采用哪些关键性类库?)
2.监测某一服务的运行状态(运行还是关闭,SQL服务是否正常)上面的监测方案正不正确(或完善)?
要实现上面两个监测功能怎么实现?(要采用哪些关键性类库?)
ref:http://topic.csdn.net/t/20051111/08/4386081.html
2.使用windows自带的性能监视器对sqlserver的进程进行追踪,比如cpu,内存等资源的使用情况
服务错误在事件日志中可以查看
每隔一段时间查询一下表内容,做个select,岂不是最简单的?
已经测试过了,经常掉线,现在是找掉线的原因,我怀疑是1433或其某相关端口关闭了才导致掉线写个sql查询程序,通过windows的task管理器,1分钟运行一次
这个不是很明白
1.使用类似于telnet的sock.Connect
ref:http://topic.csdn.net/t/20051111/08/4386081.html
从本地电脑连接端口也已经测试过了,经常连不上,我现在是想在服务器上监测这一端口是否一直处于打开的状态,因为掉线可能还有网络的原因,在服务器上监测则这一端口的状态,则可以不用理会因网络掉线的问题2.使用windows自带的性能监视器对sqlserver的进程进行追踪,比如cpu,内存等资源的使用情况
服务错误在事件日志中可以查看
进程和服务好象是两回事吧,比如某一恶意程序可以将服务关闭,随后又打开,但进程应该 一直都在运行吧,你的意思是说服务关闭了之后,进程就结束了吗?谢谢
-------------
那你到服务器上运行sock.Connect(服务器ip,1433)就不用考虑网络情况了比如某一恶意程序可以将服务关闭,随后又打开,但进程应该 一直都在运行吧,你的意思是说服务关闭了之后,进程就结束了吗?
---------------------
数据库启动后,任务管理器有就sqlserver.exe的进程,可能不是很精确,但是确实是用来描述数据库服务实时运行情况,关闭后该进程不会存在
但是服务“暂停”的情况就需要去测试一下
另外应该首先保证运行环境的纯净,排除病毒,木马的情况
端口的问题已经解决,正在测试中现在只剩下对 MSSQLSERVER 服务的监测了
大家多提宝贵意见另外答yan63:如果sqlserver.exe的进程结束,SQL数据库肯定不能连接上,同时MSSQLSERVER服务的状态由“启用”变为空
谢谢大家!
核心代码奉上:
//进程监测
try
{
if (Process.GetProcessesByName(pro_name).Count() == 0)
{
if (pro_bool == false)
{
ListViewItem livi = new ListViewItem(DateTime.Now.ToString("yy-MM-dd hh:mm:ss ffff"));
livi.SubItems.Add("结束");
listView1.Items.Add(livi);
pro_bool = true;
}
}
else
{
if (pro_bool == true)
{
ListViewItem livi = new ListViewItem(DateTime.Now.ToString("yy-MM-dd hh:mm:ss ffff"));
livi.SubItems.Add("运行");
listView1.Items.Add(livi);
pro_bool = false;
} }
}
catch (Exception Exc)
{
MessageBox.Show(Exc.Message);
} //端口监测
//用 netstat -a 查看本机打开的端口,如果有该端口的状态为LISTENING,说明处于监听之中,为活跃端口,可以连接,其他都不可连接
try
{
sock.Connect(IPAddress.Parse(textBox5.Text.Trim()), int.Parse(textBox2.Text.Trim()));
if (soc_bool == true)
{
ListViewItem livi = new ListViewItem(DateTime.Now.ToString("yy-MM-dd hh:mm:ss ffff"));
livi.SubItems.Add("打开");
listView2.Items.Add(livi);
soc_bool = false;
}
}
catch (SocketException)
{
if (soc_bool == false)
{
ListViewItem livi = new ListViewItem(DateTime.Now.ToString("yy-MM-dd hh:mm:ss ffff"));
livi.SubItems.Add("关闭");
listView2.Items.Add(livi);
soc_bool = true;
}
}
//服务监测
ServiceController sc = new ServiceController(textBox3.Text.Trim());
if (str_sc_0 != sc.Status.ToString())
{
switch (sc.Status)
{
case ServiceControllerStatus.ContinuePending:
str_sc = "正在继续";
break;
case ServiceControllerStatus.Paused:
str_sc = "已暂停";
break;
case ServiceControllerStatus.PausePending:
str_sc = "正在暂停";
break;
case ServiceControllerStatus.Running:
str_sc = "正在运行";
break;
case ServiceControllerStatus.StartPending:
str_sc = "正在启动";
break;
case ServiceControllerStatus.Stopped:
str_sc = "已停止";
break;
case ServiceControllerStatus.StopPending:
str_sc = "正在停止";
break;
}
str_sc_0 = sc.Status.ToString(); ListViewItem livi = new ListViewItem(DateTime.Now.ToString("yy-MM-dd hh:mm:ss ffff"));
livi.SubItems.Add(str_sc);
listView3.Items.Add(livi);
}