728x90

활발이님 | 기타 | 2013-11-11 18:02:07


archive mod에서 test를 하다가 궁금한점에 대해 질문 드립니다.

db 환경은 아래와 같습니다.

 Log file size (4KB)                         (LOGFILSIZ) = 25
 Number of primary log files                (LOGPRIMARY) = 13
 Number of secondary log files               (LOGSECOND) = 4
 Changed path to log files                  (NEWLOGPATH) = 
 Path to log files                                       = /home/db2inst1/db2inst1/NODE0000/SQL00001/SQLOGDIR/
 First active log file                                   = S0000022.LOG

 Group commit count                          (MINCOMMIT) = 1
 Percent log file reclaimed before soft chckpt (SOFTMAX) = 520
 Log retain for recovery enabled             (LOGRETAIN) = RECOVERY
 User exit for logging enabled                (USEREXIT) = OFF

 First log archive method                 (LOGARCHMETH1) = DISK:/archive/
 Options for logarchmeth1                  (LOGARCHOPT1) = 
 Second log archive method                (LOGARCHMETH2) = OFF
 Options for logarchmeth2                  (LOGARCHOPT2) =

---------------------------------------------------------------------------------------------------------------------------------
data를 4번에 걸쳐 insert를 합니다.

처음 db 상태 
Tablespace                Space      Total       # of       High     
 Name                      Used       Size     Extents  WaterMark    
TESTTBS                  640.0K       1.0G      8,192     640.0K     640.0K   0%   0% Normal

File number of first active log            = 0
File number of last active log             = 12
File number of current active log          = 2

-active log (/home/db2inst1/db2inst1/NODE0000/SQL00001/SQLOGDIR/)
S0000000.LOG  S0000002.LOG  S0000004.LOG  S0000006.LOG  S0000008.LOG  S0000010.LOG  S0000012.LOG
S0000001.LOG  S0000003.LOG  S0000005.LOG  S0000007.LOG  S0000009.LOG  S0000011.LOG

-archive log (/archive/)
S0000000.LOG  S0000001.LOG

1번째 insert

Tablespace                Space      Total       # of       High     
 Name                      Used       Size     Extents  WaterMark 
TESTTBS                  896.0K       1.0G      8,192     896.0K     896.0K   0%   0% Normal     

File number of first active log            = 3
File number of last active log             = 15
File number of current active log          = 8

-active log (/home/db2inst1/db2inst1/NODE0000/SQL00001/SQLOGDIR/)
S0000003.LOG  S0000005.LOG  S0000007.LOG  S0000009.LOG  S0000011.LOG  S0000013.LOG  S0000015.LOG
S0000004.LOG  S0000006.LOG  S0000008.LOG  S0000010.LOG  S0000012.LOG  S0000014.LOG

-archive log (/archive/)
S0000000.LOG  S0000001.LOG  S0000002.LOG  S0000003.LOG  S0000004.LOG  S0000005.LOG  S0000006.LOG  S0000007.LOG


2번째 insert

Tablespace                Space      Total       # of       High     
 Name                      Used       Size     Extents  WaterMark 
TESTTBS                    1.1M       1.0G      8,192       1.1M       1.1M   0%   0% Normal

File number of first active log            = 9
File number of last active log             = 21
File number of current active log          = 14

-active log (/home/db2inst1/db2inst1/NODE0000/SQL00001/SQLOGDIR/)
S0000009.LOG  S0000011.LOG  S0000013.LOG  S0000015.LOG  S0000017.LOG  S0000019.LOG  S0000021.LOG
S0000010.LOG  S0000012.LOG  S0000014.LOG  S0000016.LOG  S0000018.LOG  S0000020.LOG

-archive log (/archive/)
S0000000.LOG  S0000002.LOG  S0000004.LOG  S0000006.LOG  S0000008.LOG  S0000010.LOG  S0000012.LOG
S0000001.LOG  S0000003.LOG  S0000005.LOG  S0000007.LOG  S0000009.LOG  S0000011.LOG  S0000013.LOG


3번째 insert

Tablespace                Space      Total       # of       High     
 Name                      Used       Size     Extents  WaterMark 
TESTTBS                    1.3M       1.0G      8,192       1.3M       1.3M   0%   0% Normal

File number of first active log            = 15
File number of last active log             = 27
File number of current active log          = 21

-active log (/home/db2inst1/db2inst1/NODE0000/SQL00001/SQLOGDIR/)
S0000015.LOG  S0000017.LOG  S0000019.LOG  S0000021.LOG  S0000023.LOG  S0000025.LOG  S0000027.LOG
S0000016.LOG  S0000018.LOG  S0000020.LOG  S0000022.LOG  S0000024.LOG  S0000026.LOG

-archive log (/archive/)
S0000000.LOG  S0000003.LOG  S0000006.LOG  S0000009.LOG  S0000012.LOG  S0000015.LOG  S0000018.LOG
S0000001.LOG  S0000004.LOG  S0000007.LOG  S0000010.LOG  S0000013.LOG  S0000016.LOG  S0000019.LOG
S0000002.LOG  S0000005.LOG  S0000008.LOG  S0000011.LOG  S0000014.LOG  S0000017.LOG  S0000020.LOG


4번째 insert

Tablespace                Space      Total       # of       High     
 Name                      Used       Size     Extents  WaterMark 
