728x90

CRM(고객관계관리)·ERP(전사자원관리) 등을 포함하는 기업용 애플리케이션 분야에서 세계 3대 메이저 중 하나로 꼽히는 피플소프트의 한국 시장 진출이 초읽기에 들어갔다. <관련기사 본지 1월 27일 1면 참조>


 특히 피플소프트는 오라클· SAP 등과 같은 경쟁 기업들에 비해 뒤늦게 한국 시장에 진출했다는 점을 감안해 다국적 컴퓨팅 기업의 한국지사는 물론 국내 솔루션 업체를 파트너사로 확보해 시장 진입 초기부터 영업력을 발휘한다는 전략을 세우고 있어 주목된다.


 피플소프트는 오는 7월 한국 지사 가동을 목표로 초대 지사 대표에 이광재씨를 임명한 것으로 확인됐다. 이광재 피플소프트코리아(가칭) 대표는 현재 법인(지사) 설립을 위한 작업을 추진하고 있으며 국내 파트너 업체 선정과 관련해 본사와 커뮤니케이션 창구를 맡고 있는 것으로 알려져 있다.


 이광재 대표는 “기존에 JD에드워즈 사업을 해온 윌러스(대표 박병수) 외에도 본사 차원에서 업무 협력을 논의하고 있는 다국적 컴퓨팅 기업 U사 등 1∼2개 다국적 IT 기업의 한국 지사와 국내 대형 SI 업체 등을 대상으로 파트너 선정을 검토하고 있다. 늦어도 여름께 모든 준비를 끝내고 지사 활동을 본격 개시할 수 있도록 일정을 세워놓고 있다”고 밝혔다. 다만 “한국지사의 직접 영업을 위주로 할지 아니면 채널을 통한 간접판매를 택할 지는 아직 결정되지 않았다”고 덧붙였다.


 지금까지 국내에서 피플소프트에 대한 인지도는 인사·회계 관리 등 HRM(인사자원관리) 분야로 국한됐으나 세계 시장에서는 대학·공공 분야의 CRM 및 ERP 영역에서 오라클이나 SAP와 경쟁하는 글로벌 기업으로 꼽힌다. 특히 피플소프트는 지난해 9월 SMB 시장에서 영향력이 높은 ERP 업체 JD에드워즈를 인수하며 세계적인 엔터프라이즈 솔루션 기업으로 급부상해 주목받고 있다.


 업계에서는 비록 피플소프트의 한국 시장 진출이 경쟁사보다 한참 늦었지만 본사 차원에서 인수한 JD에드워즈의 ERP 솔루션을 사용하고 있는 국내 고객사가 적지 않다는 점에서 지사 설립 초기에도 적지 않은 영업력을 과시할 것으로 주목하고 있다. 현재 JD에드워드의 ERP 솔루션을 사용하고 있는 고객사는 두산 계열의 20여개사, 조선내화, 삼양사, 녹십자백사, 라파즈석고, 라파즈한라시멘트, 동방전자 등 60여개사 정도이다. 최근 두산에서 빌트원으로 대주주가 바뀐 윌러스가 영업 및 서비스를 맡고 있다.


 피플소프트는 CRM, ERP,HCM, SCM 엔터프라이즈 4대 솔루션을 보유하고 있으며 지사 출범 이후에는 JD에드워즈의 ‘피플 엔터프라이즈 원’, ‘피플 엔터프라이즈 월드’ 등의 솔루션과 통합한 제품으로 영업을 전개할 것으로 알려져 있다.

728x90

'optim' 카테고리의 다른 글

JDE 주요테이블  (0) 2011.10.22
Optim 7.3.1 TDM Troubleshooting  (0) 2011.09.01
optim link  (0) 2011.04.06
OptimEBS 6.1 Application Setup 이슈 (P2P)  (0) 2011.03.02
사용자 편의성과 유연성 갖춘 Oracle JD Edwards EnterpriseOne  (0) 2009.12.11
728x90

한국피자헛
사용자 편의성과 유연성 갖춘
Oracle JD Edwards EnterpriseOne 도입하여 독보적인 피자브랜드 입지 강화

 

■ (주)한국피자헛 Seoul, Korea

■ 산업 l 식음료 서비스
- 매장수 : 약 330 여 개

■ 오라클 제품 및 서비스
- Oracle JD Edwards EnterpriseOne
- Oracle Database 10g

■ 주요 도입 효과
- 엑셀로 관리한 데이터를 쉽게 입력할 수 있는 등 사용자 편의성 강화
- 뛰어난 유연성으로 EDI를 통해 3rd Party 시스템과 연계가 쉬움
- 결산일이 7일 이상 에서 1.5일로 줄어드는 등 경영관리업무 혁신
- 구현이 쉬우며 관리가 편리함
- 저렴한 비용

 

 

“한국피자헛은 지난 1993년부터 사용하던 Oracle JD Edwards World를 Oracle JD Edwards EnterpriseOne으로 업그레이드하여 업무효율성을 향상시켰다. Oracle JD Edwards EnterpriseOne은 관리나 구현이 쉽고 사용자 편의성과 유연성 뿐만 아니라 비용이 저렴해 중견.중소기업을 위한 최적의 솔루션이라고 할 수 있다.”

 

길재민 부장 _한국피자헛 정보지원센터 전산팀

 

 

22년간 독보적인 피자브랜드로 자리매김

 

(주)한국피자헛은 1997년 펩시 그룹에서 독립한 얌 브랜드(YUM Brands, INC.)의 한국 지사로, 1985년 이태원 1호점을 오픈하며 한국에 피자를 본격적 으로 소개한 이후 꾸준하게 업계 1위를 지키고 있다. 한국피자헛은 전국에 약 330여 개의 매장을 운영하고 있으며, 2004년 말에는 46%라는 시장 점유율을 기록하는 등 독보적인 위치에 있다.또 한국인이 좋아하는 다양한 피자를 출시해 경쟁 력을 확고히 하며 동시에 개발 메뉴를 전세계로 전파해 타 국가 피자헛에서 한국을 벤치마킹하고 있다.특히 한국피자헛은 전세계 80여 개국 중 에 미국, 영국에 이어 세 번째로 좋은 실적을 달성하며 지속적인 성장을 이뤄가고 있다.

 

Oracle JD Edwards EnterpriseOne으로 업그레이드

 

한국피자헛은 지난 2003년에 Oracle JD Edwards EnterpriseOne으로 업그레이드 하였다. 기존 시스템에서는 나라별로 서버를 따로 두고 운영 하였으나, Oracle JD Edwards EnterpriseOne으로 업그레이드 한 후에 시스템 서버는 각 로컬에 두지만 미국 본사에서 통합 관리를 하고 있으며 재무와 구매, Inventory 등의 업무를 효율적으로 처리하고 있다.

 

사용자 편의성 갖춘 재무분야 최고 솔루션

 

Oracle JD Edwards EnterpriseOne의 가장 큰 장점은 사용자 편의성이다. 기존 Oracle JD Edwards World는 외부 시스템과 연결 시 따로 프로그래밍 하는 등 불편한 점이 있었으나, 새로 도입한 Oracle JD Edwards EnterpriseOne은 재무 담당자가 엑셀로 관리한 데이터를 쉽게 시스템에 입력할 수 있으며, 하위 시스템과 연결이 따로 필요 없어 업무 효율성이 향상되었다. 또, 트랜잭션 타입별, document 타입별 로 각각 다른 회계계정코드와 자유자재로 연계(mapping)이 가능하여 실무자가 사용하기 편해졌다. 또다른 Oracle JD Edwards EnterpriseOne의 장점은 유연성이다. 기존에 Oracle JD Edwards World 를 사용할 때에는 Inventory나 구매 모듈에 연계하기 위해 협력사(third party)도 반드시 Oracle JD Edwards World를 사용해야기 때문에, 어려움이 많았으며 데이터와 시스템 오류가 빈번했으나 Oracle JD Edwards EnterpriseOne으로 업그레이드한 후, 협력사에서는 각기 사용하기 쉬운 시스템을 사용하고 이를 EDI(Electronic Data Interchange)를 통해 Oracle JD Edwards EnterpriseOne과 연결하여 사용과 관리가 쉬워지고 데이터 정합성과 신뢰성이 확보되었다. 이처럼 Oracle JD Edwards EnterpriseOne은 뛰어난 유연성을 갖추고 있어 다른 시스템과 연계가 쉬운 것이 가장 큰 장점이며, 이는 중견.중소기업에 꼭 필요한 요소라고 할 수 있다.

 

