'dbcc inputbuffer'에 해당되는 글 2

  1. 2010.07.09 JDBC 드라이버에서 날리는 쿼리 확인 - SQL Server
  2. 2010.07.04 데이터베이스 문제점 파악 방법

JDBC 드라이버에서 날리는 쿼리 확인 - SQL Server

JDBC 프로그램에서 쿼리를 날렸을 때 DBCC INPUTBUFFER spid 의 결과

- Profiler를 이용하면 쿼리와 매개변수까지 확인 가능함.

- sqljdbc.jar - 569KB (583,286 바이트) 사용, SQL Server 2005

DriverManager.getConnection()
Language Event    0     set transaction isolation level  read committed  set implicit_transactions off

Connection#setAutoCommit(false)
Language Event    0    set implicit_transactions on

Statement#executeQuery()
Language Event    0    SELECT top 2 * FROM TB_SAMPLE

PreparedStatement#executeQuery()
Language Event    0     set transaction isolation level  read committed  set implicit_transactions off //실행시킨 쿼리문을 확인할 수 없음, getConnection() 호출시 남아 있던 문장

CallableStatement#executeQuery()
//상동

SYSPROCESSES에서 program_name을 확인할 수 없음.

- jtds-1.2.2 사용, SQL Server 2005
DriverManager.getConnection()
Language Event    0    SELECT @@MAX_PRECISION  SET TRANSACTION ISOLATION LEVEL READ COMMITTED  SET IMPLICIT_TRANSACTIONS OFF  SET QUOTED_IDENTIFIER ON  SET TEXTSIZE 2147483647

Connection#setAutoCommit(false)
Language Event    0    SET IMPLICIT_TRANSACTIONS ON

Statement#executeQuery()
Language Event    0    SELECT top 2 * FROM TB_SAMPLE

PreparedStatement#executeQuery()
Language Event    0    (@P0 nvarchar(4000))SELECT top 2 * FROM TB_SAMPLE WHERE key =  @P0

CallableStatement#executeQuery()
RPC Event    0    DB123.dbo.pr_test;1

SYSPROCESSES에서 program_name이 jTDS로 확인됨.

- 연결된 서버를 통한 4파트 쿼리나 Openquery도 위와 동일함.
모두 Language Event 이다.

- auto commit이 false면 opentran 1, 그러나 락은 안보임

- sqljdbc.jar - 569KB (583,286 바이트) 사용, SQL Server 2000
커넥션 붙는 부분 위와 동일

CallableStatement, PreparedStatement#executeQuery()
RPC Event    0    sp_prepexec;1

- jtds-1.2.2 사용, SQL Server 2000
CallableStatement#executeQuery()
RPC Event    0    PR_test;1

PreparedStatement#executeQuery()
RPC Event    0    sp_execute;1

- 2005에서 실행된 쿼리를 볼 때 이 쿼리를 이용한다.

- 연결된 서버
처음 접속한 서버(2005)는 일반적인 커넥션과 동일하고, 연결된 원격의 서버(2000)에서 확인해보면 다음과 같은 특징을 가진다.

sp_who
spid ecid status      loginame    hostname        blk  dbname
58    0     dormant    test_user    DBS2005          0     NULL

sysprocesses에서 hostname이 DBS2005 이고 program_name이 Microsoft SQL Server 이다.

dbcc inputbuffer (58)
RPC Event    0    sp_reset_connection;1

데이터베이스 문제점 파악 방법

어떤 계정으로
어느 시스템에서
어느 데이터베이스를 사용했을때
어떤 프로그램을 통해서
어떤 쿼리를 실행시켰을때
상황이 어떠하며
에러가 발생했는지를 확인하는 것이 중요하다.

SQL Server는 Profiler를 이용하는 것이 가장 좋다.

사례1) SQL Server 에서 락이 발생
app_user 로 로그인해서 : sp_who
dev_server 에서 쿼리를 실행함. : sp_who
ERP 데이터베이스를 사용 : sp_who
알 수 없는 쿼리 : dbcc inputbuffer(spid), 쿼리 확인
X Lock 을 걸고, 다른 프로세스에서 SELECT 를 하는데 락이 걸림 : sp_lock

[todo] 오라클에서는?