[치정] 제3장 - 시스템 함수, 저장 프로세스와 DBCC SQLPERF 명령을 사용하여 SQLServer를 감시한다(2)

5031 단어
위에서 언급한 바와 같이 본고는 시스템 저장 프로세스를 어떻게 사용하여 시스템을 감시하고 통제하는지를 설명한다.
 
SQLServer 역시 SQLServer를 모니터링하고 현재 프로세스, 세션, 요청 및 잠금에 대한 자세한 정보를 얻을 수 있는 일련의 시스템 저장 프로세스를 제공합니다.본고는 이러한 모니터링을 실현하기 위해 시스템 저장 과정을 보여줄 것이다.
 
시나리오:
때때로 응용 프로그램이 갑자기 느려져서 데이터베이스 응답을 기다려야 하는 것을 발견할 수 있다. 이 때 요청이 막히거나 끊겼는지 빨리 확인해야 한다.
 
준비:
 
이 문서에서는 다음 저장 프로세스를 사용하여 현재 프로세스에 대한 정보를 얻습니다.
 
  • Sp_who
  • Sp_who2

  •  
    단계:
     
    1. SSMS를 열고 SQLServer 인스턴스에 연결하고 새 질의 창을 엽니다.
     
    2. 새 질의 창에 다음 스크립트를 입력합니다.
     
    USE tempdb
    GO
    
    --     
    IF OBJECT_ID('tempdb.dbo.#tbl_SPWho') IS NOT NULL 
        BEGIN
            DROP TABLE tempdb.dbo.#tbl_SPWho
        END
    
    CREATE TABLE tempdb.dbo.#tbl_SPWho
        (
          spid SMALLINT ,
          ecid SMALLINT ,
          [status] NVARCHAR(30) ,
          loginame NVARCHAR(128) ,
          hostName NVARCHAR(128) ,
          blk CHAR(5) ,
          dbname NVARCHAR(128) ,
          cmd NVARCHAR(16) ,
          request_id INT
        )
    
    --                   
    INSERT  INTO tempdb.dbo.#tbl_SPWho
            EXEC sp_who
    GO
    
    --    sp_who2      
    IF OBJECT_ID('tempdb.dbo.#tbl_SPWho2') IS NOT NULL 
        BEGIN
            DROP TABLE tempdb.dbo.#tbl_SPWho2
        END
    
    CREATE TABLE tempdb.dbo.#tbl_SPWho2
        (
          spid SMALLINT ,
          [status] NVARCHAR(30) ,
          [login] NVARCHAR(128) ,
          HostName NVARCHAR(128) ,
          BlkBy CHAR(5) ,
          DBName NVARCHAR(128) ,
          Command NVARCHAR(16) ,
          CPUTime INT ,
          DiskIO INT ,
          LastBatch NVARCHAR(50) ,
          ProgramName NVARCHAR(100) ,
          SPID2 SMALLINT ,
          REQUESTID INT
        )
    
    --                   
    INSERT  INTO tempdb.dbo.#tbl_SPWho2
            EXEC sp_who2
    GO
    
    --          
    SELECT  spid AS SessionID ,
            ecid AS ExecutionContextID ,
            [status] AS ProcessStatus ,
            loginame AS LoginName ,
            hostname AS HostName ,
            blk AS BlockedBy ,
            dbname AS DatabaseName ,
            cmd AS CmomandType ,
            request_id AS RequestID
    FROM    dbo.#tbl_SPWho
    WHERE   dbname = 'AdventureWorks'
    GO
    
    --        
    SELECT  spid AS SessionID ,
            ecid AS ExecutionContextID ,
            [status] AS ProcessStatus ,
            loginame AS LoginName ,
            hostname AS HostName ,
            blk AS BlockedBy ,
            dbname AS DatabaseName ,
            cmd AS CmomandType ,
            request_id AS RequestID
    FROM    dbo.#tbl_SPWho
    WHERE   blk > 0
    GO
    
    --       
    SELECT  spid AS SessionID ,
            ecid AS ExecutionContextID ,
            [status] AS ProcessStatus ,
            loginame AS LoginName ,
            hostname AS HostName ,
            blk AS BlockedBy ,
            dbname AS DatabaseName ,
            cmd AS CmomandType ,
            request_id AS RequestID
    FROM    dbo.#tbl_SPWho
    WHERE   [STATUS] = 'suspended'
    GO
    

     
    분석:
     
    이 예에서 sp 를 저장하기 위해 두 개의 임시 테이블을 만들었습니다who 및 spwho2 저장 프로세스가 되돌아오는 데이터 결과를 INSERT... EXECUTE 명령을 통해 임시 테이블에 삽입합니다. 예에서 spwho의 사용, spwho2의 사용은 같다.
     
    임시 테이블로 데이터를 저장하는 이유는 spwho/sp_who2 이 두 시스템의 저장 프로세스는 결과를 직접 선별할 수 없기 때문에 테이블에 저장하여 2차 처리를 해야 한다.
     
    확장 정보:
     
    DMO가 SQL 서버에 가입하기 전에 spmoitor、sp_who2、sp_who 이 세 시스템의 저장 과정은 시스템의 현재 정보를 감시하는 데 광범위하게 사용된다.
     
        Sp_모니터는 위에서 언급한 바와 같이 시스템 통계 함수와 호환하여 사용할 수 있다.
     
        Sp_who는 현재 SQLServer 프로세스, 세션 및 요청에 대한 자세한 정보를 얻을 수 있는 시스템 스토리지 프로세스입니다.이 저장 프로세스를 통해 누가 어떤 조작이나 명령을 실행했는지, 어떤 프로세스가 어떤 프로세스에 의해 막혔는지 알 수 있다.이 저장 프로세스에는 선택할 수 있는 매개 변수가 있습니다: @loginame (유형은sysname),session ID (유형은smallint),ACTIVE.@loginame를 보내서 특정한 로그인 이름의 정보를 선별할 수 있으며, 세션 ID도 정의되면 특정sessionid의 정보를 선별할 수 있습니다.매개 변수가 없으면 범위 실례 단계의 정보를 가져옵니다.만약 VIEW SYSTEM STATE 권한이 없다면, 이 세션의 정보만 볼 수 있습니다.ACTIVE 매개변수를 사용한 경우저장 프로세스가 활성 프로세스로 돌아갑니다.
     
    spwho가 반환한 결과:
     
    Spid:sessionID, 즉 세션 ID를 반환합니다. 이 ID 중 1~50은 시스템 세션입니다.51 이상 세션은 사용자 세션 ID입니다.
    Exid: 병렬 질의가 발생했기 때문에 결과에 동일한 SPID가 여러 개 있을 수 있습니다.이 열은 질의의 컨텍스트 ID를 나타냅니다.0은 부모 라인을 대표하고 다른 값은 하위 라인을 대표한다.
    Status: 프로세스의 상태를 되돌려줍니다. Dormant (휴면), Running (실행 중), Background (백그라운드에서 실행 중인 프로세스는 잠금 탐지 중), Rollback (업무가 롤백 중), Pending (마운트, 이 세션은 사용 가능한 작업 라인을 기다리고 있음), Runnable (세션의 작업은 시간 측정을 받을 때 계획 프로그램의 실행 대기열에 있음 있음 있음 있음),Spinloop (세션 작업이 조절 잠금이 사용 가능해지기를 기다리고 있음), Suspended (입출력 완료와 같은 세션 대기 시간).
    Loginame: 세션에 대한 로그인 이름
    Hostname: 세션에 해당하는 시스템 이름
    Blk: 세션이 막히면, 막힌 세션 ID가 표시됩니다. 없으면 0으로 내려갑니다.
    Dbname: 특정 세션에서 요청한 데이터베이스 이름을 반환합니다.
    Cmd: 데이터베이스 엔진의 명령 유형을 반환합니다.
    Request_id: 세션의 요청 ID입니다.
     
    sp 에 상대적who,sp_who2는 더 많은 정보를 되돌려주지만 spwho2는 공개되지 않은 시스템 저장 프로세스로 온라인 총서에서 관련 정보를 찾을 수 없다는 것을 의미한다.

    좋은 웹페이지 즐겨찾기