DBAtlas · 데이터베이스 운영 아틀라스

열린 / 장시간 실행 트랜잭션 찾기

Oracle

SELECT s.sid, s.serial#, s.username,
       t.start_time, t.used_ublk AS undo_blocks
FROM v$transaction t
JOIN v$session s ON t.ses_addr = s.saddr
ORDER BY t.start_time;

used_ublk가 높으면 대형 트랜잭션이 undo를 많이 소비하고 있다는 뜻이며, commit/rollback을 기다리는 중일 수 있다.

PostgreSQL

SELECT pid, usename, state,
       now() - xact_start AS xact_age, query
FROM pg_stat_activity
WHERE xact_start IS NOT NULL
ORDER BY xact_start;

'idle in transaction' 상태의 장시간 트랜잭션은 VACUUM과 튜플 정리를 막으므로 모니터링한다.

MySQL

SELECT trx_id, trx_state, trx_started,
       TIMESTAMPDIFF(SECOND, trx_started, NOW()) AS age_sec,
       trx_mysql_thread_id
FROM information_schema.innodb_trx
ORDER BY trx_started;

trx_mysql_thread_id로 PROCESSLIST와 연관 짓고, 필요하면 KILL한다.

SQL Server

DBCC OPENTRAN;
-- Detailed:
SELECT st.session_id, dt.database_transaction_begin_time
FROM sys.dm_tran_database_transactions dt
JOIN sys.dm_tran_session_transactions st ON st.transaction_id = dt.transaction_id
WHERE dt.database_id = DB_ID()
ORDER BY dt.database_transaction_begin_time;

장시간 열린 트랜잭션은 로그 truncation을 막아 로그 파일을 비대하게 만든다.

MongoDB

db.adminCommand({
  currentOp: 1,
  "transaction": { $exists: true }
})

장시간 실행되는 다중 문서 트랜잭션은 transactionLifetimeLimitSeconds(기본값 60 s) 후 자동으로 중단된다.

Redis

# Not applicable: MULTI/EXEC transactions are short and atomic; they do not stay open.

Redis 트랜잭션은 락을 잡지 않는다. 장시간 실행되는 단일 명령은 SLOWLOG를 확인한다.

DBAtlas에서 열기 →