테마
L3 · ora-dist — 본사 레거시 유통 마스터
포트 1523 · 계정
pup/pup· 크기 약 1GB(실측 세그먼트 0.16GB) · 쓰는 화 03 · 0903화 전에 만든다. 테이블은CF01~CF18의 18개다.
왜 이 컨테이너가 따로 있나 — "진짜 레거시는 이렇게 생겼다"
| 테이블 | 행수 | 성격 |
|---|---|---|
CF11 판매상품 | 1,096,708 | 최대 테이블 |
CF10 판매 | 500,000 | 대용량 |
CF01~CF09, CF12~CF18 | 100 ~ 수만 | 상품·카테고리·거래처·매장·사원·발주·입출고·재고 |
레거시가 실제로 어떻게 생겼는지 여기에 다 있다.
- 날짜가
VARCHAR2(8)컬럼에'YYYYMMDD'문자열로 들어 있다(SLE_DTORD_DTAPL_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파워업/에서) |
|---|---|---|
| 1 | pup 계정(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 |
| 3 | CSV 준비 | 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 *(공개 사이트에는 없음)*에 있다.