Oracle Instant Client 파일
-> 공유 스토리지(PVC)에 배치
-> CAS / Compute 파드에 마운트
-> ORACLE_HOME · LD_LIBRARY_PATH · TNS_ADMIN 설정
-> tnsnames.ora / sqlnet.ora 인식
-> CAS / Compute 재기동
-> CASLIB 또는 LIBNAME 으로 접속
고객사에서 "Oracle Client" 를 받으면 runInstaller.sh 가 들어 있는 정식 설치 패키지인 경우가 있다.
addLangs.sh
attachHome.sh
oraparams.ini
runInstaller.sh
이것은 VM 이나 물리 서버에 root 권한으로 설치하는 Full Client 이고 Kubernetes 환경에서는 쓸 수 없다. 컨테이너에서 설치 프로그램을 돌릴 수 없고, Oracle inventory 는 파드가 재시작되면 사라진다.
Viya 4 에 필요한 것은 압축만 풀면 되는 Oracle Instant Client 다.
instantclient_19_29/
├─ libclntsh.so.19.1
├─ libocci.so.19.1
├─ ojdbc8.jar
├─ ucp.jar
└─ network/admin/
고객사에 요청할 때는 다음과 같이 특정한다.
Oracle Instant Client (Linux x86_64, DB 버전과 호환되는 릴리스)
- instantclient-basic 또는 basiclite (zip 또는 rpm)
- sqlplus 가 필요하면 instantclient-sqlplus 추가
Instant Client 만으로는 접속이 되지 않는다. 실무에서 가장 자주 빠지는 항목들이다.
| 항목 | 비고 |
|---|---|
tnsnames.ora |
TNS alias 방식을 쓰면 사실상 필수 |
sqlnet.ora |
보안 정책이 있는 환경이면 필수 |
Oracle Wallet(cwallet.sso, ewallet.p12) |
TCPS 를 쓰면 필수. 없으면 ORA-28759 · ORA-29024 가 난다 |
| 접속 정보 | HOST · PORT · SERVICE_NAME(또는 SID) · 계정 |
| 권한 | 읽기만이면 SELECT, CAS 가 테이블을 만든다면 CREATE TABLE · CREATE VIEW |
| 방화벽 | Viya 노드에서 DB 로 나가는 outbound 허용. SCAN·VIP 주소 확인 |
| 문자셋 · 타임존 | NLS_CHARACTERSET 확인. Viya 쪽은 UTF-8 이 기본 |
ojdbc8.jar 또는 ojdbc11.jar |
JDBC 를 쓰는 구성 요소가 있을 때 |
받은 Instant Client 의 network/admin 에 README 만 들어 있는 상태라면 tnsnames.ora 가 없다는 뜻이고, 그대로 쓰면 ORA-12154 가 난다.
| 방식 | 가부 |
|---|---|
| PVC(NFS 등) | 권장. 용량이 크고 여러 파드가 공유한다 |
| ConfigMap | 바이너리를 담을 수 없다 |
| Secret | 용량 제한이 있다 |
| 이미지에 bake | 업그레이드마다 다시 만들어야 하므로 권장하지 않는다 |
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: oracle-client-pvc
namespace: <namespace>
spec:
accessModes:
- ReadOnlyMany
resources:
requests:
storage: 5Gi
storageClassName: <nfs-storage-class>
SAS 가 의도한 access client 경로를 그대로 쓰면 이후 설정이 간결해진다.
/opt/sas/share/access-clients/oracle/instantclient_19_29
CAS 와 Compute 둘 다 패치해야 한다. 한쪽만 하면 "CAS 는 되는데 Compute 는 안 된다" 는 상태가 된다.
apiVersion: builtin
kind: PatchTransformer
metadata:
name: cas-oracle-client
patch: |-
- op: add
path: /spec/controllerTemplate/spec/volumes/-
value:
name: oracle-client
persistentVolumeClaim:
claimName: oracle-client-pvc
- op: add
path: /spec/controllerTemplate/spec/containers/0/volumeMounts/-
value:
name: oracle-client
mountPath: /opt/sas/share/access-clients/oracle
readOnly: true
target:
kind: CASDeployment
Compute 쪽은 sas-compute-job-config PodTemplate 을 대상으로 같은 내용을 적용한다. 컨테이너 인덱스는 실제 구조를 확인하고 정한다.
SAS/ACCESS 엔진들이 공통으로 읽는 설정은 sas-access 관련 ConfigMap 에 모여 있다. Deployment 의 env 에만 넣으면 일부 서비스가 인식하지 못하는 경우가 있으므로 이 경로를 쓰는 편이 안전하다.
ORACLE_HOME=/opt/sas/share/access-clients/oracle/instantclient_19_29
LD_LIBRARY_PATH=/opt/sas/share/access-clients/oracle/instantclient_19_29
TNS_ADMIN=/opt/sas/share/access-clients/oracle/instantclient_19_29/network/admin
NLS_LANG=KOREAN_KOREA.AL32UTF8
TZ=Asia/Seoul
configMapGenerator:
- name: sas-access-config
behavior: merge
files:
- site-config/sas-access/sas-access.properties
ConfigMap 이름과 파일 이름은 릴리스마다 다를 수 있으므로 현재 파드가 참조하는 이름을 먼저 확인한다 (확인 필요).
kubectl get cm -n <namespace> | grep access
kubectl describe pod -n <namespace> <compute-pod> | grep sas-access-config
ConfigMap 만 바꾸면 이미 떠 있는 파드는 바뀌지 않는다.
kubectl -n <namespace> rollout restart deployment sas-compute
kubectl -n <namespace> delete pod -l app.kubernetes.io/name=sas-cas
kubectl exec -it -n <namespace> <cas-controller-pod> -- bash
env | grep -E 'ORACLE_HOME|LD_LIBRARY_PATH|TNS_ADMIN'
ls $ORACLE_HOME
cat $TNS_ADMIN/tnsnames.ora
nc -zv <db-host> 1521
Viya 4 에는 라이브러리가 두 종류 있고 쓰임새가 다르다.
| 구분 | 용도 |
|---|---|
| CASLIB | CAS 인메모리 분석. Visual Analytics 와 대용량 분석에 필요하다 |
| LIBNAME (Compute) | 배치 프로그램, PROC SQL 등 디스크 기반 작업 |
caslib ORA_CAS datasource=(
srctype="oracle",
username="<db-user>",
password="${PASSWORD}",
path="<tns-alias>"
);
proc casutil;
list caslibs;
load casdata="EMP" incaslib="ORA_CAS" outcaslib="CASUSER" casout="emp" replace;
quit;
libname oradb oracle
user=<db-user>
password="${PASSWORD}"
path=<tns-alias>;
proc sql;
select * from oradb.emp(obs=10);
quit;
TNS 없이 붙일 때는 EZCONNECT 형식을 쓴다. 다만 보안 정책이 강한 환경에서는 막혀 있는 경우가 많다.
libname oradb oracle
user=<db-user>
password="${PASSWORD}"
path="//<db-host>:1521/<service-name>";
Visual Analytics 에서 데이터를 고르려면 CASLIB 이어야 한다. LIBNAME 만 잡으면 VA 목록에 나오지 않는다.
| 증상 | 원인 |
|---|---|
libclntsh.so not found |
LD_LIBRARY_PATH 누락 |
| ORA-12154 | TNS_ADMIN 경로 또는 tnsnames.ora 의 alias 불일치 |
| ORA-12514 | SERVICE_NAME 오기, PDB 미오픈, 리스너 구성 |
| CAS 는 되는데 Compute 는 안 됨 | Compute 쪽 패치 누락 |
| 업그레이드 후 설정이 사라짐 | sas-bases 를 직접 수정했다 |
| CASLIB 생성은 되는데 load 실패 | Oracle 계정 권한 부족 |