중견.중소기업을 위한 최적의 솔루션, Oracle JD Edwards EnterpriseOne

 

중견.중소규모 기업의 IT 환경은 대기업과 달리 쉽게 구현할 수 있어야 하며, 사용과 관리가 용이해야 한다. Oracle JD Edwards EnterpriseOne은 이러한 요구사항에 맞는 솔루션으로, 가볍고 사용하기 쉬우며, 비용도 저렴하다. 한국피자헛은 이번에 시스템을 업그레이드 하면서 하위 시스템과 독립적으로 운영이 가능하며, 여러 시스템과 연계가 쉬워 유연성이 뛰어난 Oracle JD Edwards EnterpriseOne의 장점을 십분 활용하고 있다.


출처 : 한국 IBM

728x90

'optim' 카테고리의 다른 글

JDE 주요테이블  (0) 2011.10.22
Optim 7.3.1 TDM Troubleshooting  (0) 2011.09.01
optim link  (0) 2011.04.06
OptimEBS 6.1 Application Setup 이슈 (P2P)  (0) 2011.03.02
[참고] 피플소프트 한국상륙 초읽기  (0) 2009.12.11
728x90

1. 클라이언트 NLS_LANG

   많은 오라클 엔지니어들이 아직도 이경우 제대로 정리되지 않은 부분입니다.

   결론부터 말하면 DB의 CHAR SET이  UTF8이라고 하더라도

   클라이언트 LOCALE은 KSC5601 혹은 WIN949이어야 합니다.

   문서도 있는데 링크는 기억나지 않고^^;

   UTF8이 서버 로케일일 경우이건 뭐건, 클라이언트 로케일은 해당 국가 로케일이 되어야 합니다.

   간략한 테스트는

   LENGTHB와 CONVERT 함수를 이용해서 테스트를 해보면 됩니다.

   DB가 UTF8일 경우

   클라이언트 LOCALE이 UTF8로 올릴 경우 한글이 2바이트로 됩니다.

   CONVERT로 바꿀 때 SOURCE를 KOC5601로 처리해야 됩니다. (하지만 DUMP를 떠보면 다르게 나옵니다)

   DB가 UTF8이라고 클라이언트 로케일을 UTF8로 바꿀 경우 치러야 할 대가가 만만치 않습니다.

   특히 EXPORT,IMPORT할 때 NLS_LANG을 잘못한 경우...--;

 

2. CHAR TYPE 문제

   하나의 칼럼이 CHAR TYPE인데 이를 UTF8로 바꾼다면?

   해당 데이터가 오로지 영숫자만 있다면 상관없겠으나

   한글도 들어간 칼럼이라면?

   DATA TYPE 변경 없이 일괄적으로 칼럼의 LENGTH를 늘리면

   스페이스가 들어가는 경우가 발생합니다.

   즉, CONVERSION이 잘못된 경우이죠.

   이때는 먼저 SOURCE에서 CHAR -> VARCHAR2로 변경한 뒤에 작업하셔야 합니다.

   일반적으로 특수한 경우(좀있다 얘기하겠습니다)를 제외하고 이렇게 변경한 뒤에

   어플리케이션 영향도는 없다고 보셔도 됩니다.

   그리고 변경하는데 생기는 부하는 거의 없습니다. 단, 피크시간대는 절대 피하셔야죠

   LIBRARY CACHE 쪽에서 해당 테이블을 참조하는 오브젝트가 모두 재컴파일 됩니다.

 

3. VARCHAR2(4000)칼럼의 문제

   LOB나 LONG을 사용하지 않고 VARCHAR2로 칼럼을 정의하고 게시판 본문이나

   각종 텍스트를 처리하는 테이블이 있습니다.

   이 경우 UTF8로 넘어갈 때 BYTE가 늘어나 해당 레코드를 처리할 때 에러가 납니다.

   EXP를 사용할 경우 그냥 에러로그에 남으니까 그나마 낳습니다.

   DB LINK로 땡길 경우 전체 트랜잭션이 에러나면 많이 힘들게 되죠.

   그리고 실질적으로 VARCHAR2(4000)을 넘기 때문에 데이터가 잘리는 문제가 생깁니다.

   이를 해결하려면 LOB로 바꿔야 하는데 이경우 어플리케이션 테스트를 제대로 못하면 문제가 커집니다.

   JAVA같은 경우 TYPE문제가 걸리죠

   이경우 최선의 방법은 없습니다.

   저같은 경우 어플리케이션 담당자를 설득해서 해당 칼럼 데이터의 나머지를 버렸습니다.

   물론 당근으로는... LOB로 바꿀 경우 어플리케이션을 바꿔야 한다는 것. 하지만 일부 데이터의 OVER LENGTH부분을

   버리면 아무것도 손댈 필요가 없다는 것...

   아무튼, 이부분은 DBA가 단독으로 결정하면 안됩니다.

 

4. UTL_FILE을 이용한 FILE CONTROL 문제

   이건 상당히 골치 아픈 문제입니다.

   대상 DB와 어플리케이션이 UTL_FILE을 사용해서 데이터를 읽거나 쓰지 않는다면  여러분은 일단 복받으신 겁니다.

   일반적으로 소켓으로 주고받는 데이터(뭐 금융권 전문이나 애니링크같은)는 구분자가 아니라 자리수로 구분합니다.

   FILE에서는 한글2바이트,영문1바이트이기 때문에 그걸로 미리 자리수가 정해져 있죠.

   이를 UTL_FILE이나 LOADER로 올려서 SUBSTRB로 잘라서 쓰는 경우가 있습니다.

   그런데 디비에서 처리하면 한글3바이트,영문1바이트입니다. 즉, 정해진 자리수로 자를 수 없습니다.

   당연히 배치에서 데이터가 잘못 처리됩니다.

   이럴 때 첫번째로 생각하는 방법은 CONVERT로 KSC5601로 바꿔서 기존 데이터 처리 방식으로 처리하면 됩니다.

   하지만 이런 경우에도 글자는 깨집니다. 왜냐하면 SUBSTRB(SUBSTR 포함)는 해당 로케일을 따라가기 때문에

   CONVERT로 바꾼다고 해도 보장을 못합니다.

   이를 해결할려면 UTL_RAW 팩키지를 사용해야 합니다.

   특히, 잘라서 올리는 것만이 아니라 자리수에 맞춰서 UTL_FILE로 WRITE 할 경우 CONVERT를 제대로 안하면

   전문처리 등에서 대형사고를 일으킵니다.

 

5. PARTIAL MULTI BYTE 에러

   이는 KSC5601 -> UTF8로 DB LINK로 처리할 때 많이 생깁니다.

   원인은 KSC5601 자체 있습니다.

   UTF 코드는 자신이 파싱 못하는 문자는 받아들이지 않으나 KSC5601은 다 받아들입니다.

   즉, 파싱되지 않는 쓰레기 데이터도 해당 칼럼에 들어갑니다.(예를 들어 ¿ 같은 문자)

   그나마 눈에 보이는 문자면 다행이죠... 아예 조회시 누락되는 바이트도 있습니다.

   물론 TO_SINGLE_BYTE FUNCTION으로 대부분 해결됩니다. 그래서 가능한 이방식을 먼저 적용합니다.

   하지만 그렇게 되지 않는 경우도 발생합니다.

   이런 경우는 일일이 찾아서 해당 데이터를 고쳐야 합니다.

   제일 편한 방법은 EXPORT/IMPORT로 넣어서 ERROR LOG를 보면 됩니다.

   그런데 해당 사이트에 여러개의 DB가 있고 해당 데이터가 원천데이터가 아닌 경우는 끝까지 추적해서 그걸 잡아내지 않으면

   마이그레이션 이후에도 계속 에러납니다.

   예를 들어 UTF로 바꾼 DB는 정보계이고 계정계는 아직 KSC5601이라면 마감배치 돌릴 때마다 에러나겠죠?

 

