Skip to content

L3 · ora-dist — 본사 레거시 유통 마스터 ​

포트 1523 · 계정 pup / pup · 크기 약 1GB(실측 세그먼트 0.16GB) · 쓰는 화 03 · 0903화 전에 만든다. 테이블은 CF01~CF18의 18개다.


왜 이 컨테이너가 따로 있나 — "진짜 레거시는 이렇게 생겼다" ​

테이블행수성격
CF11 판매상품1,096,708최대 테이블
CF10 판매500,000대용량
CF01~CF09, CF12~CF18100 ~ 수만상품·카테고리·거래처·매장·사원·발주·입출고·재고

레거시가 실제로 어떻게 생겼는지 여기에 다 있다.

  • 날짜가 VARCHAR2(8) 컬럼에 'YYYYMMDD' 문자열로 들어 있다(SLE_DT ORD_DT APL_DT …). 03화 "인덱스가 원천 봉쇄되는" 사건의 유일한 증거가 바로 이것이다. 한빛유통 신 시스템의 깔끔한 DATE 컬럼으로는 이 문제를 재현할 수 없다. 그래서 이 컨테이너가 따로 있다.
  • 보조 인덱스가 0개다(PK만 있다). 인덱스를 직접 설계해 봐야 한다.
  • 컬럼명과 코드값에 한글이 있고, CSV는 CP949 인코딩이다. 인코딩은 sqlldr 컨트롤 파일이 처리한다.

만들기 ​

1. 기동 ​

bash
launch_ora ora-dist 1523 pup
wait_ora   ora-dist

(launch_ora / wait_ora는 01_첫_고객사_ora-hanorder.md §3 참고)

권한은 따로 줄 필요가 없다. 다음 단계의 01_pup_계정생성.sql이 pup을 지우고 다시 만들면서 측정 권한까지 준다.

2. 데이터 적재 — 오라클SQL파워업/README.md를 그대로, 이름만 바꿔서 ​

그 README는 컨테이너를 하나만 쓰던 시절(oracle-free)에 쓴 문서다. oracle-free는 전부 ora-dist로 바꿔 읽는다. 그 밖에는 다를 게 없다.

절차를 요약하면 다음과 같다(자세한 내용은 README).

단계무엇명령 (Git Bash · 오라클SQL파워업/에서)
1pup 계정(SYS)MSYS_NO_PATHCONV=1 docker exec -i ora-dist sqlplus -s / as sysdba < 01_pup_계정생성.sql
2빈 테이블 18개docker exec -i ora-dist sqlplus -s pup/pup@localhost/FREEPDB1 < 02_테이블생성.sql
3CSV 준비data/data_csv.zip을 같은 data/ 폴더에 압축 해제해 CF01.csv~CF18.csv를 만든다(저장소에는 zip만 있다)
4컨테이너로 복사 + 소유권docker cp data ora-dist:/opt/oracle/pup_data → docker exec -u 0 ora-dist chown -R oracle:oinstall /opt/oracle/pup_data
5적재(컨테이너 안)docker exec -it ora-dist bash → cd /opt/oracle/pup_data && sh load_all.sh pup
6통계 + 검증EXEC DBMS_STATS.GATHER_SCHEMA_STATS('PUP', degree=>4);

⚠️ 4단계의 chown을 빼면 5단계가 SQL*Loader-500 / KUP-04...로 실패한다. docker cp로 들어간 파일은 root 소유인데 sqlldr는 oracle 계정으로 돌기 때문이다. ⚠️ gvenzl 이미지의 오라클 홈은 /opt/oracle이다. /home/oracle로 복사하면 Could not find the file 에러가 난다.

3. 검증 ​

sql
SELECT COUNT(*) FROM cf11;                                   -- 1,096,708
SELECT COUNT(*) FROM cf10;                                   --   500,000
SELECT COUNT(*) FROM user_tables;                            -- 18
SELECT COUNT(*) FROM user_indexes WHERE uniqueness='NONUNIQUE';  -- 0  (보조 인덱스 없음)
SELECT data_type, COUNT(*) FROM user_tab_columns
 WHERE column_name IN ('SLE_DT','ORD_DT','APL_DT','INV_BS_DT','INOUT_DT') GROUP BY data_type;
--  VARCHAR2 만 나와야 한다 — 03화의 전제

안 쓸 때는 끈다 ​

bash
docker stop ora-dist            # 03·09화가 아니면 꺼 둔다

📄 스키마 전체 그림: 오라클SQL파워업/데이터_조감도_ERD_인덱스.md · 컬럼 의미: 오라클SQL파워업/참고_데이터모델_개념.md 📚 데이터 출처: 『오라클 SQL 파워업』(유일환) 실습 CSV. 책의 연습 쿼리 167개는 오라클SQL파워업/03_연습쿼리_해설.sql *(공개 사이트에는 없음)*에 있다.