最近公司SQL服务器老是无故掉线,想查查原因,准备用VS2005 C#写一监测程序,需要达到以下功能:1.监测某一端口的通讯状态(打开还是关闭,主要监测1433端口是否正常)
2.监测某一服务的运行状态(运行还是关闭,SQL服务是否正常)上面的监测方案正不正确(或完善)?
要实现上面两个监测功能怎么实现?(要采用哪些关键性类库?)

解决方案 »

  1.   

    1.使用类似于telnet的sock.Connect
    ref:http://topic.csdn.net/t/20051111/08/4386081.html
    2.使用windows自带的性能监视器对sqlserver的进程进行追踪,比如cpu,内存等资源的使用情况
    服务错误在事件日志中可以查看
      

  2.   

    每隔一段时间查询一下表内容,做个select,岂不是最简单的?写个sql查询程序,通过windows的task管理器,1分钟运行一次
      

  3.   

    使用些api函数,应该能够检测到端口的信息。不过需要底层的知识。
      

  4.   


    每隔一段时间查询一下表内容,做个select,岂不是最简单的?
    已经测试过了,经常掉线,现在是找掉线的原因,我怀疑是1433或其某相关端口关闭了才导致掉线写个sql查询程序,通过windows的task管理器,1分钟运行一次
    这个不是很明白
      

  5.   


    1.使用类似于telnet的sock.Connect
    ref:http://topic.csdn.net/t/20051111/08/4386081.html
    从本地电脑连接端口也已经测试过了,经常连不上,我现在是想在服务器上监测这一端口是否一直处于打开的状态,因为掉线可能还有网络的原因,在服务器上监测则这一端口的状态,则可以不用理会因网络掉线的问题2.使用windows自带的性能监视器对sqlserver的进程进行追踪,比如cpu,内存等资源的使用情况
    服务错误在事件日志中可以查看
    进程和服务好象是两回事吧,比如某一恶意程序可以将服务关闭,随后又打开,但进程应该 一直都在运行吧,你的意思是说服务关闭了之后,进程就结束了吗?谢谢
      

  6.   

    从本地电脑连接端口也已经测试过了,经常连不上,我现在是想在服务器上监测这一端口是否一直处于打开的状态,因为掉线可能还有网络的原因,在服务器上监测则这一端口的状态,则可以不用理会因网络掉线的问题 
    -------------
    那你到服务器上运行sock.Connect(服务器ip,1433)就不用考虑网络情况了比如某一恶意程序可以将服务关闭,随后又打开,但进程应该 一直都在运行吧,你的意思是说服务关闭了之后,进程就结束了吗?
    ---------------------
    数据库启动后,任务管理器有就sqlserver.exe的进程,可能不是很精确,但是确实是用来描述数据库服务实时运行情况,关闭后该进程不会存在
    但是服务“暂停”的情况就需要去测试一下
    另外应该首先保证运行环境的纯净,排除病毒,木马的情况
      

  7.   

    谢谢各位
    端口的问题已经解决,正在测试中现在只剩下对 MSSQLSERVER 服务的监测了
    大家多提宝贵意见另外答yan63:如果sqlserver.exe的进程结束,SQL数据库肯定不能连接上,同时MSSQLSERVER服务的状态由“启用”变为空
      

  8.   

    已经搞定了
    谢谢大家!
    核心代码奉上:
                //进程监测
                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);
                }