6. COLUMN LENGTH의 문제

   한글은 2->3바이트, 영숫자는 1->1 바이트이므로 계산상 해당 칼럼을 1.5배로 늘려주면 아무 이상이 없어야 하는데요...

   안타깝게도 안그렇습니다. 위의 PARTITAL MULTI BYTE에러와 연관되는 문제인데... 1바이트로 처리되어야하는 문자가

   3바이트로 처리되는 경우가 발생합니다. 이것을 피하고 싶으면  TO_SINGLE_BYTE로 처리해야 합니다.

   그러나... 이경우 문제가 있습니다. 일단 처리시간이 오래걸립니다.(마이그레이션은 제한된 시간에 해야 합니다)

   그렇다고 기존 SOURCE를 전부 UPDATE처리하자니 뒷감당이 안됩니다.( 문제가 발생하는 레코드의 칼럼만

    변경하면 됩니다만 이것을 추적해서 찾을 시간이 없습니다. 물론 시간이 있다면 하시는게 베스트죠. 그러나 그럴 시간을

    확보할 수 있을까요?)

    결국 나중에는 2배로 늘리고, 다시 2.5~3배로 늘렸습니다. 시간이 부족하기 때문에 벌어진 일이죠.

    이렇게 해도 큰 문제가 없는 이유는 대부분 이런 문제를 일으키는 데이터는 조회조건에 걸리는 칼럼이 아니라

    조회결과로 걸리는 칼럼이기 때문입니다.(비즈니스 어플리케이션을 이해하신다면 수긍하실겁니다)

    이것은 편법입니다. 원칙적으로는 이런 데이터 클린징작업을 먼저 수행해야 합니다.

728x90
728x90

SQL*LOADER 사용시에 여러가지 적절한 옵션 사용과 테이블에 대한 설정값들을 변경시켜줌으로써 
많은 성능 향상을 가져올수 있다.

다음은 그 권장되는 설정법들을 설명한 것이다.

1. DIRECT PATH LOAD를 사용한다. Direct path load는 load되는 테이블이나 파티션에 exclusive access를 요구한다. 
추가적으로 트리거는 자동으로 disable되고 제약조건은 로드가 완료될때까지 defer(연기) 된다.
 

2. direct path load로 데이타를 로드시에 모든 CHECK 와 REFERENCE 무결성 제약조건은 자동으로 DISABLE된다. 
그러나 그밖의 다른 타입의 제약조건 NOT NULL, UNIQUE, PRIMARY KEY 조건들은 반드시 DISABLE 시켜준다. 
작업 완료후에 수동으로 enable시켜준다. 
 

3. 정렬된 순서로 데이타를 load한다. 미리 sorting 된 데이타는 정렬에 필요한 공간temporary 영역 사용을 최소화한다. 
SQL*LOADER 옵션에서 SORTED INDEXES 를 CONTROL파일에 기술한다.
 

4. 인덱스 MAINTANCE 를 연기(DEFERRING)하라. 인덱스는 데이타가 insert하거나 delete 또는 key 컬럼이 업데이트 
될때마다 자동으로 maintance 를 실시한다.따라서 많은 양의 데이타를 load할때 작업이 종료된 후에 maintance를 한다면 
좀더 빠를 것이다. SKIP_INDEX_MAINTENANCE = TRUE  를 설정하면 인덱스 세그먼트의 상태가 “ INDEX UNUSABLE”상태가 
되어있더라도 LOADER시작시에 인덱스 MAINTANCE를 SKIP한다. 
 

5. UNRECOVERABLE 을 사용해서 REDO 생성을 DISABLE시킨다. 모든 recover 시에는 redo log파일이 필요하다. 
그러나 redo log 생성은 부하가 많기 때문에 disable시키면 그만큼 속도는 빠르게 된다. 
그러나 LOADER 작업 중간에 FAILURE 가 발생한다면 처음부터 load작업을 다시 해야한다. 
따라서 리두로그를 생성하지 않기때문에 loader 작업 후에는 반드시 백업하도록 한다.
 

6. 단일 파티션에 loading 하도록 한다. 파티션 테이블에 데이타 load시 기타 사용자는 다른 파티션 에 접근 할 수 있다. 
APRIL 파티션을 로드시에 jan 에서 april 까지 쿼리를 실행하는 유저를 차단하지 못한다. 따라서 부하가 증가한다. 
 

7. Parallel 로 로드를 한다. 파티션으로 구성되어 있다면 parallel 로 다중 파티션을 로드할 수 있다. 
 

8. STREAMSIZE 파라미터는 SQL*LOADER client 에서 oracle server로 direct path stream buffer 의 크기(bytes)를 
지정한다. 기본값은 256000 bytes 이다.  
또한 columnarrayrows 또한 direct path column array 에 전송하는 row의 갯수를 지정한다.기본값은 5000이다.


9. 만일 load되는 데이타가 중복되는 날자값을 많이 가지고 있다면 DATE_CACHE 파라미터를 설정해서 DIRECT PATH LOAD
시에 더 나은 성능을 보장할 수 있다. CACHE에 CONVERION 되는 DATE 의 사이즈(엔트리)를 지정한다. (기본값은 1000) 

728x90
728x90

LMT(Locally Managed Tablespace)사용하기



작성일: 2002-11-11
작성자: 강명규(kang@dbakorea.pe.kr)
OS: Linux 2.4.19
Oralce: Oracle EE 8.1.7

미리 말하자면, 당신의 오라클서버가 이 기능을 지원한다면 무조건 이 기능을 사용하라.

오라클은 tablespace, extent, data block 이라는 관점에서 공간할당(Space Allocation)을 관리한다.
간단히 data block < extent < tablespace 라고 생각하면 되겠다.
data block은 보통 몇개의 OS블럭으로 구성되는 DB의 기본 I/O단위가 된다.
extent는 또 몇개의 오라클 data block으로 구성된다.
보통 테이블등의 오브젝트는 이 extent단위로 할당을 받아 segment를 이루게 된다.
tablespace는 이 모든 것들을 포함하는 컨테이너로서의 역활을 수행한다.


Dictionary managed tablespaces
별다른 조치를 하지 않았다면 테이블스페이스의 공간할당에 대한 관리는
다른 오브젝트와 동일하게 Data Dictionary가 한다.
오라클 8.0.x이전 버전의 경우, 이것만이 가용한 방식이다.


Locally Managed Tablespaces (LMT)
하지만 8.1.x이후부터는 '테이블스페이스에 의한 extent관리'라고 불리는 공간할당관리옵션을 사용할 수 있다.
테이블스페이스에 대한 extent allocation 관리를 해당 테이블스페이스 자신이 스스로 할 수 있다는 것이다.
즉, 성능병목현상을 유발할 수 있는 Data Dictionary에 의한 관리로부터 벗어날 수 있다는 것이다.
이러한 테이블스페이스는 자신이 소유한 각 데이터파일에 대한 블럭의 사용유무를 추적하기 위해 '비트맵'을 유지한다.
비트맵내의 각 비트(bit)는 블럭 혹은 블럭들의 그룹에 해당한다.


LMT의 장점
1. temporary tablespace에 적합하게 사용될 수 있다.
2. 주기적인 tablespace의 coalesce가 불필요하다.
   (tablespace의 coalesce를 모른다면 자신이 DBA인가 의심하십시오)
3. 모든 extent는 균등한 크기를 갖게 하며, 테이블스페이스레벨에서 이를 강제하여
   사용자의 잘못된 extent크기지정의 위험을 피할 수 있다.

주의점
1. temporary tablespace에는 UNIFORM extent allocation만 가능
2. NEXT, PCTINCREASE, MINEXTENTS, MAXEXTENTS, and DEFAULT STORAGE 저장옵션은 유효하지 않다.


