독까의 이야기

MS-SQL DB 를 이용하는 서버의 CPU 사용량이 100% 가 출력되어 점검을 진행했다.


윈도우에서 성능 모니터에 카운터 추가를 해서 했는데 손이 너무 많이 간다. 


성능 모니터에서 카운터 추가

성능 개체 : Thread

카운터 : % Processor Time / ID Thread 

인스턴스 : sqlservr 리스트 전체 선택

CPU 사용량이 높은 SQL 스레드 ID 확인 : 4280

스레드 ID 로 spid 확인 

SELECT spid, kpid, dbid, cpu, memusage FROM sysprocesses WHERE kpid=4280

SPID : 240

spid 로 쿼리문 확인 

dbcc inputbuffer (240)


이렇게 했는데, 일을 두 번 할 필요는 없으니깐, SSMS 에서 한 번에 확인이 가능한 방법을 검색해서 정리해 보았다. 

SSMS 에 접속, tempdb 에서 새쿼리 실행 후 진행을 한다. 

그러면 tempdb 의 임시 테이블에 해당 테이블이 저장이 되는데, 다 확인하고 나면 맨 하단 drop 명령어로 테이블 제거를 하면 된다. 

use tempdb
CREATE TABLE #sp_who2 (SPID INT,Status VARCHAR(255),
      Login  VARCHAR(255),HostName  VARCHAR(255),
      BlkBy  VARCHAR(255),DBName  VARCHAR(255),
      Command VARCHAR(255),CPUTime INT,
      DiskIO INT,LastBatch VARCHAR(255),
      ProgramName VARCHAR(255),SPID2 INT,
      REQUESTID INT)
INSERT INTO #sp_who2 EXEC sp_who2
SELECT      *
FROM        #sp_who2
-- Add any filtering of the results here :
WHERE       Status = 'RUNNABLE'
-- Add any sorting of the results here :
ORDER BY    CPUTime ASC

CPU 사용량이 높은 spid 가 확인 됐으면, dbcc inputbuffer (SPID) 를 실행하여 쿼리문을 확인하면 된다. 

다 완료 되었으면 아래의 명령어를 통해 임시 테이블을 제거 한다. 

DROP TABLE #sp_who2


# 현재 실행 중인 쿼리문 확인하는 명령어

SELECT
   sqltext.TEXT,
   req.session_id,
   req.status,
   req.command,
   req.cpu_time,
   req.total_elapsed_time
FROM sys.dm_exec_requests req
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext 


위에 생성 된 임시테이블의 select 구문과 현재 실행 중인 쿼리문을 조회하는 실행문을 동시에 실행해서 일치하는 spid 를 찾는 것도 좋은 방법일 것 같다. 



Windows Server 2008 x86 서버에서 VSS 백업 실행 스케쥴이 등록되어 있는데, 실패가 확인되어 점검을 진행 했다. 


백업 볼륨에 대한 볼륨 섀도 복사본 작업에 실패하였으므로 '2018-06-22 오전 12:24:14'에서 시작한 백업에 오류가 발생했습니다. 오류 코드는 '2155348129'입니다. 문제가 해결되면 백업을 다시 실행하십시오.


- System
- Provider
[ Name] Microsoft-Windows-Backup
[ Guid] {1db28f2e-8f80-4027-8c5a-a11f7f10f62d}
EventID 521
Version 0
Level 2
Task 0
Opcode 0
Keywords 0x8000000000000000
- TimeCreated
[ SystemTime] 2018-06-22T00:25:19.750Z
EventRecordID 83720
Correlation
- Execution
[ ProcessID] 832
[ ThreadID] 4956
Channel Application
Computer
- Security
[ UserID] S-1-5-18
- EventData

BackupTime 2018-06-22T00:24:14.649Z
ErrorCode 2155348129
ErrorMessage %%2155348129


2155348129 오류 코드로 기술문서 검색 및 적용을 하려고 했는데, 기존에는 보이지 않던 경고 로그가 확인되어서 살펴 보았다. 


경고: IIS 로그가 항목을 쓰지 못했습니다.파일/LM/W3SVC/2/ROOT/global.asa 줄15 개체가 필요합니다.: 'RESPONSE'. .

- System
- Provider
[ Name] Active Server Pages
- EventID 9
[ Qualifiers] 32768
Level 3
Task 0
Keywords 0x80000000000000
- TimeCreated
[ SystemTime] 2018-06-22T00:27:16.000Z
EventRecordID 83722
Channel Application
Computer
Security
- EventData

IIS 로그가 항목을 쓰지 못했습니다.파일/LM/W3SVC/2/ROOT/global.asa 줄15 개체가 필요합니다.: 'RESPONSE'.  


혹시 IIS 로그 생성 관련으로 에러가 났을까 싶어서 IIS 에 등록 된 웹사이트 전체 로그 경로를 백업 디스크로 설정 후 백업 재실행 하였더니, 정상적으로 작동이 되었다. 


IIS 로그 프로세스랑 VSS 백업 프로세스랑 무슨 연관이 있는지 알아봐야겠다. 



서버가 한 대면 계정 생성을 수동으로 진행을 하겠는데, 여러 대의 서버에 동일 계정을 생성해야 할 경우 수동으로 하나씩 진행하는게 비효율적이다. 


계정 생성 및 그룹 설정, 암호 사용 기간 제한 해제 까지 가능한 구문 이다. 


내용을 알맞게 수정 후 cmd 에서 그냥 복사 붙이기 하면 된다. 


net user 신규계정명 패스워드 /add /comment:"신규계정에 대한 설명" 

