FireBird Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
파이어버드 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
IBPhoenix
FireBird Main site
볼랜드포럼 광고 모집

FireBird Q&A
[1095] Forced Writes... 감사!
박지훈.임프 [cbuilder] 2478 읽음    2004-06-09 09:11
몇년 전에 인터베이스 pdf 문서들을 보면서 Forced Writes에 대한 내용을 본 기억이 나긴 하는데,
그 설정이 서버의 전원이 나갔을 때 파일이 깨지는 데에 결정적으로 관계가 있을 거라는 생각을 못했군요.
(난 왜 이리 미련할까...)

이창석님의 글을 보고 다시 문서를 살펴봤는데요.
인터베이스 6.0 오퍼레이션 가이드에 있는 내용입니다.

Forced writes vs. buffered writes

When an InterBase Server performs forced writes (also referred to as synchronous writes),
it physically writes data to disk whenever the database performs an (internal) write operation.

인터베이스 서버가 Forced writes로 되어있으면 데이터베이스가 (내부적으로) 쓰기 동작을 할 때마다
물리적으로 디스크에 기록한다.

If forced writes are not enabled, then even though InterBase performs a write, the data may not be
physically written to disk, since operating systems buffer disk writes. If there is a system
failure before the data is written to disk, then information can be lost.

Forced writes가 활성화되어있지 않으면, 인터베이스에서 쓰기 동작이 일어나더라도 OS가 디스크 쓰기를
버퍼링하므로 물리적으로 디스크에 기록하지 않을 수 있다. 만약 데이터가 디스크에 기록되기 전에 시스템
오류가 발생하면 정보가 유실될 수 있다.

Performing forced writes ensures data integrity and safety, but slow performance. In particular,
operations that involve data modification are slower. Forced writes are enabled or disabled in
the Database Properties dialog.

Forced writes로 설정하면 데이터 무결성과 안전성을 보장할 수 있지만 성능은 낮아진다. 특히 데이터 수정이
필요한 작업은 더욱 느려진다. Forced writes 설정은 데이터베이스 프로퍼티 다이얼로그에서 활성화시키거나
비활성화시킬 수 있다.

매뉴얼에 있는 이 문구 자체만으로는 Forced writes 설정이 데이터베이스 파일을 깨지게 할 수 있다는 것을
직접 알 수는 없지만 짐작할 수는 있겠네요. 디스크 버퍼링이 없이 즉시 디스크 기록만 가능했던 도스 시절에
갑작스런 정전이 일어났을 때 파일이 깨지는 일이 윈도우 이후보다 훨씬 자주 일어났던 것과 마찬가지로요.

뉴스그룹을 검색해봤습니다. 역시, 파일이 깨지는 경우에 관련하여 Forced Writes 설정에 대한 글들이 꽤
여러개 되더군요. 대략 종합해보자면, 최종 데이터를 안전하게 유지하려면 Forced Writes를 활성화시켜야
하지만, insert / update 작업이 대단히 빈번한 경우에는 Forced Writes 설정이 오히려 갑작스런 시스템
전원 오프 상태에서 파일을 깨지게 할 수 있다고요.

위의 매뉴얼 인용에서 Forced Writes를 활성화하면 성능이 낮아진다는 언급이 있었는데, 이에 대해서도
테스트를 해본 사람이 있더군요. 인터베이스 4.x 버전이기는 하지만... 많은 레코드를 인서트하는 작업에서,
Forced Writes가 on된 상태에서는 15분이 걸리고, Forced Writes가 off된 상태에서는 45초가 걸린다네요.
(엄청난 차이군요)

디스크 버퍼링으로 인해 성능이 차이나는 것은 데이터베이스 레벨이 아니라 OS 레벨의 차이이기 때문에
디스크 버퍼링을 하거나 하지 않았을 때의 성능상의 차이는 MS SQL서버나 오라클같은 다른 데이터베이스라도
마찬가지일 거고, 그렇다면 다른 데이터베이스에서도 마찬가지로 디스크 버퍼링을 하겠지요.
아마도 Forced Writes와 같은 디스크 버퍼링 설정이 없거나, 고급 설정으로 찾기 어려운 곳에 숨겨져 있을
가능성이 클 것 같습니다만.

어쨌든 이창석님의 투철한 실험정신 덕분에 중요한 사실을 제대로 알게 되었습니다.
감사~~

그건 그렇고... 이창석님의 경우처럼 POS 단말기인 데이터베이스 서버를 아무렇게나 관리하는 경우라면,
(정도차이는 있을지 몰라도 사용자 클라이언트쪽에서 인터베이스나 파이어버드를 돌리는 경우는 비슷하겠죠)
당연히 UPS는 꿈도 못꿀 것이고 전원 관리도 제대로 안되겠죠. 그렇다고 Forced Writes를 무조건 off시켜서
해결하려면 아마도 전원이 나가기 직전 최종 몇분간의 데이터는 기록이 안될 가능성이 있고..

