본 문서는 MSSQL City에 올라온 내용을 한글로 옮겨온 것임을 밝혀둡니다.
------------------------------------------------------------------------------------
Some Useful Undocumented SQL Server 7.0 and 2000 DBCC Commands
Alexander Chigrik
chigrik@mssqlcity.com
소개
이 문서에서는 문서화되지 않은 유용한 DBCC 명령에 대해서 다루고자 한다. 그리고 여기서 소개되는 DBCC 명령을 이용하여 SQL Server 7.0 과 2000에서 관리와 모니터링 작업을 할 수 있을 것이다.
DBCC는 Database Console Command의 줄임말로, 대개 데이터베이스의 물리적 논리적 무결성 검사를 하는데 쓰인다. 하지만 여기서 보게 되겠지만, 기타 다른 용도로도 쓰인다.
참고:
DBCC TRACEON (3604)
위 명령은 DBCC 명령의 결과값을 보다 효과적으로 확인을 위해 다른 DBCC 명령의 소개에 앞서 먼저 다루고자 한다. 아래에서 소개된 DBCC 명령이 실제로 DBCC TRACEON 명령을 필요로 하는 것은 아니지만 DBCC TRACEON 명령과 함께 실행하지 않으면 아무 결과도 보지 못 할 것이다. (주:기본 적으로 출력은 로그에 남기게 된다. 따라서 결과를 화면으로 출력하기 DBCC TRACEON (3604) 명령을 사용하란 얘기다. 추적 플래그에 관한 글은 여기를 참고하자)
1. DBCC BUFFER
버퍼 캐시로부터 버퍼의 헤더와 페이지 내용을 출력한다.
Syntax:
dbcc buffer ([dbid|dbname] [,objid|objname] [,nbufs], [printopt])
where dbid|dbname - 데이터베이스 아이디(id) 혹은 데이터베이스 이름 objid|objname - 개체의 아이디 혹은 이름 nbufs - 버퍼 넘버(number) printopt - 출력 옵션 0 - 버퍼 헤더와 페이지 헤더만 출력한다(기본값) 1 - 행별로 구분하여 출력. 2 - 행 구분없이 전체 내용 출력 -- 실행예제 DBCC TRACEON (3604) dbcc buffer(master,'sysobjects') -- 결과(일부 내용만 포함) BUFFERS (in MRU to LRU order): PAGE: (1:1354) -------------- BUFFER: ------- BUF @0x00D76940 --------------- bpage = 0x28CEA000 bhash = 0x00000000 bpageno = (1:1354) bdbid = 1 breferences = 8 bstat = 0x9 bspin = 0 bnext = 0x00000000 PAGE HEADER: ------------ Page @0x28CEA000 ---------------- m_pageId = (1:1354) m_headerVersion = 1 m_type = 2 m_typeFlagBits = 0x0 m_level = 1 m_flagBits = 0x2 m_objId = 1 m_indexId = 2 m_prevPage = (0:0) m_nextPage = (0:0) pminlen = 9 m_slotCnt = 17 m_freeCnt = 7086 m_freeData = 1072 m_reservedCnt = 0 m_lsn = (127:482:28) m_xactReserved = 0 m_xdesId = (0:9343) m_ghostRecCnt = 0 m_tornBits = 2 . .
2. DBCC BYTES
이 명령은 특정 메모리 어드레스 영역의 내용을 확인할 때 쓰인다. (SQL Server 개발팀에서나 유용하게 쓰일만한 명령인듯 싶습니다.)
Syntax:
dbcc bytes ( startaddress, length )
where startaddress - 시작 어드레스 length - 길이(byte) -- 실행 예제 DBCC TRACEON (3604) dbcc bytes (10000000, 100) -- 실행 결과 00989680: fab018e9 bc4d8dff aff0dbe9 e04d8dff ......M.......M. 00989690: aff120e9 c210b8ff c0e900a0 8dffaff0 . .............. 009896A0: 7ce9b04d 8dffffc4 74e9844d b8ffffc4 M..|....M..t.... 009896B0: 00a0c280 aff0a6e9 9c4d8dff ffc462e9 ..........M..b.. 009896C0: c2b0b8ff 94e900a0 8dffaff0 95e9d44d ............M... 009896D0: 8dffaff0 dae90c4d 8dffaff0 d2e9104d ....M.......M... 009896E0: b8ffaff0 ....
3. DBCC DBINFO
특정 데이터베이스의 DBINFO structure 정보를 표시.
Syntax:
DBCC DBINFO [( dbname )]
where dbname - 데이터베이스 이름. -- 실행 예제 DBCC TRACEON (3604) DBCC DBINFO (master) -- 실행 결과(일부만 표시) DBINFO STRUCTURE: ----------------- DBINFO @0x1FBDF1B4 ------------------ dbi_dbid = 1 dbi_status = 24 dbi_nextid = 17435136 dbi_dbname = master dbi_maxDbTimestamp = 1600 dbi_version = 539 dbi_createVersion = 539 dbi_ESVersion = 0 dbi_nextseqnum = 1900-01-01 00:00:00.000 dbi_crdate = 1900-01-01 00:00:00.000 dbi_filegeneration = 0
4. DBCC DBTABLE
이 명령은 특정 데이터베이스의 DBTABLE structure 정보를 출력한다.
Syntax:
DBCC DBTABLE ({dbid|dbname})
where dbid|dbname - 데이터베이스 이름 혹은 아이디(id) -- 실행 예제 DBCC TRACEON (3604) DBCC DBTABLE (master) -- 실행 결과(일부만 표시) DBTABLES: --------- DBTABLE @0x281A01C8 ------------------- dbt_dbid = 1 dbt_dbname = master dbt_spid = 0 dbt_cmptlevel = 80 dbt_crtime = 2003-10-20 10:05:11.980 dbt_dbdes = 0x37FA9000 dbt_protstamp = 57743 dbt_nextid = 17435136 dbt_dbname = master dbt_stat = 0x18 dbt_stat2 = 0x100000 dbt_relstat = 0x41000000 dbt_maxDbTimestamp = 1600 dbt_dbTimestamp = 1600 dbt_dbVersion = 539 dbt_repltrans = 568952 dbt_replcount = 0 dbt_replrate = 0.000000 dbt_repllatency = 0.000000 dbt_logmgr = 0x37F19380 dbt_BackupManager = 0x28254788 distbackuplsn = (0:0:0) distlastlsn = (0:0:0) replbeginlsn = (0:0:0) replnextlsn = (0:0:0) dbt_category = 0 dbt_dbccLogging = 0 dbt_dbccLoggingFailure = 0 dbccLoggingActive = 0 nonLoggedAllocActive = 0 WorkfileExtents = 0 FCB @0x37F19918
(주: 원 문서에 의하면 결과중에 dbt_open 라는 항목이 있다고 한다. 이 값은 데이터베이스에 몇 명의 유저가 접속해 있는지를 알려주는 카운터라고 설명하고 있는데, 이상하게 테스트 결과 보이지가 않는다. 본인이 사용하고 있는 버젼은 SQL Server 2000 SP3(a) 이다. 혹시 다른 버젼에서도 같은 결과인지 테스트 해 주시면 고맙겠습니다..^^)
5. DBCC DES
DES (descriptor) 정보를 출력한다.
Syntax:
dbcc des [( [dbid|dbname] [,objid|objname] )]
where dbid|dbname - 데이터베이스 아이디(id) 혹은 이름 objid|objname - 개체 아이디(id) 혹은 이름 -- 실행 예제 DBCC TRACEON (3604) DBCC DES -- 실행 결과(일부만 표시) DES: ---- DES @0x37FA9000 --------------- dhash = 0x37fa4780 dNavCnt = 0 dindex = 0x29146964 dmaxrow = 317 dopen = 0 dobjstat.objid = 1922105888 dobjstat.objsysstat = 0xe0000001 ddbid = 1 dstatus = 0x20 ddbptr = 0x281A01C8 ddbdes = 0x37FA7840 dminlen = 8 dobjid = 1922105888 dobjtype = 8277 dobjrepl = 0 dschema = 32 dobjcols = 4
6. DBCC HELP
DBCC HELP 명령은 특정 DBCC 명령의 구문 정보(syntax information)를 보여준다. SQL Server 6.5와 비교하면, 단지 문서화된(BOL에서 확인할 수 있는) DBCC 명령만 볼 수 있다.
Syntax:
DBCC HELP ('dbcc_statement' | @dbcc_statement_var | '?')
-- 실행 예제 DBCC TRACEON (3604) DECLARE @dbcc_stmt sysname SELECT @dbcc_stmt = 'CHECKTABLE' DBCC HELP (@dbcc_stmt) -- 실행 결과 CHECKTABLE ('table_name'[, {NOINDEX | index_id | REPAIR}]) [WITH NO_INFOMSGS[, ALL_ERRORMSGS][, PHYSICAL_ONLY][, ESTIMATEONLY][, TABLOCK]]
7. DBCC IND
특정 테이블의 인덱스에서 사용된 모든 페이지를 보여준다.
Syntax:
dbcc ind( dbid|dbname, objid|objname, printopt = {-2|-1|0|1|2|3} )
where dbid|dbname - 데이터베이스 아이디(ID) 혹은 이름 objid|objname - 개체 아이디(ID) 혹은 이름 printopt - 출력 옵션 - SQL Server 7.0에서 출력 옵션은 필수적으로 명시하도록 바꿨다. -- 실행 예제 DBCC TRACEON (3604) DBCC IND (master, sysobjects, 0) -- 실행 결과(일부 내용만 표시) PageFID PagePID IAMFID IAMPID ObjectID IndexID PageType IndexLevel NextPageFID... ------- ----------- ------ ----------- ----------- ------- -------- ---------- ----------- 1 11 NULL NULL 1 1 10 0 0 1 8 1 11 1 0 1 0 1 1 365 1 11 1 0 1 0 1 1 369 1 11 1 0 1 0 1 1 373 1 11 1 0 1 0 1 1 394 1 11 1 0 1 0 1 1 448 1 11 1 0 1 0 1 1 452 1 11 1 0 1 0 1 1 664 1 11 1 0 1 0 1
8. DBCC log
이 명령은 특정 데이터베이스의 트랜젝션 로그(transaction log) 볼 때 사용된다.
Syntax:
DBCC log ( {dbid|dbname}, [, type={-1|0|1|2|3|4}] )
PARAMETERS: dbid|dbname - 데이터베이스 아이디(ID) 혹은 이름 type - 출력옵션 0 - 최소 정보 (operation, context, transaction id) : 기본값 1 - 좀더 많은 정보 (plus flags, tags, row length, description) 2 - 매우 자세한 정보 (plus object name, index name, page id, slot id) 3 - 각 작업(operation)별 모든 정보 4 - 각 작업(operation)별 모든 정보와 함께 현재 트랜젝션 로그 행의 핵사 덤프(hexadecimal dump) 포함 -1 - 각 작업(operation)별 모든 정보와 함께 현재 트랜젝션 로그 행의 핵사 덤프(hexadecimal dump)와 함게 Checkpoint Begin, DB Version, Max XDESID
master 데이터베이스의 트랜젝션 로그를 보기위해서는 아래와 같이 실행하면 된다.
DBCC log (master)
(주:트랜젝션 로그 파일이 대단히 큰 경우 이 명령의 사용을 자제하기 바란다. 테스트 겸 출력옵션 3을 사용하여 작업을 하였는데, 한참후 도중 컴터가 뻗어버리는 불상사가 발생하였다..ㅠㅠ 역시 로그 확인은 Log Explorer가 짱인듯..)
9. DBCC PAGE
데이터 페이지의 구조를 확인할 때 사용한다.
Syntax:
DBCC PAGE ({dbid|dbname}, pagenum [,print option] [,cache] [,logical])
PARAMETERS: dbid|dbname - 데이터베이스 아이디(ID) 혹은 이름 Pagenum - 조회 하고자 하는 페이지의 번호 Print option - 출력옵션 0, 1, 2 중 하나.(선택사항) 0 - 페이지 헤더만을 출력(기본값) 1 - 헤더 + 행 단위 값 2 - 헤더 + 페이지 내용 그대로 Cache - 1 또는 0 의 값을 가질 수 있다(선택사항) 0 - 해당 페이지가 캐시에 있어도 무조건 디스크에서 내용을 참조하게 한다. 1 - 해당 페이지가 캐시에 있으면 캐시의 내용을 조회한다. 캐시에 없을 경우에는 디스크에서 직접 참조(기본값) Logical - 가상 페이지(virtual page)와 논리 페이지(logical page) 중 참고할 페이지를 선택(선택사항) 0 - 가상 페이지(virtual page) 1 - 논리 페이지(logical page) (기본값) -- 실행예제 DBCC TRACEON (3604) DBCC PAGE (master, 1, 1) -- 실행결과(일부만 표시) PAGE: (1:1) ----------- BUFFER: ------- BUF @0x00D61C40 --------------- bpage = 0x28282000 bhash = 0x00000000 bpageno = (1:1) bdbid = 1 breferences = 1 bstat = 0xb bspin = 0 bnext = 0x00000000 PAGE HEADER: ------------ Page @0x28282000 ---------------- m_pageId = (1:1) m_headerVersion = 1 m_type = 11 m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x0 m_objId = 99 m_indexId = 0 m_prevPage = (0:0) m_nextPage = (0:0) pminlen = 0 m_slotCnt = 1 m_freeCnt = 2 m_freeData = 8188 m_reservedCnt = 0 m_lsn = (143:184:4) m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0 m_tornBits = 2
10. DBCC procbuf
프로시저의 캐시로부터 저장 스로시저의 헤더를 보여준다.
Syntax:
DBCC procbuf( [dbid|dbname], [objid|objname], [nbufs], [printopt = {0|1}] )
where dbid|dbname - 데이터베이스 아이디(ID) 혹은 이름 objid|objname - 개체 아이디(ID) 혹은 이름 nbufs - 출력하고자 하는 버퍼 번호 printopt - 출력옵션 0 - 프로시저 버퍼와 헤더만 출력 (기본값) 1 - 프로시저 버퍼, 헤더, 버퍼의 내용(contents) 출력 -- 실행예제 DBCC TRACEON (3604) DBCC procbuf(master,'sp_help',1,0)
11. DBCC prtipage
특정 인덱스의 각 행의 페이지 번호를 출력한다.
Syntax:
DBCC prtipage( dbid, objid, indexid, indexpage )
where dbid - 데이터베이스 아이디(ID) objid - 개체 ID indexid - 인덱스 ID indexpage - 출력할 인덱스의 논리 페이지 번호 -- 실행예제 DBCC TRACEON (3604) DECLARE @dbid int, @objectid int SELECT @dbid = DB_ID('master') SELECT @objectid = object_id('sysobjects') DBCC prtipage(@dbid,@objectid,1,0) -- 실행결과(일부만표시) FileId PageId Row Level ChildFileId ChildPageId id ------ ----------- ------ ------ ----------- ----------- ----------- 1 12 0 0 1 8 NULL 1 12 1 0 1 668 27147142 1 12 2 0 1 1095 103671417 1 12 3 0 1 365 181575685 1 12 4 0 1 1092 269244014 1 12 5 0 1 665 363148339 1 12 6 0 1 1088 466100701 1 12 7 0 1 448 565577053 1 12 8 0 1 1093 647673355 1 12 9 0 1 666 734625660 1 12 10 0 1 669 839674039 1 12 11 0 1 394 949578421
12. DBCC pss
이 명령은 현재 서버에 연결된 프로세스 정보를 보여준다.
Syntax:
DBCC pss( suid, spid, printopt = { 1 | 0 } )
where suid - 사용자 ID spid - 프로세스 ID printopt - 출력옵션 0 - 표준 출력, 1 - all open DES's and current sequence tree)
13. DBCC resource
이 명령은 서버 레벨의 RESOURCE, PERFMON, DS_CONFIG에 대한 정보를 보여준다. RESOURCE는 서버에 의해 사용된 다양한 자료 구조의 주소를 보여준다. PERFMON은 master..spt_monitor 테이블을 이루는 정보를 포함하고 있다. DS_CONFIG는 master..syscurconfigs 테이블을 이루는 정보를 포함하고 있다.
Syntax:
DBCC resource
-- 실행 예제 DBCC TRACEON (3604) DBCC resource -- 실행 결과 RESOURCE: --------- RESOURCE @0x00A12000 -------------------- rdes = 939027392 *rdeshash = 0 rdescount = 2048 *prpssarray = 673284248 rprocihash = 0x37F117F0 rprocnhash = 0x37F157F0 rprocmemused = 116 rflag1 = 16 rflag2 = 0 rprocnum = 64 rMSversion = 134218488 rpsytab = 938590520 m_pLangCache = 938591208 rservername = DEVSVR servicename = MSSQLSERVER servinstname = DEVSVR ropen_objmsgs = 0 pPerfStats = 11004808 pResLock = 938520472 LoginMode = 2 rsaspid = 0 DefaultLogin = guest AuditLevel = 0 DefaultDomain = DEVSVR MapChars[0] '_' = MapChars[1] '$' = MapChars[2] '#' = MaxConnections = 32767 MaxCPUs = 32 article_cache = 672932768 pResLockFree = 938596396 MaxSubProcesses = 255 CurSubProcesses = 0 replmem = 0x281C0030 PERFMON @0x00A12038 ------------------- pcputicks = 0 pioticks = 0 pidlticks = 0 pbs_rpck = 102 pbs_rbyt = 0 pbs_conn = 27 pbs_errors = 0 pblk_rd = 805 pblk_wr = 191 pblk_errors = 0 DS_CONFIG @0x00A14060 --------------------- cconfsz = 8 cmajor = 8 cminor = 0 crevision = 10 cbootsource = 2 crecinterval = 0 ccatalogupdates = 0 cmbSrvMemMin = 0 cmbSrvMemMax = 2147483647 cusrconnections = 0 cnetworkpcksize = 4096 ckbIndexMem = 0 cfillfactor = 0 ctapreten = 0 cwritestatus = 0 cfgpriorityboost = 0x0 cfgexposeadvparm = 0x0 cfglogintime = 20 cfgpss = 0 cfgpad = 4096 cfgxdes = 16 cfgaffinitymask = 0 cfgbuf = 4362 cfgdes = 0 cfglocks = 0 cfgquerytime = 600 cfgcursorthrsh = -1 cfgrmttimeout = 10 cfg_dtc_rpcs = 0 cclkrate = 31250 cfg_max_text_repl_size = 65536 cfgupddate = 37895 cfgupdtime = 23699388 fRemoteAccess = 1 cfgbufminfree = 331 cnestedtriggers = 0x1 cfgworkingset = 0x0 cdeflang = 29 cidCfg = 0xd011 cidCfgOld = 0xd011 cfgCutoffYear = 2049 cfgLangNeutralFT = 1042 maxworkthreads = 255 minworkthreads = 32 minnetworkthreads = 32 threadtimeout = 15 connectsperthread = 0 cusroptions = 0 exchcostthreshold = 5 maxdop = 0 cchecksum = 475 rWrkExtCache = Empty
14. DBCC TAB
데이터 페이지의 구조를 확인할 때 사용한다. (DBCC PAGE 명령과 비교하여 이 명령은 특정 페이지 번호를 지정하는 것이 아니라 모든 데이터 페이지를 보여준다.)
Syntax:
DBCC tab (dbid, objid)
where dbid - 데이터베이스 ID objid - 테이블 ID -- 실행예제 DBCC TRACEON (3604) DECLARE @dbid int, @objectid int SELECT @dbid = DB_ID('master') SELECT @objectid = object_id('sysdatabases') DBCC TAB (@dbid,@objectid) -- 실행 결과(일부만표시) PageFID PagePID IAMFID IAMPID ObjectID IndexID PageType IndexLevel NextPageFID ... ------- ----------- ------ ----------- ----------- ------- -------- ---------- ----------- 1 1334 NULL NULL 30 1 10 0 0 1 1333 1 1334 30 0 1 0 0 1 1335 1 1334 30 1 2 0 0 1 1345 NULL NULL 30 2 10 0 0 1 1344 1 1345 30 2 2 0 0