Oracle과 PostgreSQL 연결
oracledb와 psycopg의 동시 접속, 환경 변수 전달과 연결 전 DB 상태 및 접속 오류 점검
#핵심 요약
실습 미니 마이그레이터는 한 스크립트에서 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 상태 확인
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가 자동으로 뜨지 않으니 수업 전에 확인함
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/ 경로로 실행함
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 기동 여부를 봄
#접속값을 넘기는 실행 파일
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로 이행에 있음