이건 인터베이스 계열의 단점이라고 보기는 그렇고.. 오라클이나 SQL서버 등도 마찬가지긴 하겠죠.
RDBMS 서버란 것이 원래 아무렇게나 굴리며 쓰는 사용자 PC에 맞게 설계된 것이 아니니까요.

하지만 해결은 해야 할 테니... 제 생각에는 디비 서버로 보내는 데이터나 혹은 SQL문 자체를 별도의 로그
형태로 저장해둘 필요가 있을 것 같네요. 로그는 일정 시간마다 오래된 것들은 비워도 될 테고..
그리고 프로그램이 기동될 때마다 최근의 로그를 검사해서 물리적으로 저장되었는지를 체크하면 되겠네요.
물론 텍스트 파일로 저장하는 부하가 더 들어가긴 하지만, 그리 커지지 않도록 유지하기만 한다면 텍스트
쓰기 작업이 디스크에 저장하는 작업보다는 훨씬 빠르니까 해결책의 하나가 될 수 있겠네요.


이창석 님이 쓰신 글 :
: 1. 환경
:   - 약 900여개의 회사 가맹점(개인슈퍼)의 POS 장비(일반PC)에
:     모두 파이어버드 디비를 사용.
:   - 온도(전혀 관리않음, 겨울에는 컴퓨터 근처에 난방기구가
:          설치되기도 함)
:   - 습도(전혀 관리않음, 근처에 채소용 가습기가 설치되기도 함)
:   - 사용습관(최악 : 리셋 스위치나 전원 스위치를 많이 사용함,
:              전원선을 발로 건드려서 빼기도함, 바이러스가 뭔지
:              모르는 사용자도 많음, 기타등등...)
:
: 2. 증상
:   - 1 개월당 약 70~80 건의 장비 관련 상담 발생.
:      * 사용자 미숙으로 인한 상담(사용법 문의 등) : 약 30 건 내외
:      * 사용자 미숙으로 인한 장애(바이러스 등) : 약 15 건 내외
:      * 실제 장애로 인한 상담 : 약 5 건 내외
:   **** 데이터베이스 파일 손상으로 인한 장애 : 약 30 건 내외
:
: 3. 위와 같은 정도로 상담 전화가 오는데, 실제 작업시간은 파일
:    손상으로 인한 장애가 대부분을 차지함
:    (본사 서버에 백업된 자료를 이용해 새로 생성해 내려줌)
:
: ##  위와 같은 이유로 파일 손상에 상당히 관심을 가지고 약 6 개월
:    정도 감시해봤습니다.
:     가맹점장비에 db파일이 2개가 존재하는데(서버측db, 매대측db),
:    실제 트랜젝션 양은 당연히 매대측 db가 많습니다.
:     헌데, 손상은 서버측이 월등히 많습니다(30건중 약27~8 건).
:
:    두db의 property를 비교하니 Forced Writes 가 다르더군요...
:    (서버측은 Disabled, 매대측은 Enabled) - 왜 이렇게 다르게
:    되었는지는 모르겠습니다.
:
:    그래서 다음과 같이 시험해 봤습니다 (무식하게...).
:
:    db 파일을 임의로 생성해, varchar 컬럼을 5개 가지는 테이블을
:    생성한 후 40만건의 자료를 인서트하고(A테이블),
:    똑같은 테이블을 이름만 다르게 1 개 생성해서(B테이블),
:    A테이블의 레코드를 select해, B테이블로 한건씩 insert 하는
:    도중에 전원 플러그를 뽑아보았습니다.
:
:    Forced Writes가 Disabled 일 경우 약 5 회 이내에 db 파일에
:    손상이 오더군요.
:    Enabled 일 경우에는 50 회를 반복해도 손상이 없어 시험을
:    중지했습니다.
:
: ===========================================================
:    모든 분의 경우가 저와 같지는 않겠지만 자꾸 깨지는분은 참고
:    해서 시험해 보세요...도움이 될지는 모르겠네요...
: ===========================================================
:

+ -

관련 글 리스트
1101 Re: [질문] Forced Writes를 어디서 설정합니까? 궁금이 1244 2004/06/09
1103     Re:Re: [질문] Forced Writes를 어디서 설정합니까? 박지훈.임프 2263 2004/06/09
1092 파이어버드 DB file 손상 경험담 입니다... 이창석 2197 2004/06/08
1095     Forced Writes... 감사! 박지훈.임프 2478 2004/06/09
1096         Re: insert, delete 작업 시간... 이창석 1967 2004/06/09
1098             테스트하신 김에... ^^ 박지훈.임프 1826 2004/06/09
1099                 Re:2000-server 에서 insert, delete 입니다... 이창석 1918 2004/06/09
1100                     감사.. ^^ 박지훈.임프 1784 2004/06/09
1093     추가... 이창석 1801 2004/06/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.