EXTENT할당 방식
오라클이 새로운 extent를 할당할 수 있는 자유공간을 찾는 방식은 다음과 같다.
해당 테이블스페이스가 소유한 데이터파일들중 한 놈을 선택, 그 데이터파일의 '비트맵'을 검색하여
요구되는 개수의 인접 자유블럭(adjacent free block)을 가진 놈을 찾는다.
만일, 데이터파일이 충분한 인접자유공간을 가지고 있지 못한다면, 또다른 놈을 검색할 것이다.
extent가 할당해제될때, 오라클은 해당 데이터파일의 비트맵을 수정한다.




EXTENT할당(Extent Allocation)방식에는 2가지가 있다.

Automatic Extent Allocation
사용자는 초기 extent크기만을 결정하고, 이후의 추가적인 extent는 오라클이 결정한다.
(이때, extent크기는 64KB, 1MB, 8MB, 64MB 순으로 사용될 것이다. )

SQL> create tablespace ts_dbakorea_lmt_auto
  2  datafile '/u01/app/oracle/oradata/db/ts_dbakorea_lmt_auto01.dbf' size 10m
  3  extent management local autoallocate;  

Tablespace created.

SQL>

Uniform Extent Allocation
생성될 extent크기를 사용자가 정할 수 있다.(default: 1MB)
이후, 생성되는 모든 extent는 초기에 정한 이 extent의 크기를 가지게 된다.
따라서, 이 테이블스페이스내에서 생성되는 테이블, 인덱스등은 모두 같은(균등한) extent크기를 가지게 될 것이다.
당연히 tablespace의 fragmetation은 발생하지 않으므로, coalesce과정이 필요없다.

SQL> create tablespace ts_dbakorea_lmt_uni
  2  datafile '/u01/app/oracle/oradata/db/ts_dbakorea_lmt_uni01.dbf' size 10m
  3  extent management local uniform size 1m;

Tablespace created.

SQL>


자, 그럼 dba_tablespaces에 질의하여 tablespace의 정보를 확인해 보자.
당연히, TS_DBAKOREA_LMT_UNI, TS_DBAKOREA_LMT_AUTO는 extent_management가 local로 되어 있다.
allocation_type은 uniform의 경우 UNIFORM으로, AUTOALLOCATE의 경우 SYSTEM으로 되어 있음을 알수 있다.
특의하게 TS_DBAKOREA_LMT_AUTO의 경우 NEXT_EXTENT가 정해져 있지 않음을 유의하자.

SQL> select tablespace_name, initial_extent, next_extent, min_extents, max_extents,
  2  pct_increase, extent_management, allocation_type
  3  from dba_tablespaces;

TABLESPACE_NAME      INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE EXTENT_MAN ALLOCATIO
-------------------- -------------- ----------- ----------- ----------- ------------ ---------- ---------
SYSTEM                        65536       65536           1  2147483645           50 DICTIONARY USER
RBS                          524288      524288           8        4096           50 DICTIONARY USER
TOOLS                         32768       32768           1        4096            0 DICTIONARY USER
TEMP                          65536       65536           1                        0 DICTIONARY USER
USERS                        131072      131072           1        4096            0 DICTIONARY USER
INDX                         131072      131072           1        4096            0 DICTIONARY USER
TS_DBAKOREA_LMT_UNI         1048576     1048576           1  2147483645            0 LOCAL      UNIFORM
TS_TEST                       20480       20480           1         249           50 DICTIONARY USER
TS_CORRUPT_TEST               20480       20480           1         249           50 DICTIONARY USER
TS_TEMP                       20480       20480           1         249           50 DICTIONARY USER
TS_DBAKOREA_LMT_AUTO          65536                       1  2147483645              LOCAL      SYSTEM

11 rows selected.

SQL>

AUTOALLOCATE의 경우, 처음 테이블의 크기(처음 EXTENT의 크기)는 64KB부터 시작한다.
테이블의 크기가 1MB가 될때까지 EXTENT는 64KB단위로 증가하고, 1MB가 된 이후부터는
EXTENT의 크기가 1MB단위로 증가하게 된다. 이후부터는 약간 다른데 64MB가 되었을때 8MB,
1GB가 되었을때 64MB단위로 EXTENT가 증가하게 된다. 따라서 위의 질의에서 NEXT_EXTENT가
명확히 보이지 않는 것이다.

LMT의 경우에서, EXTENT의 크기는 테이블스페이스 레벨에서만 관리되어 진다.
즉, LMT내의 테이블등의 오브젝트는 모두 테이블스페이스의 저장옵션을 따라 정해진다.





temporary tablespace를 locally managed로 변환하기

SQL> drop tablespace temp;

Tablespace dropped.

SQL> create temporary tablespace temp
  2  tempfile '/u01/app/oracle/oradata/db/ts_temp_lmt_uni01.dbf' size 10m
  3  extent management local uniform size 2m;

Tablespace created.

SQL> select tablespace_name, initial_extent, next_extent, min_extents, max_extents,
  2  pct_increase, extent_management, allocation_type
  3  from dba_tablespaces;

TABLESPACE_NAME                INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE EXTENT_MAN ALLOCATIO
------------------------------ -------------- ----------- ----------- ----------- ------------ ---------- ---------
SYSTEM                                  65536       65536           1  2147483645           50 DICTIONARY USER
RBS                                    524288      524288           8        4096           50 DICTIONARY USER
TOOLS                                   32768       32768           1        4096            0 DICTIONARY USER
TEMP                                  2097152     2097152           1                        0 LOCAL      UNIFORM
USERS                                  131072      131072           1        4096            0 DICTIONARY USER
INDX                                   131072      131072           1        4096            0 DICTIONARY USER
TS_DBAKOREA_LMT_UNI                   1048576     1048576           1  2147483645            0 LOCAL      UNIFORM
TS_TEST                                 20480       20480           1         249           50 DICTIONARY USER
TS_CORRUPT_TEST                         20480       20480           1         249           50 DICTIONARY USER
TS_DBAKOREA_LMT_AUTO                    65536                       1  2147483645              LOCAL      SYSTEM

10 rows selected.

이렇게 생성된 temporary tablespace는 v$datafile이 아닌 v$tempfile에서만 보여진다.

SQL> select name from v$datafile;

NAME
----------------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/db/system01.dbf
/u01/app/oracle/oradata/db/rbs01.dbf
/u01/app/oracle/oradata/db/tools01.dbf
/u01/app/oracle/oradata/db/users01.dbf
/u01/app/oracle/oradata/db/indx01.dbf
/u01/app/oracle/oradata/db/ts_corrupt_test01.dbf
/u01/app/oracle/oradata/db/ts_test01.dbf
/u01/app/oracle/oradata/db/ts_dbakorea_lmt_uni01.dbf
/u01/app/oracle/oradata/db/ts_dbakorea_lmt_auto01.dbf

9 rows selected.

SQL> select name from v$tempfile;

NAME
----------------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/db/ts_temp_lmt_uni01.dbf

SQL>


더 많은 내용을 원한다면 dba_free_space, dba_extents뷰도 확인해보면 좋을 것이다.

이제 dictionary managed tablespace를 locally managed tablespace로 변경해 보겠다.
상호간의 변경은 8.1.6이상에서만 가능하므로 주의하기 바란다. 현재 필자는 8.1.7에서 테스트했다.
8.1.5는 locally managed tablespace -> dictionary managed tablespace 로의 변환만이 가능하다고 한다.

locally managed tablespace -> dictionary managed tablespace : DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL
dictionary managed tablespace -> locally managed tablespace : DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL

temporary와 system tablespace는 locally managed 에서 dictionary-managed로 변환이 불가능하다.
SYSTEM의 경우, 새로 DATABASE를 생성할때 할 수 밖에.. 다른 방법이 있으려나?
오라클사는 locally managed tablespace를 사용하기를 권장하고 있므로 지금부터 바꿔보는 것은 어떨까?


SQL> select tablespace_name, extent_management, allocation_type
  2  from dba_tablespaces;

