데이터베이스 연구실.log

Oracle과 PostgreSQL 연결

oracledb와 psycopg의 동시 접속, 환경 변수 전달과 연결 전 DB 상태 및 접속 오류 점검

python-oracledbpsycopg 3fetch_lobsfetch_decimals환경 변수batStreamlitDPY-6005

#핵심 요약

실습 미니 마이그레이터는 한 스크립트에서 oracledb로 Oracle에, psycopg로 PostgreSQL에 동시에 접속함

실습에서는 이 일을 Python이 맡는 이유로, PL/SQL은 Oracle 안에서만 돌기 때문에 서로 다른 두 DB를 한 번에 다룰 수 없다는 점을 듦

Oracle 접속은 python-oracledb로 Oracle 클라이언트를 따로 설치하지 않고, PostgreSQL 접속은 psycopg 3을 씀

접속값은 실행 bat 파일의 환경 변수(SRC_*, TGT_*)로 넘기고, 이 값이 연결 화면의 기본값이 됨

#개념과 동작 원리

연결 항목 접속 DB 및 라이브러리 실습 계정 권한
소스 Oracle 19c, 서비스 <SERVICE_NAME>, 포트 1521 자기 스키마 읽기만
대상 PostgreSQL 15, DB <DB_NAME>, 포트 5432 스키마, 테이블 생성, DB 소유자

실습에서는 Oracle을 소스 계정으로 읽기만 하고, PostgreSQL에 테이블을 만들고 데이터를 넣는 일은 이행 엔진 파일이 한다고 설명함
화면에서 Oracle 연결 테스트와 PostgreSQL 연결 테스트가 모두 연결됨이면 다음 단계 버튼이 켜짐

oracledb 기본값 두 가지는 4단계 엔진 코드에 있음
fetch_lobs = False는 CLOB, BLOB을 문자열, 바이트로 바로 받고, fetch_decimals = True는 NUMBER를 Decimal로 받아 소수점 손실을 막음
코드는 COPY를 이용한 데이터 적재에 있음

#필수 명령어 또는 SQL

#연결 전 DB 상태 확인

DB 서버 OS (oracle 사용자)현재 세션 설정만 변경함
lsnrctl status | grep -E "^Uptime|<SERVICE_NAME>"
export ORACLE_SID=<SERVICE_NAME>
sqlplus -s / as sysdba <<< "select instance_name, status, database_status from v\$instance;"

결과 해석: 서비스가 status READY, 인스턴스가 OPEN/ACTIVE면 정상임
TNS-12541: no listener면 lsnrctl start, ORA-01034면 startup 후 alter system register;를 실행한다고 실습에서는 적었음
VM을 다시 켜면 리스너와 DB가 자동으로 뜨지 않으니 수업 전에 확인함

DB 서버 OS조회만 함
systemctl is-active postgresql-15
/usr/pgsql-15/bin/pg_isready -h 127.0.0.1 -p 5432

결과 해석: active, 접속을 받는 중이면 정상임
실습에서는 OS 기본 9.2 클라이언트가 먼저 잡히지 않도록 /usr/pgsql-15/bin/ 경로로 실행함

PC PowerShell조회만 함
foreach($p in 1521,5432){ $r = Test-NetConnection <HOST> -Port $p -WarningAction SilentlyContinue; "{0,-5} TcpTestSucceeded : {1}" -f $p, $r.TcpTestSucceeded }

결과 해석: 두 포트 모두 True면 PC에서 DB 서버 포트까지 열려 있음
False면 서버 방화벽(firewall-cmd --list-ports)과 DB 기동 여부를 봄

#접속값을 넘기는 실행 파일

PC (도구 폴더의 run_migrator.bat)현재 세션 설정만 변경함
set SRC_USER=<USERNAME>
set SRC_PASSWORD=<PASSWORD>
set SRC_DSN=<HOST>:1521/<SERVICE_NAME>
set TGT_HOST=<HOST>
set TGT_PORT=5432
set TGT_DB=<DB_NAME>
set TGT_USER=<USERNAME>
set TGT_PASSWORD=<PASSWORD>
if defined CONDA_PREFIX goto run
if exist "%USERPROFILE%\anaconda3\Scripts\activate.bat" (
  call "%USERPROFILE%\anaconda3\Scripts\activate.bat" "%USERPROFILE%\anaconda3"
  goto run
)
:run
python -m streamlit run app.py --server.port 8502

결과 해석: 다른 DB로 옮길 때는 SRC_*, TGT_*만 바꿈
Anaconda Prompt가 아닌 곳에서 더블클릭해도 Anaconda를 찾아 켠 뒤 실행하도록 CONDA_PREFIX를 검사함
실행 뒤 브라우저에서 http://localhost:8502를 엶

#사용 조건과 주의사항

실습 bat은 비밀번호를 파일 안에 평문으로 둠
교육용 VM 기준의 방식이며, 운영 환경에서 같은 방식을 써도 되는지는 기재 없음

Oracle 연결이 DPY-6005 ... Connection refused로 실패하면 리스너와 DB를 다시 띄움

미니 PG 게이지가 8501 포트를 쓰므로 이 도구는 8502를 씀
두 프로그램을 동시에 띄울 수 있음

실습 환경은 예제2(Oracle → PostgreSQL 이행)의 소스 스키마와 타깃 DB를 그대로 쓰고, 대상은 새 스키마로 정해 예제2 결과를 건드리지 않음
예제2의 SQL 방식은 Oracle에서 PostgreSQL로 이행에 있음

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기