※본 블로그의 내용은 프로젝트 복원 학습을 위한 가상의 시나리오 입니다.
코더 k는 10여 년 전에 자신이 안 친한 동생들과 진행하던 낡은 프로젝트를 떠올렸다.
"그래도 낭만이 있었지. 그 프로젝트......."
그 생각으로 시작된 해당 프로젝트 복원하기 작업.
일단 k는 해당 프로젝트의 데이터베이스를 복원하기로 했다.
1.Oracle 11g SE 로컬 DB 구축 삽질기 + 시스템 프로젝트 분석
> 작성일: 2026-06-15
> 프로젝트: 추억의 관리시스템
> DB 환경: Oracle 11g XE (기존) → Oracle 11g SE (신규 설치)
서론: 왜 이런 일을 시작했나?
"낭만."
프로젝트는 관리시스템으로, 크게 세 가지로 나뉜다:
| 프로젝트 | 설명 |
| --------------- | ---------------------------- |
| XX | 내부자 관리시스템 |
| XXX | 외부 공개용 웹사이트 |
| XXXX | XXX의 확장 버전 |
문제는 이 시스템들이 국산(상용 DBMS) 기반이었고, 로컬에서 돌리려면 Oracle 11g로 전환이 필요했다는 점.
2. Oracle 11g SE 설치: 첫 번째 관문
k는 그 시절 폐업을 하면서 이 레거시한 디비 아키텍처가 고대 유물적인 가치가 있음을 안타까워 하며 dbf파일을 보존했었다.
-기존 환경
| 항목 | 내용 |
| ------------------| ---------------------------------------------------- |
| 기존 DB | Oracle 11g XE(Express Edition) |
| XE Home | `C:\app\??\product\11.2.0\dbhome_1` |
| XE SID | `ORCL` |
| XE 용량 제한 | 11GB(모자름) |
XE는 11GB 제한이 있어서 수십GB짜리 .dbf 파일들을 연결할 수 없었다.
→ Oracle 11g SE (Standard Edition)을 추가 설치하기로 결정.
-오라클 11g se 설치
이 제품은 무료가 아니다. 그러나 많은 개발자 및 회사가 무료로 쓴다. 이유는 단속을 안 한다.
-오류
> "레지스트리에서 지정된 홈 이름을 찾을 수 없습니다"
기존 XE가 'OraDb11g_home1'을 사용 중이었고, SE가 'OraDb11g_home2'를 추가하려다 충돌이 발생.
해결: '-ignorePrereq' 옵션 + "무시" 버튼 클릭 → 설치 완료.
-인스턴스 생성
→ "인스턴스가 생성되었습니다."
2. 리스너 설정: ORA-12545와의 전쟁
-문제
설치 후 연결을 시도해도 ORA-12545: 대상 호스트 또는 객체가 존재하지 않아 연결에 실패했습니다 오류.
-원인
XE 리스너('C:\app\??\...')는 XE 서비스만 알고 있었다.
SE(추억의 프로젝트명)를 리스너에 등록해줘야 했다.
-해결: listener.ora 수정
-tnsnames.ora에도 '추억' 추가
-접속 방식의 중요성
```
X localhost:1521:추억1 (콜론) → ORA-12545
O localhost:1521/추억1 (슬래시) → 접속 성공!
```
SID(:) vs 서비스 이름(/)의 차이였다.
3. 데이터베이스 생성: 두 번째 관문
INIT추억.ORA 파일 생성
```ini
db_name=추억
db_block_size=8192
sga_target=256M
pga_aggregate_target=64M
control_files='C:\oradata\추억\control01.ctl'
diagnostic_dest='C:\app\oracle'
```
-CREATE DATABASE
```sql
CREATE DATABASE 추억
USER SYS IDENTIFIED BY 그거
USER SYSTEM IDENTIFIED BY 그거
LOGFILE GROUP 1 ('C:\oradata\추억\redo01.log') SIZE 100M, ...
DATAFILE 'C:\oradata\추억1\system01.dbf' SIZE 500M, ...
CHARACTER SET UTF8;
```
→ "데이터베이스가 생성되었습니다"
-카탈로그 설치
```sql
@C:\app\oracle\product\11.2.0\dbhome_1\RDBMS\ADMIN\catalog.sql
```
4. .dbf 파일 연결 대참사
-배경
당시 초보 코더였던 K2는 폐업하기 직전에 디비를 보존하기 위해 프로젝트의 두 개 거대한 .dbf 파일을 떴다.
| 파일 | 크기 | 내용 |
| --------------- | -------- | ----------------------- |
| '추억1.DBF' | 11GB | 추억1 프로젝트 데이터 |
| '추억2.DBF' | 11GB | 추억2/추억2_확장 데이터 |
-문제
경로에 한글이 있었다: `D:\추억\dbf\`
Oracle은 한글 경로를 인식하지 못해 `ORA-01565` 오류 발생.
-실수
1. 파일을 `D:\dbf\`로 복사
2. `CREATE TABLESPACE ... SIZE 11G REUSE` 실행
-REUSE 옵션의 함정
'REUSE' 옵션은 기존 데이터 파일을 새 테이블스페이스로 초기화 한다.
즉, 복사본의 헤더가 덮어써져서 데이터를 읽을 수 없게 되었다.
-진실
다행히 원본 파일 `D:\레가시\dbf\`는 완전히 보존되어 있었다.
초기화된 것은 복사본(`D:\dbf\`)뿐이었다.
-교훈
> 'REUSE' 옵션은 기존 데이터 파일을 초기화한다. 절대 함부로 사용하지 말 것.
원본 데이터가 중요하다면:
1. PRM-DUL 같은 전문 언로더 도구로 데이터 추출 (Non-Dictionary Mode)
2. 또는 원본 파일로 CREATE CONTROLFILE 재시도
5. DB 구조 분석: 숨겨진 보물 찾기
안타깝게도 당시 초보 코더였던 K는 사용자데이터 dbf 파일만 있으면 DB복원이 가능하다고 생각했다.
하지만, ' SYSTEM.DBF와 SYSAUX.DBF'가 없다면. 그것은 아무 소용없다는 것을. 마치, 디바이스 없는 내용만을 보존하는 것 뿐인 것을 몰랐다.
데이터가 날아간 후, 테이블 구조를 복원해야 했다.
폐업할 때 보존해 둔 소스 여기저기를 뒤지던 중...
-발견! SQL DDL 파일들
'D:\레거시\kkk\' 폴더에서 완전한 DB 스크립트 발견. 당시 초보 코더였던 K는 모든 걸 잘 알지는 못한다는 걸 인지하고, 여러가지 방편으로 프로젝트 보존을 시도했던 것이다. 용의주도하군.
| 파일 | 내용 | 크기 |
| ----------------------------------------------------------- | --------------------------------- | -------- |
| `추억1_tables_singlefile.sql` | 추억1 모든 테이블 DDL | 대용량 |
| `추억변종\추억변종_Tables_singlefile.sql` | 추억변종 모든 테이블 DDL | 수천 줄 |
| `추억변종\추억변종_Indexes_singlefile.sql` | 인덱스 | - |
| `추억변종\추억변종_Sequences_singlefile.sql` | 시퀀스 | - |
| `추억변종\추억변종_Views_singlefile.sql` | 뷰 | - |
등
등
등
.
.
.
-추가 발견: INSERT 데이터
'D:\레거시\업무_DB_데이터\' 폴더에서 샘플 데이터 발견:
| 파일 | 내용 |
| -------------------------------------------------------------- | ---------------------------------- |
| '추억변종.추억1_어쩌고 데이터인서트.sql' | 수백 건 |
| `추억변종.추억1_어쩌고LOGIN 데이터인서트.sql' | 로그인 이력 |
| '추억1_권한 데이터인서트.sql' | 권한 정보 |
| '추억변종.어_압축.sql' | 어쩌고번호 데이터 (수 메가) |
-프로젝트 구조 이해
파일들을 분석하며 프로젝트 구조를 완전히 파악했다:
| .dbf | 스키마 | 프로젝트 | 용도 |
| ------------ | --------- | ---------------------- | ------------------- |
| `추억1.DBF` | 추억1 | 추억1 | 내부자 관리시스템 |
| `추억변종.DBF` | 추억변종 | 추억어쩌고 / 추억어쩌고_웹서비스 | 대외 공개용 |
> 추억변종 = 추 + 신 = "시스템 신 버전"
6. 복구 전략
-현재 DB 상태
```
Oracle SE 11g 설치 ok
OracleService추억1 생성 및 실행 ok
리스너 설정 (listener.ora + tnsnames.ora) ok
CREATE DATABASE 추억 ok (UTF8)
추억/추억변종 테이블스페이스 생성 ok
catalog.sql + catproc.sql 설치 ok (VALID)
─────────────────────────────────────
테이블 생성 X (DDL 미실행)
데이터 복구 X (원본 보존, 복구 대기)
```
-남은 작업
```
1. 추억변종_Tables_singlefile.sql 실행 → 추억변종 테이블 생성
2. 추억1_tables_singlefile.sql 실행 → 추억1 테이블 생성
3. 업무_DB_데이터/*.sql 실행 → 샘플 데이터 INSERT
4. 원본 .dbf 파일 → PRM-DUL로 데이터 추출 (선택사항)
```
---
-최종 체크리스트
- [x] Oracle SE 11g 설치 완료
- [x] 리스너 설정 완료
- [x] CREATE DATABASE 성공
- [x] 추억1/추억변종 신 테이블스페이스 생성
- [x] 카탈로그 설치 완료
- [x] DDL 파일 발견 (kkk 폴더)
- [x] INSERT 데이터 발견 (업무 DB 데이터 폴더)
- [ ] DDL 실행 → 테이블 생성
- [ ] 데이터 INSERT
- [ ] 토드 접속 확인
- [ ] 프로젝트 로컬 구동
---
-마무리
월드컵 하일라이트와 함께한 여정이었다.
처음에는 dbf만 믿었지만,
리스너 설정, 데이터베이스 생성, .dbf 파일 연결, 카탈로그 설치,
그리고 대참사(REUSE)까지... 시행착오를 겪었다.
거기에, 근본적으로 달랑 사용자데이터 dbf만 존재한다는 어쩔 수 없는 불가항력을 깨닫고.
안되는가...... 하다가 ddl 스크립트 발견으로 "역시 K군." 했던 일까지.
'레거시' 카테고리의 다른 글
| 오래된 프로젝트 복원 -2- (0) | 2026.06.16 |
|---|---|
| (레거시) StackOverflowError, 순환 참조 오류 (0) | 2025.07.22 |