TESTTBS                    1.6M       1.0G      8,192       1.6M       1.6M   0%   0% Normal

File number of first active log            = 22
File number of last active log             = 34
File number of current active log          = 27

-active log (/home/db2inst1/db2inst1/NODE0000/SQL00001/SQLOGDIR/)
S0000022.LOG  S0000024.LOG  S0000026.LOG  S0000028.LOG  S0000030.LOG  S0000032.LOG  S0000034.LOG
S0000023.LOG  S0000025.LOG  S0000027.LOG  S0000029.LOG  S0000031.LOG  S0000033.LOG

-archive log (/archive/)
S0000000.LOG  S0000003.LOG  S0000006.LOG  S0000009.LOG  S0000012.LOG  S0000015.LOG  S0000018.LOG  S0000021.LOG  S0000024.LOG
S0000001.LOG  S0000004.LOG  S0000007.LOG  S0000010.LOG  S0000013.LOG  S0000016.LOG  S0000019.LOG  S0000022.LOG  S0000025.LOG
S0000002.LOG  S0000005.LOG  S0000008.LOG  S0000011.LOG  S0000014.LOG  S0000017.LOG  S0000020.LOG  S0000023.LOG  S0000026.LOG


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

testtbs에 축척되는 size를 보면 한 insert 트랜잭션당 256k정도의 data가 들어가고요
primarylog 는 13개고 한개당 100k로 지정해 놓았습니다. (archivelog 를 생성하기 위해 작게 잡았습니다)
싱글 디비 한개 생성하고 한 트랜잭션 insert 하고 commit 후 test진행하였습니다.
(다른 insert나 붙는 application은 없습니다)

여기서 궁금한 것은

1. 1번째 insert 부분을 보면 data가 insert되어 현재 activelog를 8번을 사용하고 있고 
    그래서 아카이빙도 7번까지 되었습니다. 여기서 아카이빙 되면 (/home/db2inst1/db2inst1/NODE0000/SQL00001/SQLOGDIR/)
    경로에 있는 로그 3~7번은 지워지고 16~20번의 log가 생성되어야 되는것 아닌가요?
    (제가 생각한것이 2번째 insert때 일어납니다...)
    이러한 archiving 시점 및 activelog를의 삭제 시점을 알고 싶습니다.




pajama 2013-11-12 00:48:43
트랜잭션이 커밋되면서 로그파일에는 변경사항이 기록되었지만 디스크에는 아직 기록이 되지않아 crash recovery를 위해 로그파일이 삭제되지 않습니다.
http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.admin.ha.doc/doc/c0008178.html

처음 INSERT 오퍼레이션때는 0~7번까지 로그파일이 아카이브가 되었고, active log 위치의 같은 이름 로그파일은 삭제되지 않고 남았습니다. 그후에 다시 INSERT를 수행하면 서버중단(fail)에 의한 응급복구시간 단축을 위해 페이지클리너가 버퍼풀의 더티페이지를 디스크로 기록하게 됩니다. 이렇게 되면서 active log 위치의 아카이브 로그 파일은 삭제됩니다.
http://www.dbforums.com/db2/1675759-archive-logs-vs-current-logs-db2-v9-luw.html
http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.admin.ha.doc/doc/c0005962.html

어쨌든 몇분 인터벌로 로그파일이 아키이빙된 후 삭제되거나 하는 방식은 아닙니다. crash recovery용도로나 open transaction이 남아있을 때 삭제되지 않는다고 하면 말씀하신 상황에선 crash recovery용도로 남아있지 않나 생각합니다.

활발이 2013-11-12 17:12:44
답변 감사드립니다. db2에선 commit시점이 아니라 그냥 data가 insert되어 active로그가 꽉차도 archiving되는 걸로 확인되는데
archiving시점이 active로그 파일이 꽉차거나 로그 switching 일때 되는건가요? 
그리고 commit 시점이 아니란 말은 memory buffer에서 데이터가 변경(disk에 저장되는 data가아닌) 될때 마다의 변동사항을 다 archiving 시킨다는 말인가요?

pajama 2013-11-12 17:36:02
말씀하신대로 로그파일이 꽉차면 로그 아카이브를 시도합니다.
http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.admin.ha.doc/doc/c0006086.html

pajama 2013-11-12 17:48:48
commit을 수행하면 로그버퍼에 있는 내용을 로그파일에 씁니다. 커밋을 하지않고 대량으로 insert를 했다고 해도 변경사항이 로그버퍼보다 크기때문에 곧바로 변경사항이 로그버퍼에서 로그파일에 기록이 됩니다.

1. 가당 단순하게 생각하면 로그파일이 다 차면 로그 아카이브가 발생합니다.
2. 데이터를 대량인서트 한다면 일반적으로 로그버퍼에 변경사항을 다 기록할수 없기 때문에 로그버퍼에 기록된 내용이 곧바로 로그파일에 기록되고 로그파일이 꽉 차면서 로그 아카이브가 발생합니다.
3. 로그파일이 삭제(이름변경)되는 시점은 해당 로그파일에 오픈 트랜잭션이 없거나, 응급복구용으로 필요하지 않은 시점을 로그매니저(db2logmgr) 스레드에서 판단합니다.



728x90

+ Recent posts