반응형

Oracle Client 를 처음으로 설치해보았다.

요즘에는 Oracle이 없어지는 추세이긴 하나, 그래도 DB 공부를 위하여 설치하였다. 

 

우선 Oracle Client가 왜 필요한지부터 알아 보았다.

Oracle Client 가 필요한 이유는 DB 서버에 접근하기 위함이다.

보통은 AP서버 (Application 서버) 와 DB서버(DBMS가 설치되어있는 서버) 가 분리되어 있기 때문에 서로 연결하기 위해서는 이 Oracle Client 가 필요하다. (큰 회사일수록 AP 서버와 DB 서버는 분리되어있었다.)

필요한 이유와 DB의 구조에 대해서는 아주 잘 정리되어있는 글을 첨부한다.

 

참고 : https://loosie.tistory.com/506

 

DB 동작과정을 이해해보자 (애플리케이션과 DB 커넥션)

DB 동작과정 살펴보기 이 글은 오라클 기준으로 작성하였다. 애플리케이션에서 오라클로의 커넥션 과정의 이해가 필요한 이유는 애플리케이션에서 접속하는 것을 최적화하는 것만으로도 DB의

loosie.tistory.com

따라서 Oracle Client가 필요하고 대부분은 linux 를 사용할 것이기 때문에 OS는 linux 용으로 설치하였다. 

필자의 Oracle 버전은 12.2 버전이였다. 

버전확인을 위한 명령어를 아래에 적는다.

select * from v$version

버전 확인이 끝났다면 해당 버전의 Oracle Client 를 설치한다.

12.2 버전이였으므로 12.2 버전에 해당하는 Oracle Client를 다운받았다.

Oracle Client 버전이 DB 버전보다 낮은건 호환이 잘 될테지만, Oracle Client 버전이 더 높다면 호환이 잘 안될 가능성이 높다. 따라서 버전은 그냥 맞춘다고 외우면 될 것 같다.

rpm 파일로 받아도 된다. rpm으로 받을 경우 rpm 작업으로 설치가 가능하다. 

그러나 필자는 root 로 설치를 하지 않고 경로도 default 값으로 셋팅을 하지 않기 위하여 .zip 파일로 받았다.

다운을 받은 항목은 다음과 같다.

  • instantclient-basic-linux.x64-12.2.0.1.0.zip
  • instantclient-sqlplus-linux.x64-12.2.0.1.0.zip
  • instantclient-sdk-linux.x64-12.2.0.1.0.zip
  • instantclient-precomp-linux.x64-12.2.0.1.0.zip

precomp 를 제외하고 3개만 있어도 괜찮다.

필자가 precomp를 다운받은 이유는 소스를 빌드하기 위함이다.

당연한 얘기지만 Proc 로 개발이된 소스들은 *.h 파일들이 존재해야 빌드가 가능하다. 따라서 precomp 파일도 필요하다.

따라서 설치해놓는 것이 좋다.

 

이제 Ap서버 (Application 서버) 에 해당 *.zip 파일들을 모두 배포한다. (Filezilla , Winscp 등으로 배포)

설치할 계정으로 접속하여 zip 파일을 모두 푼다.

위와같이 나오게 된다. 

이제 실행할 계정의 .bash_profile 에 환경변수를 물려준다. ( 로그인 시 계속 환경변수가 적용되어야 함으로 .bash_profile 에 적용 )

export ORACLE_HOME=/home/dbms/instantclient_12_2
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PATH
export NLS_LANG=KOREAN_KOREA.AL32UTF8

적용이 완료되었다면 이제 마지막 단계이다.

tnsnames.ora 를 생성하여 설정하여준다.

tnsnames.ora 는 연결할 DB 서버의 정보들을 넣는 것이다. (ip, port, sid) 

"DBNAME" =
	(DESCRIPTION = 
   		(ADDRESS = (PROTOCOL = TCP) (HOST = "X.X.X.X") (PORT = "port번호"))
		(CONNECT_DATA =
			(SERVER = DEDICATED)
			(SERVICE_NAME = "sid")
		)
	)

"" 가 있는 부분들을 전부 기입하여 넣으면 된다. ("" 는 지우면된다)

이 tnsnames.ora는 아무곳에다 넣어도 된다. 왜냐하면 TNS_ADMIN 이라는 환경변수를 만들어서 넣어줄거라서 명시하면 해주면 된다.