TABLESPACE_NAME                EXTENT_MAN ALLOCATIO
------------------------------ ---------- ---------
SYSTEM                         DICTIONARY USER
RBS                            DICTIONARY USER
TOOLS                          DICTIONARY USER
TEMP                           LOCAL      UNIFORM
USERS                          DICTIONARY USER
INDX                           DICTIONARY USER
TS_DBAKOREA_LMT_UNI            LOCAL      UNIFORM
TS_TEST                        DICTIONARY USER
TS_CORRUPT_TEST                DICTIONARY USER
TS_DBAKOREA_LMT_AUTO           LOCAL      SYSTEM

10 rows selected.

SQL> exec dbms_space_admin.tablespace_migrate_to_local('TOOLS');

PL/SQL procedure successfully completed.

SQL> exec dbms_space_admin.tablespace_migrate_to_local('RBS');

PL/SQL procedure successfully completed.

SQL> exec dbms_space_admin.tablespace_migrate_to_local('USERS');

PL/SQL procedure successfully completed.

SQL> exec dbms_space_admin.tablespace_migrate_to_local('INDX');

PL/SQL procedure successfully completed.

SQL> exec dbms_space_admin.tablespace_migrate_to_local('TS_TEST');

PL/SQL procedure successfully completed.

SQL> exec dbms_space_admin.tablespace_migrate_to_local('TS_CORRUPT_TEST');

PL/SQL procedure successfully completed.

SQL> select tablespace_name, extent_management, allocation_type
  2  from dba_tablespaces;

TABLESPACE_NAME                EXTENT_MAN ALLOCATIO
------------------------------ ---------- ---------
SYSTEM                         DICTIONARY USER
RBS                            LOCAL      USER
TOOLS                          LOCAL      USER
TEMP                           LOCAL      UNIFORM
USERS                          LOCAL      USER
INDX                           LOCAL      USER
TS_DBAKOREA_LMT_UNI            LOCAL      UNIFORM
TS_TEST                        LOCAL      USER
TS_CORRUPT_TEST                LOCAL      USER
TS_DBAKOREA_LMT_AUTO           LOCAL      SYSTEM

10 rows selected.

SQL> select tablespace_name, initial_extent, next_extent, min_extents, max_extents,
  2  pct_increase, extent_management, allocation_type
  3  from dba_tablespaces;

TABLESPACE_NAME                INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE EXTENT_MAN ALLOCATIO
------------------------------ -------------- ----------- ----------- ----------- ------------ ---------- ---------
SYSTEM                                  65536       65536           1  2147483645           50 DICTIONARY USER
RBS                                    524288      524288           8        4096           50 LOCAL      USER
TOOLS                                   32768       32768           1        4096            0 LOCAL      USER
TEMP                                  2097152     2097152           1                        0 LOCAL      UNIFORM
USERS                                  131072      131072           1        4096            0 LOCAL      USER
INDX                                   131072      131072           1        4096            0 LOCAL      USER
TS_DBAKOREA_LMT_UNI                   1048576     1048576           1  2147483645            0 LOCAL      UNIFORM
TS_TEST                                 20480       20480           1         249           50 LOCAL      USER
TS_CORRUPT_TEST                         20480       20480           1         249           50 LOCAL      USER
TS_DBAKOREA_LMT_AUTO                    65536                       1  2147483645              LOCAL      SYSTEM

10 rows selected.

SQL>

728x90
728x90

nohup


부모프로세스가 죽어도 계속 자식프로세스가 돌아감 ( cf : & )


보통 사용자가 로그인해서 여러 백그라운드 작업을 만들게 되는데 이때 백그라운드도 작업이 진행되고 있는 도중에 사용자가 로그아웃을 하면 진행 중이던 백그라운드 작업도 중단된다. 이유는 이러한 모든 백그라운드 프로세스는 사용자의 로그인 쉘에서 만들어진 자식 프로세스들이기 때문이다. 그러나 유닉스 시스템은 로그아웃하여도 백그라운드 프로세스는 계속 진행되도록 할 수 있는 명령어를 제공하고 있다.

CPU 시간을 많이 소요하는 프로세스는 이렇게 백그라운드 작업으로 진행시킴으로써 사용자들이 거의 시스템을 사용하지 않는 시간에 자신의 작업을 진행시킬 수 있다. nohup(no hang up) 명령어는 이러한 목적을 위해 사용되며, 그 형식은 다음과 같다.


% nohup 명령어 &


위 명령은 사용자가 로그아웃하는 것과 무관하게 지정해 준 작업이 모두 종료될 때까지 진행시키라는 의미이다. nohup 명령어는 일반적으로 백그라운드 작업에 사용되는데, 그렇지 않으면 프롬프트가 화면에 나타나지 않으므로 로그아웃할 수 있는 방법이 없기 때문이다. 또한, nohup상태에서 백그라운드로 작업을 수행토록 한 후, logout하였다가 다시 로그인하여 계속 중인 백그라운드 작업을 중지시킬 수 없다. 하지만 logout하지 않은 상태라면 ‘kill 프로세스번호’를 수행하여 작업을 중지시킬 수 있다.


예를 들어, 어느 anonymous ftp 사이트에서 비교적 용량이 큰 파일을 다운로드하는 경우, 트래픽의 폭주로 인하여 다운 받는 시간이 장시간 걸린다면, 다운 받는 동안 구태여 컴퓨터를 켜 놓지 않고 백그라운로 작업을 지시하는 것이 좋다.

그러므로 작업지시 명령어에는 자신이 ftp 사이트에 접속해서 행하는 명령어를 그대로 기록해 두어야 한다.

아래의 예제를 위해 radiocom.kunsan.ac.kr/pub/win에 있는 abc.exe라는 파일을 가져온다고 가정하고, 먼저 vi 편집기로 ftp에서 행하는 명령어를 그대로 작성한다.



예제】

% vi sample


ftp -n radiocom.kunsan.ac.kr << EOF

user anonymous jijoe@ks.kunsan.ac.kr

cd /pub/win

bi

get abc.exe

bye

EOF


% chmod 700 sample

% nohup sample &

% jobs

[1]  + Running  sample

% logout

% cat nohup.out   ☜ 다시 로그인해서



위 예제에서 vi 편집기로 작성된 문서를 먼저 실행모드로 바꾸기 위해서 “chmod 700”를 실시하였다. 여기서 jobs는 현재 프로그램이 정상적으로 잘 작동되고 있는지 여부를 확인하기 위해서 입력한 명령어에 불과하다. “Running sample”이라는 메시지를 보니 정상 작동되고 있음을 알 수 있으므로 이제 logout하더라도 유닉스 시스템이 원하는 파일을 다운 받아 놓는다.


nohup 명령을 이용하여 어떤 작업을 백그라운드(&)로 실행시키면, 그 진행과정은 모두 nohup.out 파일에 기록되기 때문에 차후에 진행과정을 확인하는데 유용하게 사용된다.


출처 : http://radiocom.kunsan.ac.kr

728x90

'*nix' 카테고리의 다른 글

sed 사용법  (0) 2010.06.01
vi 특정문자열 삭제  (0) 2010.06.01
로그파일 가공하기  (0) 2010.05.17
awk 사용법  (0) 2010.05.17
[AIX] 한글 로케일  (0) 2010.01.20
728x90

아카이브(Archive)

l        향후 엑세스될 필요가 있는 정보의 1차 소스

l        운영환경으로부터 고정 콘텐츠 또는 비정형데이터를 추출함으로써 운용 효율성 향상

l        장기간 보존

l        엔터프라이즈 아카이브는 대량의 오브젝트를 축적

l        정보의 보관주기 및 폐기 등을 위한 어플리케이션 및 비즈니스 정책이 고려되어야 함



백업(Backup)

l        복구 목적으로 사용되는 2차 사본

l        장애시 어플리케이션이 특정시점으로 복구될 수 있도록 함으로써 가용성 향상

l        단기간 보존

l        주기적인 데이터 덮어쓰기

l        정책적인 요구사항이 거의 없음



(출처 : 효성인포메이션시스템(주)Next Generation Content Archiving Solution Seminar, 2006년 5월 17일)

