728x90

SQL Server 트랜잭션 로그 읽기 

 

-       Version : SQL Server 2005, 2008, 2008R2, 2012 

 

데이터베이스에서 발생하는 행위는 트랜잭션 로그 라는 곳에 기록된다. 문서화되지 않은 기능 fn_dblog 함수를 사용하여 트랜잭션 로그의 정보를 읽어보자. 

 

Fn_dblog는 트랜잭션의 시작 LSN과 종료 LSN을 필요로 한다. NULL은 기본값으로 트랜잭션 로그 파일의 모든 로그 레코드를 반환한다. 

 

실습을 위해 데이터베이스를 생성한다. 

--Create DB. 

USE [master]; 

GO 

CREATE DATABASE ReadingDBLog; 

GO 

-- Create tables. 

USE ReadingDBLog; 

GO 

CREATE TABLE [Location] ( 

    [Sr.No] INT IDENTITY, 

    [Date] DATETIME DEFAULT GETDATE (), 

    [City] CHAR (25) DEFAULT 'Seoul'); 

 

다음 스크립트를 실행하여 데이터베이스 및 테이블을 작성하는데 걸린 어떤 과정과 단계를 확인할 수 있다. 

USE ReadingDBLog; 

GO 

select COUNT(*) from fn_dblog(null,null) 

 

 

 

데이터베이스 생성과 테이블을 생성하는데 총 176행의 정보가 생성된 것을 확인 할 수 있다. 다음 스크립트를 통해 데이터베이스 생성, 테이블 생성에 기록된 트랜잭션 로그 파일 데이터를 확인하여 보자. 

USE ReadingDBLog; 

GO 

select [Current LSN], 

       [Operation], 

       [Transaction Name], 

       [Transaction ID], 

       [Transaction SID], 

       [SPID], 

       [Begin Time] 

FROM   fn_dblog(null,null) 

 

 

 

LOP_BEGIN_XACT는 트랜잭션의 시작을 의미한다. 작업 열은 우리가 삽입, 업데이트, 삭제, 축소, 잠금, 페이지 할당 등과 같이 수행되는 작업을 알려준다.  

 

데이터의 삽입, 업데이트, 삭제 등의 DML 스크립트를 사용하여 트랜잭션 로그 파일에 기록하는 방법을 확인하여 보자. 이 작업을 수행하는 동안 페이지가 할당 또는 해제되는 방법을 추적할 수 있다. 

USE ReadingDBLog 

go 

INSERT INTO Location DEFAULT VALUES ; 

GO 100 

GO 

UPDATE Location 

SET City='New Delhi' 

WHERE [Sr.No]<5 

GO 

DELETE Location  

WHERE [Sr.No]>90 

Go 

 

데이터 입력 수정, 삭제가 완료되었으면 트랜잭션 로그 파일을 확인해 보자.  

USE ReadingDBLog 

go 

SELECT 

 [Current LSN], 

 [Transaction ID], 

 [Operation], 

  [Transaction Name], 

 [CONTEXT], 

 [AllocUnitName], 

 [Page ID], 

 [Slot ID], 

 [Begin Time], 

 [End Time], 

 [Number of Locks], 

 [Lock Information] 

FROM sys.fn_dblog(NULL,NULL) 

WHERE Operation IN  

   ('LOP_INSERT_ROWS','LOP_MODIFY_ROW', 

    'LOP_DELETE_ROWS','LOP_BEGIN_XACT','LOP_COMMIT_XACT')   

 

 

 

트랜잭션을 시작하고 힙테이블 dbo.location 에 데이터를 입력하고 트랜잭션을 완료하는 것을 확인 할 수 있다. UPDATE문과 DELETE 구문도 확인 할 수 있다. 

 

트랜잭션 로그에서 SQL Server의 페이지 분할이나 페이지 분할 횟수 등 내부 동작도 확인할 수 있다. 

 

다음 스크립트를 실행하여 스플릿 정보를 확인한다. 

USE ReadingDBLog 

go 

--Get how many times page split occurs. 

SELECT  

 [Current LSN], 

 [Transaction ID], 

 [Operation], 

  [Transaction Name], 

 [CONTEXT], 

 [AllocUnitName], 

 [Page ID], 

 [Slot ID], 

 [Begin Time], 

 [End Time], 

 [Number of Locks], 

 [Lock Information] 