필자는 tnsnames.ora 파일을 생성 후 /home/dbms에 놓았다.

이제 .bash_profile에 맨 밑부분에 아래 항목을 추가해 준다.

export TNS_ADMIN=/home/dbms

이제 .bash_profile 을 다시 물린다. 

# 1번 방법
cd ~; source .bash_profile
# 2번 방법
cd ~; . .bash_profile
# 3번 방법
# 재기동한다.

안될 경우 .bash_profile 이 홈디렉토리 밑에 없는 것이니 위치 잘 이동하길 바란다.

이후 sqlplus 를 실행하면 잘 작동 될 것이다.

sqlplus 계정/password@sid이름

위와 같이 접속해서 접속이 잘 되는지 확인하면 된다.

반응형
반응형

esxi 에서 서버의 디스크를 증설하였고, 그 마지막 단계에서 xfs_grow 에서 error 가 났다.

디스크 증설 도중에 아래와 같은 에러가 났다.

$ xfs_growfs /dev/mapper/centos-home
xfs_growfs: /dev/mapper/centos-home is not a mounted XFS filesystem

 

/dev/mapper/centos-home 이 XFS 파일시스템으로 마운트되지 않았다는 얘기였다...

cat /etc/fstab 으로 확인해보니 /dev/mapper/centos-root 가 XFS로 되어있었다. 정확한 mount 포인트가 아니였다.

정확한 mount 포인트를 설정해주어야 가능했다. centos-home 의 경우에는 마운트포인트가 '/' 였기 때문에 그 전과정까지는 centos-root 에 할당이 잘 되었던것같다. (lsblk 명령어 수행시 정상적으로 보인 이유) 

xfs_growfs /

위와 같이 명령어 수행시 정상적으로 수행되었다. 

 

*) 추측이 맞다면 xfs_growfs /dev/mapper/centos-root 로도 정상적으로 작동 될것같다. 안된다면 디스크 증설작업에서 lvextend 명령어에서도 /dev/mapper/centos-home 으로 설정이 되어서 그랬을것 같다... 다시 초기화하고 설정해야할듯싶다.

반응형
반응형

notion 에서 memaid 작성 시에 짤리는 현상이 있다.

위와 같이 밑에부분이 짤리는 현상이 있다.

그럴때는 해당 영역에 `` 를 붙혀주면 된다.

func_2 부분에 " " 안에 `` 를 넣어 표시해주니 바뀐 것을 알 수 있다.

반응형
반응형

컴파일 시 warning

아래와 같은 warning 이 발생하였다.

warning: ‘%s’ directive writing up to 255 bytes into a region of size between 192 and 255 [-Wformat-overflow=]

해당 warning은 버퍼오버 플로우를 방지하라는 warning 이다.

이유는 담을 변수의 사이즈가 더 작거나 같거나 할때 나타는 warning 이다.

예시로는 아래와 같은 상황이다.

ex) 
char buf[5];
long a = 10000000;
sprintf( buf, "%d", a )

결국엔 buf의 사이즈보다 더 큰 상황이 올 것이고, 버퍼오버플로우가 날 것이다.

이 부분을 방지하는 것이다.

 

참고 : https://stackoverflow.com/questions/51697753/how-to-suppress-sprintf-warning-directive-writing-between-1-and-11-bytes-into

반응형
반응형

스트림 (stream)

직역하면 흐르다 인데, 원래는 물이 흐르는 시냇물을 의미한다.

컴퓨터에서는 데이터의 흐름으로 말한다. 즉, 데이터가 바이트이기에 바이트의 흐름이다.

흐르기 위해서는 통로가 필요하기때문에 통로라고도 부른다.

컴퓨터에서 스트림
: 데이터의 이동 통로 혹은 바이트의 흐름

linux 에서 스트림은 network 를 연결할 때, device 를 연결할 때 process 끼리 소통할 때 사용된다. 

 

linux 는 파일로 모든 것이 이루어져 있기 때문에 파일에 관한 시스템 콜인 open, close, read, write 가 stream 을 다루는 함수가 된다. open 함수는 fd 값을 반환시키는데, fd가 바로 스트림이 된다. (fd 가 파일을 연결시켜주는 통로가 되기 때문에) 

int open(const char* path, int flags, mode_t mode)

 return 값이 int 형인 fd 가 된다. 즉 스트림을 만들어주는 함수가 이 open 함수가 되는 것이다. 