728x90

'용어' 카테고리의 다른 글

DBMS의 종류  (0) 2010.01.04
OLE DB에 대한 이야기  (0) 2009.12.17
당신도 데이터베이스 관리자인가요?  (0) 2009.07.08
DBA란?  (0) 2009.07.08
아직도 UTF-8을 안 쓰십니까?  (0) 2009.07.08
728x90

Parallel DML은 기본적으로 session에 "enable" 되어 있지 않습니다. PDML과 serial DML의 locking, transaction, disk space requirement 등의 차이에 의해 PDML mode의 "enable"이 요구됩니다.

ALTER SESSION ENABLE PARALLEL DML;

따라서 Parallel DML이 "disable"되있을 경우 parallel hint나 table/index에 degree가 설정되어 있어도 이는 무시되게 됩니다. 물론 PDML mode가 "enable"되어 있어도 parallel hint나 table/index에 대한 degree가 설정되어 있어야 PDML로 수행 가능하다.


한 Transaction은 서로 다른 table에 대해 여러 PDML이 수행될 수 있습니다. 그러나 PDML로 변경된 table에 대해 해당 transaction 내에서 serial/parallel 명령(DML or Query)으로 access를 할 수 없습니다. 즉 commit/rollback 등으로 transaction을 완료 후에야 동일 table에 대한 operation이 가능합니다.
(참조 Note 201978.1 PDML Restrictions on Parallel DML)

Oracle 9i 이후에 intra-partition parallelism 개념이 소개되었습니다.
이 개념은 partition당 한개씩만 수행되는 parallel execution server의 제한을 완화(?) 시키는 개념입니다.
(참고 Note 241376.1 What is Intra-partition parallelism )

특정 세션의 PDML의 "enable" 여부는 v$session의 PDML_STATUS, PDDL_STATUS, PQ_STATUS column으로 확인 할 수 있습니다.

SQL> SELECT SID,PDML_STATUS, PDDL_STATUS, PQ_STATUS FROM V$SESSION;

SID PDML_STATUS PDDL_STATUS PQ_STATUS
---------- ------------ ------------ ------------
141 DISABLED DISABLED DISABLED
143 DISABLED ENABLED ENABLED
145 DISABLED ENABLED ENABLED
148 DISABLED ENABLED ENABLED
150 DISABLED DISABLED DISABLED

728x90
728x90

현장중계! 대한민국 개발자의 도전과 희망
1부, 기술 분야별 고민 해결 리포트

“당신도 데이터베이스 관리자인가요?”

고승훈 | 프로피아 오라클 기술팀장

데이터베이스를 처음 접하는 관리자가 갖는 막연한 두려움을 없애고 사소한 것이라도 원리에 충실한 지식만 있으면 어떠한 상황에서도 해결책이 있다는 것을 알려주기 위해서 이 글을 쓴다.

필자가 오라클을 접했을 때가 지난 1996년이었던 것으로 기억된다. 그때 버전은 7.0이었고 현재 버전이 10g로 변화하면서 Partitioning, Materialized View, Stream, Cache Fusion, Grid 등 새로운 기능 및 개념들이 많이 추가되었다. 
오라클을 처음 관리했을 때는 필자 역시 초보였고 뭐하나 작업을 하기 위해서는 명령문을 제대로 쓰고 있는가 하고 몇 번이고 망설이면서 사용했던 경험들이 많다. 필자의 초기 실수담을 하나 들자면 보통 오라클의 데이터베이스 파일의 확장자가 .dbf이다. 이전 파일 데이터베이스로는, dBASE IV들을 사용했던 경험자들은 알겠지만, 이것 역시 확장자가 dbf이다. 오라클을 몰랐던 필자는 오라클에서 사용했던 dbf 파일이 dBASE IV용 데이터 파일인 줄 알고 ftp로 전송을 시도했던 적이 있다. 물론 그날 전산실은 뒤집어졌음은 두말할 필요도 없다. 
필자의 생각에는 경험 없는 지식은 없다고 본다. 즉 머릿속으로만 기억하는 것은 지식으로써 의미가 반감된다는 것이다. 데이터 모델링, 재난 복구, 데이터베이스 운영 설계 등 생각만으로는 힘든 부분들이 많다. 특히 데이터 모델링 부분은 경험을 바탕으로 한 지식이 뒷받침되어야 한다. 이 글에서는 누구나 쉽게 이해할 수 있는 분야 중에서 재난 복구에 관한 필자의 경험을 통해 문제해결의 실마리를 푸는 각자의 열쇠를 찾기 바란다.

두 가지 순발력 테스트

글을 시작하기 전에 독자들에게 순발력과 관련된 상황문제를 제시해 보겠다. 5분이내로 정확하게 해답을 생각해내는 사람이라면 순발력이 좋다고 봐도 괜찮을 것이다.

“B지점의 입고량 좀 알고 싶소”

첫 번째 상황이다. 이것은 SQL문 작성에 관한 것인데 물류 쪽에서 가끔 나올 수 있는 질의다. 제품, 판매, 입고 등 3개의 테이블이 기본으로 주어지고 질의는 다음과 같다.

한 영업소 부장이 2004년 B지점에서 판매된 제품의 현재까지의 입고량을 보고 싶다고 갑자기 요청을 했다. 단순히 데이터만 보여주면 되었기 때문에 단순 조인으로 3개 테이블을 SELECT 작업을 했다. 그런데 이런! 결과가 10분이 지나도 나오지 않는 것이 아닌가? 당장 나온다고 큰소리 치고 시작했는데 10분이 지나고 20분이 지나도 나오지 않는 것이 아닌가? 등에선 땀이 나고 결국 30여분이 지나서야 결과가 나왔다. 그런데 이런 지점 코드가 B가 아니라 A라고 하면서 다시 결과를 보고 싶다고 한다. 이때 여러분은 어떻게 할 것인가? 또 다시 그대로 진행을 하여 30분 동안 기다릴 것인가?

답은 간단하다. 단순 조인 SQL문을 수정한 다음 질의를 하는 것이 낫지 않겠는가? 이제 질의문을 한 번 더 보자. 우리가 보고 싶은 것은 입고 현황이다. 즉 판매 쪽은 단지 판매가 된 제품코드를 얻기 위한 것이다. 그러므로 조금 더 생각을 하면 먼저 ‘2004년 A지점에서 팔린 제품 코드를 얻은 다음 이 코드를 가지고 입고량을 볼 수 있다’고 생각할 수도 있고, ‘2004년에 입고된 제품 중 2004년 A지점의 판매 내용에 있는지 여부를 체크한 다음에 있으면 입고량을 본다’라고도 해석할 수 있다. 이 두 가지의 경우에 따라 사용되는 SQL문이 달라진다. 처음에 제시한 내용에 대한 SQL문은 다음과 같이 나타낼 수 있다. 
<리스트 1>과 <리스트 2>는 서로 다르다. 그리고 맨 처음 생각했던 3개 테이블의 단순 조인과는 또 다르다. 결과는 단순 조인문과 <리스트 1>, <리스트 2>의 결과 값은 같다. 그러나 수행결과 시간에서 차이가 날 것이다. 왜 차이가 날까? 질의문 작성의 원칙은 ‘되도록이면 데이터를 줄여라’, 그리고 ‘필요 없는 조건수행을 하지 마라’이다. <리스트 1>은 데이터를 줄이는 부분에 충실한 것이고 <리스트 2>는 필요 없는 조건 수행을 없앤 것이다.

데이터베이스의 공간 할당

두 번째 상황은 데이터베이스 공간 할당이다. 여러분이 해결할 사항은 다음과 같다.

판매 입력을 배치 작업으로 진행하는 중에 갑자가 더 이상 EXTENTS를 증가할 수 없다는 메시지가 계속 나온다. 추가적으로 100MB짜리 데이터 파일을 추가했지만 같은 메시지가 계속 나온다. 오늘은 월말이고 내일 아침 판매회의 때 이달 말 판매 현황에 대한 보고서를 뽑기 위해서 영업부 직원들이 언제 작업을 할 수 있는지 물어보고 초보 데이터베이스 관리자였던 필자는 여러 방면으로 해결책을 찾아보고 있었다. 여러분들은 어떻게 할 것인가?