FROM sys.fn_dblog(NULL,NULL) 

WHERE [Transaction Name]='SplitPage'  

GO 

 

 

 

위에서 확인된 스플릿의 트랜잭션ID를 사용하여 추적할 수 있다. 

--Get what all steps SQL Server performs during a single Page Split occurrence. 

SELECT  

 [Current LSN], 

 [Transaction ID], 

 [Operation], 

  [Transaction Name], 

 [CONTEXT], 

 [AllocUnitName], 

 [Page ID], 

 [Slot ID], 

 [Begin Time], 

 [End Time], 

 [Number of Locks], 

 [Lock Information] 

FROM sys.fn_dblog(NULL,NULL) 

WHERE [Transaction ID]='0000:000002dd'   

 

 

 

 

트랜잭션 로그는 백업의 상호 관계에서는 백업을 진행 할 경우 트랜잭션 로그가 잘리게되어 로그 파일을 축소 할 수 있다. 

다음 스크립트를 통하여 백업 후 트랜잭션 로그의 행 숫자가 줄어든 것을 확인 할 수 있다. 

SELECT COUNT(*) 

FROM fn_dblog(null,null) 

GO 

 

BACKUP DATABASE ReadingDBLog TO DISK = 'c:\SQL_DATA\ReadingDBLog_Full.bak' 

GO 

 

SELECT COUNT(*) 

FROM fn_dblog(null,null) 

GO 

 

 

 

 

[참고자료] 

http://www.mssqltips.com/sqlservertip/3076/how-to-read-the-sql-server-database-transaction-log/ 

 

728x90
728x90

https://technet.microsoft.com/ko-kr/library/bb838723(office.12).aspx

728x90
728x90

DECLARE @spName NVARCHAR(MAX)
 
SET @spName = 'sp_syspolicy_purge_history' -- 해당 프로그시명을 입력
 
SELECT
 
             S.name AS JobName,
    A.name AS SP_Name ,
              CONVERT(NVARCHAR(10), B.step_id) + ' 단계' AS Step

FROM msdb.dbo.sysjobs A
INNER JOIN msdb.dbo.sysjobsteps B
ON A.job_id = B.job_id  and command like '%' + @spName + '%'
INNER JOIN [msdb].[dbo].[sysjobs] S
ON A.job_id = S.job_id

728x90

'IT이야기 > MS-SQL' 카테고리의 다른 글

SQL Server 트랜잭션 로그 읽기  (0) 2016.06.29
SQL Server 상태 모니터링  (0) 2015.09.02
Instant SQL Formatter  (0) 2015.09.02
MS-SQL 원격 테이블 조회 간단 정리  (0) 2015.09.02
SPGen-Stored Procedure code Generation tool  (0) 2015.09.02
728x90

SQL Query를 보기 좋게 자동으로 표기 해주네요.

유용할 듯... 저처럼 무개념 쿼리는 굿~~~

http://www.dpriver.com/pp/sqlformat.htm

728x90
728x90

SELECT * FROM

OPENROWSET

(

'SQLOLEDB' ,

'IP , PORT ' ; 'ID' ; 'PW' ,

'SELECT * FROM 원격DB명.소유자.테이블명'

)

 

728x90
728x90

http://lattice-spgen-stored-procedure-generator.en.softonic.com/download?ex=SWH-1608.7

728x90
728x90
select replace(convert(varchar,convert(money, 1000000 ),1),'.00',space(0) ) as total

 

 

728x90
728x90

sp_columns @table_name='테이블명'

728x90
728x90

특정 테이블 필드에서 공통된 문자열을 기준으로 오른쪽 값만 표시 할 일이 생겨.

삽질 끝에 완성했다.

 

실제데이터

Name

============================

urn:upc:tmkim@domain.com

urn:confs:testh005@domain.com

urn:confs:testkp002@domain.com
urn:hcd:testkp002@domain.com
urn:confs:testkp007@domain.com

urn:hcd:testkp007@domain.com

 

자 시작해보자

 

 

실행 쿼리