그렇게 fd (stream) 을 받았으면 그 스트림에 데이터를 흘려 보낸다. 어떻게? write 함수로 

ssize_t write(int fd, const *buf, size_t bufsize)

이게 write (스트림, 보낼 데이터, 보낼 데이터의 크기) 가 되는 것이다.

받는 쪽에서는 read 로 읽는다.

ssize_t read (int fd, void *buf, size_t bufsize)

read (스트림, 읽을 데이터, 읽을 데이터의 크기) 가 된다.

 

close의 경우 스트림을 닫는 역할을 한다. 

int close(int fd)
반응형
반응형

ssd mount  도중나온 error 메세지

mount: /datfs: unknown filesystem type 'ntfs'.

 

ntfs 의 파일시스템 타입이 없다...

당연히 nfs 를 설치를 안하여 나오는 현상이였으나 순간 당황하였다...

 

nfs 를 설치를 하자!!

아래와 같이 설치하면 된다.

# 확인 명령어
rpm -qa | grep nfs

# 결과값이 없을 경우 설치
# 아래 명령어로 설치할수있는 패키지 확인
yum search nfs 

# 그 중에 nfs-utils.x86_64 설치 (nfs-util을 설치하면 된다. 그 뒤는 각자 설정에 따라)
yum install -y nfs-utils.x86_64

이후 mount 시 정상작동 된다!! 

반응형
반응형

esxi 의 경우 다른 물리적인 장비와 nfs 연결 시에 ip가 다르다. 

따라서 /etc/exports 에서 esxi 에서 vm 생성시 고정 ip 가 아닌 외부로 나가는 ip로 nfs가 연결될 때 해당 error 가 난다.

( ※ No route to host 가 날 수도 있는데 이 error 도 똑같이 조치해보자) 

따라서 /etc/exports 부분에 모든 ip에 대해서 허용하던지 아니면 esxi 의 물리적 nic 의 ip를 허용해주던지 해야한다.

# /etc/exports
# 모든 ip에 대해 허용한다.
/test *(rw,no_root_squash,async)

 

위와 같이 esxi 가 아닌 경우에 할 수 있는 조치는 다음과 같다.

1. nfs 재기동

# nfs 재기동
systemctl restart nfs-server
# nfs 상태 확인
systemctl status nfs-server

2. nfs 방화벽 설정 확인

3. nfs 버전 확인

# nfs 버전 확인
cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2
# -는 지원 안함. +는 지원함.
# 해당 버전이 client 와 server 모두 동일한 지

4. selinux 설정 확인 

# selinux 설정 해제 방법
# setenforce 0
# sestatus
반응형
반응형

시스템 콜(System Call) 

시스템 콜은 커널에게 요청하는 함수이다. 

커널은 하드웨어와 소프트웨어를 관리하기 때문에, 커널에게 요청해야 할 수 있는 작업들을 하기 위해서 사용하는 것이 시스템 콜 함수이다.

 

예) 프로세스를 생성한다고 가정한다. (프로세스 생성은 fork 함수로 한다)

fork 함수 사용 시

이렇게 시스템 콜 함수인 fork 함수를 사용하면 커널에게 요청을 하게 되고 커널이 그에 해당하는 작업을 해주는 것이다. 

 

API (Application Programming Interface)

 

프로그래밍을 통해 무언가를 사용할 때 인터페이스이다. 인터페이스란 사용자와 소통하는 창구이다. 맨날 글로만 읽어서 소통하는 창구인지는 알겠으나 와닿는 개념이 아니라서 따로 정리를 해놔야겠다... 음.. 예를 들자면 음식점 직원 같다. 

음식을 어떻게 주문하는 지?, 어떤 음식이 있는 지?, 화장실은 어디있는지? 처음 가는 식당의 경우 잘 알지 못한다. 따라서 그 음식점을 사용하기 위한 창구로 직원과의 소통을 얘기할 수 있을 것 같다. 이런 것들을 인터페이스(Interface)라고 한다. 따라서 커널과 소통하기 위한 함수로 시스템 콜 함수가 있는 것이다. "즉, 커널의 API는 시스템 콜이다" 라고 설명할 수 있고 밑에 사진과 같이 API는 시스템 콜을 포함하는 더 큰 개념이다. 

 

참고 : 모두를 위한 리눅스 프로그래밍 / 아오키 미네로 / 제이펍 출판사

반응형

+ Recent posts