이 같은 문제는 데이터베이스 관리자가 겪는 에러 사항 중 가장 일반적인 문제라고 생각한다. 그런데 가끔 증가를 시켰는데도 문제가 계속적으로 발생하는 경우가 종종 있다. 요즘 버전에서도 가끔 일어나는데 우리가 아무 의미 없이 사용한 옵션 하나가 이러한 문제의 원인이다. 오라클에서는 ‘EXTENT는 연속된 공간의 세그먼트의 집합’이라고 한다. 이것을 기억하기 바란다. 예전에 필자가 겪었던 문제의 하나인데 디스크가 비쌌던 시절 ‘EXTENT 증가실패’ 메시지가 나와서 필자는 흔히 하는 방식대로 ‘ALTER TABLESPACE ADD .. ;’ 명령을 사용하여 증가를 시켰다. 사이즈는 100MB를 주었다. 그런데 동일 메시지가 발생을 했다. 이상하게도 전체적인 테이블스페이스 사용률도 70% 정도 밖에 안 되고 데이터 파일도 추가시켜 주었는데 발생을 했다. 여러분들은 어떤 측면으로 볼 것인가? 필자가 앞에서 했던 말 중 연속된 공간이라는 것을 떠올리면 답이 나올 수 있을 것이다. 그리고 EXTENT 증가시 그 크기를 어떻게 정하는지도 생각을 해라. 문제의 테이블 SALE이란 테이블의 PCTINCREASE 값이 기본 값인 50%로 되어 있었던 것이다. 그래서 EXTENT가 증가할 때마다 그전 크기의 50%만큼 계속 증가되어 최종적으로 약 80MB 정도가 마지막 EXTENT 크기가 된 것이다. 다음 EXTENTS의 크기는 ‘80+ 80*0.5= 120MB’가 되어서 새롭게 추가시킨 100MB로는 어림도 없었던 것이다. 그리고 전체 공간에서 30% 정도의 FREE 영역이 있다 해도 그것이 연속된 FREE 공간이라는 확신은 없다. 그래서 그 이후부터는 어떤 일이 있어도 PCTINCREASE 값은 0으로 설정한다. 
앞의 두 가지 상황에서 여러분들은 다른 선택을 했을지도 모른다. 그러나 문제를 어떤 방향으로 해석하느냐가 얼마나 중요한가를 느꼈을 것이며, 우리가 미처 인식하지 못했던 부분에서 나올 수도 있다는 사실이다. 항상 표면상의 문제뿐만 아니라 그 속에 숨어 있는 뜻을 알고자 하는 노력이 필요하다는 것을 필자는 두 가지 상황을 예로 들어 얘기하고 싶었던 것이고, 이제부터 필자가 쓰고자 하는 내용은 이러한 조그마한 지식이 어떻게 최악의 상황에서 필자를 구원했는지 이야기하려는 것이다.

최악의 상황은 예고 없이 찾아온다

지난 1999년쯤에 발생한 일이다. 필자는 전산실 데이터베이스 관리자로 근무하고 있었고, 그날은 일요일이어서 직접 회사 당직근무를 하고 있는데, 갑자기 영업부에서 회의 자료를 출력하는데 오류가 나온다는 것이다. 난 프로그램의 순간적인 오류로 생각하고 다시 시도해 보라고 한 다음에 전화를 끊었다. 그런데 이번엔 다른 영업부에서 전화가 왔다. 판매 자료가 조회 중에 갑자기 나오지 않는다는 것이다. 필자는 설마 데이터베이스가 어떻게 될 것이라고는 생각하지도 못한 상황에서 서버실로 들어가 보았다. 그 당시 필자의 회사는 다른 곳으로 이전하기 위해서 잠시 서버를 다른 곳에 옮겨둔 상태였기 때문에 서버 상태를 보기 위해서는 직접 그곳에 가야 했다. 서버실에 들어서니 상황이 생각했던 것보다 심각하다는 느낌을 받았다. 서버의 디스크에서는 소리가 ‘킥킥’하고 들렸던 것이다. 설마 디스크가? 그러나 이러한 필자의 생각은 적중했다. 디스크가 완전히 깨진 것이었다. 아침에 서버를 점검할 때에는 이상이 없었는데 한 시간도 안 지나서 디스크가 깨진 소리가 들린 것이었다.

백업은 당신의 수호천사

그 당시 필자의 회사는 백업 시스템이 제대로 갖추어지지 않았다. 데이터베이스 관리자로서 백업은 익스포트만 받았던 필자는 실제 물리적인 디스크에서 오류가 나자 복구할 수 있는 방법이 생각나지 않았다(그때 당시 왕 초보 관리자였음을 기억하기 바람). 만일 필자가 아카이브로 운영하고 있었고 백업 데이터 파일이 있었다면 아주 쉽게 복구한 다음 아무 일이 없었다는 듯이 무사히 당직근무를 마쳤을 것이다. 그러나 백업받은 데이터 파일은 한 달 전 파일이었고 더 큰 문제는 익스포트 백업은 테이프 이상으로 인해 복구가 불가능한 상태가 된 것이다. 백업도 없는 상황에서, 그리고 데이터베이스는 오픈되지 않는 상태에서 어떻게 한 달간의 자료를 살릴 것인가? 
그래서 필자는 항상 데이터베이스 관리자에게 당부하는 것이 백업이다. 흔히 하는 말로 “복구에 실패한 관리자는 용서할 수 있어도 백업에 실패한 관리자는 용서할 수 없다”는 말이 있다. 백업은 최대로 보수적으로 봐야 한다. 그 이유는 하드웨어라는 것들은 바로 몇 분 후에 무슨 일이 생길지 모르는 매체이기 때문이다. 테이프도 깨질 수 있고 백업 스토리지도 언제든지 망가질 수도 있다는 것을 초보 데이터베이스 관리자는 명심하기 바란다. 물론 최근의 장비들이 신뢰도가 높다고 하지만 가능성이 0%가 아니기 때문이다. 
사실 오라클에서는 데이터 파일에서 직접 데이터를 끄집어낼 수 있는 DUL(Data UnLoader)을 사용하여 깨지는 않는 데이터 파일에서 데이터를 복구할 수는 있겠지만 사실 당시에는 DUL이란 것이 있는지도 몰랐고 서비스 비용도 만만치 않은 이유도 있긴 하다.

침착한 대처는 좀 더 나은 상황을 만든다

우선 필자는 디스크 복구 여부를 확인하기 위해서 하드웨어 업체를 불렀고(물론 공유일이었으므로 서비스료를 지불했다. 당시 시간당 17만원으로 기억한다. 서비스료 산정은 다 알다시피 해당 엔지니어가 출발하는 시간부터 산출된다) 결과는 복구불능으로 파악되었다. 좀 더 복구와 관계된 조치를 하기 위해서는 미국으로 보내야 했고 기간은 한 달이 소요된다고 했다. 그러나 이 방법은 현재 상황에서는 불가능한 선택이었다. 그 이유는 바로 내일 아침에 바로 서비스가 되어야 했는데 한 달 동안 기다릴 수도 없었고 결과 또한 비관적이었기 때문이다. 그리고 깨진 디스크에 있는 데이터도 판매 데이터가 있는 디스크였기 때문에 한 달 전 자료가 있으므로, 필자는 마음을 비우고 한 달 동안의 판매 데이터를 수작업으로 입력하는 최악의 경우를 생각하고 조치방법을 생각했다. 
우선 데이터베이스를 정상적으로 오픈시켜야 했다. 오라클 관리자들은 알겠지만 No Archive Log 상태에서 데이터 파일이 깨졌을 경우에는 복구 자체가 되지 않는다. 필자는 우선 문제가 되는 데이터 파일을 offlline drop 옵션을 사용하여 오픈시켰다(<화면 1>). 또한 No Archive Log 상태로 운영 중인 데이터베이스는 offline만의 옵션으로 수행되지 않는다. 그리고 offline drop 옵션을 사용하면 해당 데이터 파일은 해당 데이터베이스에서는 영원히 사용하지 못한다.