select Right(D.Name,LEN(D.Name)-CHARINDEX(':t',D.Name)) As PName from Document

 

결과 값

Name

============================

tmkim@domain.com
testh005@domain.com
testkp002@domain.com
testkp002@domain.com
testkp007@domain.com
testkp007@domain.com

 

해설

Name 값의 "총 문장길이값"를 ":t"까지의 길이 뺀 후 숫자만큼 뒤에서 부터 출력하여 빼도록 하였다.

왜냐면 메일주소의 길이가 가변적이때문에 공통된 :t까지를 기준으로 잡았다.

 

끝.

728x90
728x90

MSSQL 현재 데이터베이스에 접속중인 세션정보 / 아이피 확인방법

 

   SELECT P.spidP.login_timeP.last_batchP.statusP.program_nameP.cmdC.client_net_address

   FROM sys.sysprocesses AS INNER JOIN sys.dm_exec_connections AS C

   ON P.spid C.session_id

 

 - sys.sysprocesses

 

​   SQL Server 인스턴스에서 실행 중인 프로세스에 대한 정보를 표시하는 뷰입니다.

 

 - sys.sysprocesses에서 참조한 컬럼 안내

컬럼

속성

 spid

 SQL Server 세션 아이디

 loginame

 로그인 이름

 login_time

 클라이언트 프로세스가 서버에 로그인한 시간

 last_batch

 클라이언트 프로세스가 원격 저장 프로시저 호출 또는 EXECUTE 문을 마지막으로 실행한 시간

 status

 프로세스 아이디 상태

  

   - status가 갖을 수 있는 값

  dormant = SQL Server에서 세션을 다시 설정하는 상태

  running = 세션에서 일괄 처리를 하나 이상 실행하는 상태

  background = 세션에서 백그라운드 태스크를 실행하는 상태

  rollback = 세션에서 트랜잭션 롤백을 진행하는 상태

  pending = 세션이 작업자 스레드를 사용할 수 있을 때까지 기다리는 상태

  runnable = 세션이 실행중인 상태

  sleeping = 세션이 작업을 기다리고 있는 상태

  spinloop = 세션이 스핀락에 걸려 있는 상태

  suspended = 세션이 이벤트가 발생할 때까지 대기하고 있는 상태

 program_name

 응용 프로그램의 이름

 cmd

 현재 실행 중인 명령

 

 - sys.dm_exec_connections

 

​   SQL Server 인스턴스에 대해 설정된 연결에 대한 정보와 각 연결에 대한 세부 정보를 표시하는 뷰입니다.


 - sys.dm_exec_connections 에서 참조한 컬럼 안내

컬럼

속성

 session_id

 SQL Server 세션 아이디

 client_net_address 

 서버에 연결된 클라이언트의 호스트 주소 (아이피)

 

[참고사항] 접속중인 세션정보를 확인하기 위해 sys.sysprocesses와 sys.dm_exec_connections를 조인하는 이유

 

​   sys.sysprocesses는 SQL Server 인스턴스에서 실행 중인 프로세스에 대한 정보를 표시하기 때문에 현재 접속중인 세션정보를

   확인하기 위해 반듯이 필요하나 클라이언트 프로세스와 시스템 프로세스 모두를 포함하고 있습니다.

   때문에 클라이언트 프로세스만을 갖고 있는 sys.dm_exec_connections를 조인하여 클라이언트 프로세스의 접속정보를 표시할 수

   있도록 만들어주어야 합니다.

 

 - 예제

 

   현재 접속중인 세션아이디, 로그인시간, 마지막 실행시간, 아이피를 표시하시오.

 

 

 - 예제 쿼리 실행

 

   SELECT P.spidP.login_timeP.last_batchC.client_net_address

   FROM sys.sysprocesses AS INNER JOIN sys.dm_exec_connections AS C

   ON P.spid C.session_id

 

 

spid

login_time

last_batch

client_net_address

 51

 2014-10-14 20:54:36.297

 2014-10-14 20:59:32.827

 <local machine>

 52

 2014-10-14 21:39:32.043

 2014-10-14 21:55:35.810

 <local machine>

 53

 2014-10-14 21:48:30.920

 2014-10-14 21:49:08.467

 192.168.1.2

728x90

+ Recent posts