레거시

오래된 프로젝트 복원 -1-

Drider 2026. 6. 16. 00:25

※본 블로그의 내용은 프로젝트 복원 학습을 위한 가상의 시나리오 입니다.

 

 

코더 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