net localgroup administrators 신규계정명 /add

wmic useraccount where name="신규계정명" set passwordexpires=false


자세한 설명은 cmd 에서 net help user 하면 나오는데 그냥 아래거 참고 하면 된다. 



이 명령에 대한 구문:


NET USER

[username [password | *] [options]] [/DOMAIN]

         username {password | *} /ADD [options] [/DOMAIN]

         username [/DELETE] [/DOMAIN]

         username [/TIMES:{times | ALL}]

         username [/ACTIVE: {YES | NO}]


NET USER는 컴퓨터에 사용자 계정을 만들고 기존 사용자 계정을 수정합니다.

스위치 없이 이 명령을 사용하면 컴퓨터의 모든 사용자 계정이 나열됩니다.

사용자 계정 정보는 사용자 계정 데이터베이스에 저장되어 있습니다.


username     추가하거나 삭제, 수정 또는 조회할 사용자 계정의 이름입니다.

             사용자 계정의 이름은 최대 20자까지 

             지정할 수 있습니다.

password     사용자 계정에 대한 암호를 지정하거나 변경합니다.

             암호 길이는 NET ACCOUNTS 명령의 /MINPWLEN 옵션에 설정된 

             최소 길이를 충족해야 합니다. 암호에는 최대 14자까지 

             지정할 수 있습니다.

*            암호에 대한 프롬프트를 생성합니다. 암호 프롬프트에 

             암호를 입력하면 화면에 암호가 표시되지 않습니다.

/DOMAIN      현재 도메인의 도메인 컨트롤러에서 작업을

             수행합니다.

/ADD         사용자 계정을 사용자 계정 데이터베이스에 추가합니다.

/DELETE      사용자 계정 데이터베이스에서 사용자 계정을 제거합니다.


옵션          다음과 같습니다.


   옵션                        설명

      --------------------------------------------------------------------

   /ACTIVE:{YES | NO}         계정을 활성화하거나 비활성화합니다.

                              계정이 활성화되어 있지 않으면 사용자가 서버에

                              액세스할 수 없습니다. 기본값은 YES입니다.

   /COMMENT:"text"            사용자 계정에 대한 설명을

                              입력합니다. 텍스트는 따옴표로

                              묶습니다.

   /COUNTRYCODE:nnn           운영 체제 국가 코드를 사용하여

                              사용자의 도움말 및 오류 메시지에 대해 지정된

                              언어 파일을 구현합니다. 0 값은

                              기본 국가 코드를 나타냅니다.

   /EXPIRES:{date | NEVER}    날짜가 설정되어 있는 경우 계정이 만료됩니다.

                              NEVER는 계정에 시간 제한을 설정하지

                              않습니다. 만료 날짜는 mm/dd/yy(yy)와 같은

                              형식으로 지정합니다. 월에는 숫자, 영어 단어

                              또는 세 자리 약자를 사용할 수 있습니다.

                              연도에는 두 자리 또는 네 자리 숫자를 사용할 수 있습니다.  

                              날짜는 공백 없이 슬래시(/)를 사용하여

                              구분합니다.

   /FULLNAME:"name"           사용자 이름이 아닌 사용자의 전체

                              이름입니다. 이름은 따옴표로

                              묶습니다.

   /HOMEDIR:경로 이름         사용자 홈 디렉터리의 경로를 설정합니다. 

                              이 옵션은 해당 경로가 있어야 사용할 수 있습니다.

   /PASSWORDCHG:{YES | NO}    사용자가 자신의 암호를 변경할 수 있는지 여부를

                              지정합니다. 기본값은 YES입니다.

   /PASSWORDREQ:{YES | NO}    사용자 계정에 암호를 지정해야 하는지 여부를

                              지정합니다. 기본값은 YES입니다.

   /LOGONPASSWORDCHG:{YES|NO} 다음에 로그온할 때 사용자가 암호를

                              변경해야 하는지 여부를 지정합니다. 기본값은 NO입니다.

   /PROFILEPATH[:path]        사용자의 로그온 프로필 경로를 설정합니다.

   /SCRIPTPATH:pathname       사용자의 로그온 스크립트

                              위치입니다.

   /TIMES:{times | ALL}       로그온 시간입니다. TIMES는 

                              요일[-day][,day[-day]],시간[-time][,time[-time]]과 같은 형식으로 나타내며 

                              1시간 단위로 증가하도록 제한됩니다.

                              요일에는 전체 단어나 약어를 사용할 수 있습니다.

                              시간에는 12시간 또는 24시간 표기법을 

                              사용할 수 있습니다.12시간 표기법에서는 am, pm, a.m. 또는

                              p.m.을 사용합니다. ALL은 사용자가 언제든지 로그온할 수 있음을 나타내며 

                              값을 입력하지 않으면 사용자가 로그온할 수 없음을 나타냅니다.

                              요일과 시간은 쉼표로 구분하여 입력하고

                              요일과 시간 항목이 여러 개인 경우에는 

                              세미콜론으로 구분합니다.

   /USERCOMMENT:"텍스트"      관리자가 계정에 대한 사용자 설명을 추가하거나 

                              변경할 수 있습니다. 

   /WORKSTATIONS:{computername[,...] | *}

                              사용자가 네트워크에 로그온할 수 있는 컴퓨터를

                              최대 8개까지 나열합니다. /WORKSTATIONS에 목록을

                              지정하지 않거나 별표(*)를 지정하면 사용자는 어느

                              컴퓨터에서나 네트워크에 로그온할 수 있습니다.


NET HELP 명령 | MORE는 한 번에 한 화면씩 도움말을 표시합니다.