<화면 1> OFFLINE DROP 옵션 사용 후 데이터베이스 오픈 


이때 필자의 머리에 한 가지 생각이 스치고 지나갔다(여기서부터는 약간의 데이터베이스 지식이 필요하다). 오라클 데이터베이스의 경우 하나의 테이블 스페이스에 여러 개의 데이터 파일이 존재할 수 있다. 처음에 설정한 데이터 파일이 모두 사용되면 또 다른 데이터 파일을 추가함으로써 결과적으로 하나의 테이블 스페이스에 여러 개의 데이터 파일이 존재하게 된다. 
문제의 판매용 테이블 스페이스는 4개의 데이터 파일로 구성된 것이었는데 그 중 하나가 깨진 디스크에 존재했고 이 데이터 파일을 offline drop 옵션을 사용해서 데이터베이스를 오픈시킨 것이다(<그림 1>). 필자는 그러면 안 깨진 데이터 파일에서 최근의 판매 데이터를 가지고 올 수 있는 방법이 있지 않을까 생각한 것이다.

<그림 1> OFFLINE된 데이터 파일 


그러면 해당 데이터가 어떤 데이터 파일에 있는지 알아야 하는데 이때 사용하는 것이 ROWID이다. 오라클에서는 하나의 row를 유일하게 구분하는 키 값이 ROWID이며 이 값의 포맷은 버전별로 약간 다르지만 오라클8 ROWID 포맷에 대해서는 다음의 <그림 2>에 나와 있다.

<그림 2> ROWID 포맷 


ROWID 값으로 해당 데이터가 어느 파일의 어느 블럭에 있는지 알 수 있는 것이다. 문제는 보통 테이블을 SELECT 작업을 해야 하는데 <화면 2>와 같은 에러가 나올 것이다. 이것을 보면 모든 데이터의 ROWID 값을 알기 위해서는 TABLE FULL SCAN을 해야 하는데 FULL SCAN을 하는 순간 ORA-00376 에러가 나온다는 것이다.

<화면 2> FULL SCAN시 에러 발생(ORA-00376) 


참고로 데이터가 어느 데이터 파일에 있는지 확인할 수 있는 명령문을 보면 다음과 같다. 우선 데이터 파일의 상대적인 파일 번호를 우선 알아야 되며, 해당 데이터의 ROWID에서 상대적 파일 번호를 찾아내어 비교하면 된다.

<화면 3> 상대적인 FILE 번호 


<화면 4> 상대적인 FILE 번호 


<화면 3>과 <화면 4>에서와 같이 해당 테이블 스페이스 TEST는 4개의 파일에 분포되어 있고 실제 데이터도 4개의 파일에 분포되어 있다는 것이 확인됐다(앞의 결과는 데이터 파일이 깨지기 전이므로 <화면 4>의 결과가 제대로 나온 것이다). <화면 4>에서 조건절에서 적절한 조건 값을 주면 조건 값에 맞는 데이터가 어느 데이터 파일에 있는지 나올 것이다. 
그러면 모든 데이터에 대한 ROWID도 알 수 없는 상황에서 어떻게 복구할 수 있을까? 해결책은 깨진 디스크에 있는 데이터 파일이 해당 테이블 스페이스에서 가장 먼저 만들어진 파일이라는 것에 힌트를 얻을 수 있다. 그리고 해당 테이블을 SELECT할 때는 이미 만들어져 있는 INDEX를 통해 SELECT를 해야 한다는 점, 이 두 가지를 기억해야 한다. 가장 먼저 만들어진 파일이라면 오래된 자료가 있을 가능성이 가장 높고 INDEX SCAN을 통해 최근의 데이터 중심으로 SELECT를 하면 정상적인 데이터를 얻을 수 있다. 필자의 경우에는 우선적으로 최근의 판매 데이터만을 얻으면 최상의 결론이었기 때문에 혹시 하는 생각으로 인덱스로 잡혀 있는 판매일자를 최근 한 달 것으로 SELECT를 해보았다. 결과는 대성공으로, 데이터를 가지고 올 수 있었다. 그때의 기분은 하늘을 날아갈 듯이 기뻤다. 왜냐하면 필자의 생각대로 진행이 되었기 때문이다. 이때가 개인적으로 하나의 도약을 할 수 있었던 상황으로 생각된다. 최악의 경우 수작업 입력을 생각했는데, 무작정 안 될 것이라고 포기하지 않고 데이터베이스의 기본적인 구조를 이해한 상태에서 적절한 조치를 통해 데이터를 복구할 수 있었던 것이다.

<화면 5>와 <화면 6>은 FULL SCAN과 INDEX SCAN의 차이를 극명하게 보여준다. 
<화면 5>와 <화면 6>에서와 같이 인덱스를 통한 데이터 SELECT 작업은 오류 없이 TRACE 결과를 보여주지만 해당 테이블을 FULL SCAN하는 경우에는 데이터 파일에 문제가 있기 때문에 ORA-376 에러가 난다.

<화면 5> INDEX SCAN 


<화면 6> FULL SCAN 


<그림 3> INDEX SCAN 원리 


사실 INDEX SCAN 원리(<그림 3>)는 초보 데이터베이스 관리자라도 모두 알 것이다. 그러나 중요한 요소는 그것을 적용시키는 순발력과 평상심일 것이다. 보통 당황하면 아는 것도 까먹는 경우가 많다. 특히 대안이 마땅하지 않는 경우에는 더욱 그럴 것이다. 그러나 모든 일이 대안이 없는 경우는 없다. 최악의 대안도 해법이 될 수 있기 때문이다. 그러므로 초보 데이터베이스 관리자에게 필자가 얘기하는 것은 우리가 의미 없이 지나가는 지식도 이런 상황에서는 아주 최선의 해결책이 될 수 있다는 것이다. “개똥도 약에 쓰려면 없다”는 말이 있는데 아주 흔해빠진 것이라도 정작 쓰려고 하려면 없다는 뜻이다. INDEX SCAN과 FULL SCAN은 데이터베이스에서의 아주 기본적인 개념이다. 이것을 정확히 이해하고 쓴다면 관리적인 차원에서도 많은 도움이 될 것이다. 필자도 처음부터 모든 것을 다 아는 것은 아니었고 기초적인 내용에 충실한 결과 현재가 있다고 생각한다.

기본에 충실하기 위한 생각

필자가 얘기하고 싶은 것은 항상 기본에 충실하고 아는 것도 다시 한번 보라는 것을 얘기하고 싶다. 사실 우리가 대부분의 업무에서 사용하고 있는 것은 아주 특별하고 어려운 기술을 사용하는 것이 아니고 일반적이고 쉬운 부분을 중심으로 이용한다. 이러한 일반적인 것을 해당 데이터베이스 시스템에 최선의 방안으로 선택하고 이용하는 것은 관리자의 몫이란 생각이 든다. 그리고 필자의 미숙한 글을 읽어준 사람들에게 감사를 드린다.


출처 : 마이크로소프트웨어 [2004년 11월호]

728x90

'용어' 카테고리의 다른 글

DBMS의 종류  (0) 2010.01.04
OLE DB에 대한 이야기  (0) 2009.12.17
아카이빙(Archiving) 과 백업(Backup) 의 차이점  (0) 2009.11.12
DBA란?  (0) 2009.07.08
아직도 UTF-8을 안 쓰십니까?  (0) 2009.07.08
728x90

http://cafe.naver.com/prodba/2040

728x90

'용어' 카테고리의 다른 글

DBMS의 종류  (0) 2010.01.04
OLE DB에 대한 이야기  (0) 2009.12.17
아카이빙(Archiving) 과 백업(Backup) 의 차이점  (0) 2009.11.12
당신도 데이터베이스 관리자인가요?  (0) 2009.07.08
아직도 UTF-8을 안 쓰십니까?  (0) 2009.07.08

+ Recent posts