ORA-27123 : unable to attach to shared memory segment

공유 메모리의 설정

공유 메모리(shared memory)는 프로세스가 공유 메모리 세그먼트를 통해 공통 데이타 구조 및 데이타에 접근할 수 있게 합니다. 공유 메모리는 커널 작업을 수반하지 않으며 프로세스 간의 데이타 복제 작업이 불필요하기 때문에, IPC(inter-process communication)를 위한 가장 빠른 방법으로 선호되고 있습니다.

오라클은 오라클의 백업 및 포어그라운드 프로세스를 위한 공유 메모리 영역으로 Shared Global Area (SGA)를 제공합니다. SGA는 데이타베이스 버퍼 캐시, 공유 SQL, 접근 경로 등의 저장에 활용되므로, SGA 크기의 설정에 따라 오라클의 성능이 크게 달라질 수 있습니다.

공유 메모리 설정을 확인하려면 아래와 같이 명령을 수행합니다:

# ipcs -lm

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 32768
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1

SHMMAX의 설정

SHMMAX매개변수는 공유 메모리 세그먼트의 최대 크기(바이트 단위)를 정의하는데 사용됩니다. 오라클 SGA는 공유 메모리로 구성되며, SHMMAX가 올바르게 설정되지 않은 경우 SGA의 크기가 제약될 수도 있습니다. 따라서 SGA의 크기보다 작지 않도록 SHMMAX를 설정해야 합니다. SHMMAX 매개변수가 잘못 설정된 경우에는 다음과 같은 에러가 발생합니다:

ORA-27123: unable to attach to shared memory segment

SHMMAX 매개변수의 설정값을 확인하려면 아래와 같이 명령을 수행합니다:

# cat /proc/sys/kernel/shmmax
33554432

SHMMAX의 디폴트 값은 32MB입니다. 이 사이즈는 Oracle SGA로 활용하기에는 너무 부족합니다. 필자는 보통 SHMMAX매개변수를 2GB로 설정합니다. 그 방법이 아래와 같습니다:

  • · /proc 파일시스템에 변경사항을 직접 적용하면 서버를 리부팅하지 않고도 SHMMAX 설정을 변경할 수 있습니다.SHMMAX의 값을 다이내믹하게 변경하고 커맨드를 /etc/rc.local 스타트업 파일에 영구적으로 적용하는 방법이 아래와 같습니다:
    # echo "2147483648" > /proc/sys/kernel/shmmax
  • · 또는 sysctl 커맨드를 사용하여 SHMMAX의 값을 변경할 수도 있습니다:
    # sysctl -w kernel.shmmax=2147483648
  • · 마지막으로, /etc/sysctl.conf 스타트업 파일에 커널 매개변수를 추가함으로써 변경 사항을 영구적으로 적용할 수 있습니다:
    # echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf
    

SHMMNI의 설정

SHMMAX 매개변수는 공유 메모리 세그먼트의 최대 숫자를 설정하는데 사용되며, 디폴트 값은 4096입니다. 이 값은 일반적으로 충분하며 변경될 필요가 없습니다.

SHMMNI의 설정값을 확인하는 방법이 아래와 같습니다:

# cat /proc/sys/kernel/shmmni
4096

SHMALL의 설정

마지막으로, SHMALL 커널 매개변수는 특정 시점에 시스템에서 사용 가능한 공유 메모리의 최대 크기(페이지 단위)를 설정하는데 사용됩니다. 따라서 이 매개변수는 최소한 아래 값보다 커야 합니다:

ceil(SHMMAX/PAGE_SIZE)

SHMALL의 디폴트 사이즈는 2097152이며 아래 명령을 통해 조회할 수 있습니다:

# cat /proc/sys/kernel/shmall
2097152

SHMALL의 디폴트 설정값은 이 가이드에서 사용하는 테스트용 Oracle RAC 10g 설치 환경에 충분합니다.

(참고: i386 플랫폼 기반 Red Hat Linux의 페이지 사이즈는 4,096 바이트입니다. bigpages를 이용하면 메모리 페이지의 사이즈를 더 크게 변경할 수도 있습니다.)

Semaphore의 설정

세마포어(semaphore)란 (공유 메모리와 같은) 공유 리소스의 사용 과정에서 프로세스(또는 프로세스 내 쓰레드) 간의 동기화를 위해 사용되는 일종의 카운터(counter)입니다. 세마포어 셋(semaphore set)은 Unix System V에서 지원됩니다. 애플리케이션이 세마포어를 이용하면, 운영체체는 “셋(set)”을 통해 세마포어를 지원합니다.

세마포어 설정값을 확인하려면 아래와 같이 명령을 수행합니다:

# ipcs -ls

------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767

또는 다음 명령을 사용합니다:

# cat /proc/sys/kernel/sem
250     32000   32      128

SEMMSL의 설정

세마포어 셋 당 세마포어의 최대 갯수는 SEMMSL 커널 매개변수를 통해 정의됩니다.

오라클은 init.ora 파일의 PROCESS 인스턴스 매개변수의 (전체 데이타베이스 중) 최대값에 10을 더한 값을 사용할 것을 권장하고 있습니다. 또 SEMMSL의 값을 100 이상으로 설정하는 것이 권장됩니다.

SEMMNI의 설정

SEMMNI 커널 매개변수는 전체 Linux 시스템의 세마포어 셋의 최대 개수를 정의하는데 사용됩니다. 오라클은 SEMMNI를 100 이상의 값으로 설정할 것을 권장하고 있습니다.

SEMMNS의 설정

SEMMNI 커널 매개변수는 전체 Linux 시스템의 (“세마포어 셋”이 아닌) 세마포어의 최대 개수를 정의하는데 사용됩니다.

오라클은 각 데이타베이스의 PROCESSES 인스턴스 매개변수의 값을 모두 더한 뒤, 가장 큰 PROCESSES값을 두 차례 더하고, 마지막으로 각 데이타베이스 별로 10을 더한 값으로 SEMMNS를 설정하도록 권고하고 있습니다.

Linux 시스템에 할당될 수 있는 세마포어의 최대 개수를 결정하기 위해 다음과 같은 공식을 사용합니다. 아래의 두 항목 중 더 낮은 값을 적용합니다:

SEMMNS  또는  (SEMMSL * SEMMNI)

SEMOPM의 설정

SEMOPM 커널 매개변수는 semop 시스템 호출 (system call) 별로 수행될 수 있는 세마포어 작업의 수를 설정하는데 사용됩니다.

semop 시스템 호출(함수)은 하나의 semop 시스템 호출을 통해 여러 개의 세마포어를 지원합니다. 세마포어 셋에서 가질 수 있는 세마포어의 최대값은 SEMMSL 매개변수를 통해 정의됩니다. 따라서 SEMOPMSEMMSL과 동일하게 설정하는 것이 권장됩니다.

오라클은 SEMOPM을 100 이상의 값으로 설정할 것을 권장하고 있습니다.

세마포어 커널 매개변수의 설정

마지막으로 세마포어 매개변수를 설정하는 방법에 대해 알아보겠습니다. 여기에서는 SEMOPM 만을 변경하고, 다른 설정은 디폴트 값을 그대로 사용하는 것으로 합니다.

  • · /proc 파일시스템에 변경 내용을 직접 적용하면, 시스템을 리부팅하지 않고도 세마포어 매개변수를 변경할 수 있습니다. /etc/rc.local 스타트업 파일에 아래 라인을 추가하면 됩니다:
    # echo "250 32000 100 128" > /proc/sys/kernel/sem
    
  • · sysctl 커맨드를 사용하면 전체 세마포어 설정을 한꺼번에 변경할 수 있습니다:
    # sysctl -w kernel.sem="250 32000 100 128"
    
  • · 마지막으로 /etc/sysctl.conf 스타트업 파일에 커널 매개변수를 추가함으로써 변경 내용을 영구적으로 적용할 수 있습니다:
    # echo "kernel.sem=250 32000 100 128" >> /etc/sysctl.conf
    

File Handle의 처리

Red Hat Linux 서버를 구성하는 과정에서, 사용 가능한 파일 핸들(file handle)의 수가 충분한지 확인하는 것은 매우 중요합니다. 파일 핸들의 최대 개수 설정에 따라 Linux 시스템에서 동시에 오픈할 수 있는 파일의 수가 달라지게 됩니다.

전체 시스템에서 사용 가능한 파일 핸들의 최대값을 확인하기 위해 아래 명령을 실행합니다:

# cat /proc/sys/fs/file-max
32768

오라클은 전체 시스템의 파일 핸들 수를 최소 65536개 이상으로 설정할 것을 권고하고 있습니다..

  • · /proc 파일시스템에 변경 내용을 직접 적용하면, 시스템을 리부팅하지 않고도 매개변수를 변경할 수 있습니다. /etc/rc.local 스타트업 파일에 아래 라인을 추가하면 됩니다:
    # echo "65536" > /proc/sys/fs/file-max
    
  • · 또는 sysctl 커맨드를 이용하여 SHMMAX의 값을 변경할 수도 있습니다:
    # sysctl -w fs.file-max=65536
    
  • · 마지막으로 /etc/sysctl.conf 스타트업 파일에 커널 매개변수를 추가함으로써 변경 내용을 영구적으로 적용할 수 있습니다:
    # echo "fs.file-max=65536" >> /etc/sysctl.co
Advertisements
카테고리: Oracle | 태그: , , | 댓글 남기기

hostname 변경하기

O/S : Redhat Linux 8

syntax) hostname ‘변경할 hostname’

cf. root계정으로 실행해야 함.

카테고리: Linux | 댓글 남기기

Oracle “with check option” syntax

Don Burleson

 

 

A “with check option” is designed for updatable views whereas a “check constraint” (coinstraint_type “V”) specifies valid values for an individual column:

 

region_name       varchar(5),

CONSTRAINT check_region

CHECK (region_name in ‘north’,’south’,’east’,’west’)

 

The “with check option”, it is used to prevent changes to a view that would produce rows that are not included in a sub-query.

 

For example, here we create a view that will only allows updates to dept=’finance’:

 

CREATE OR REPLACE VIEW

finance_dept

AS

SELECT name, salary FROM emp WHERE dept = ‘finance’

WITH CHECK OPTION;

 

This means only the record of employees in the finance department can be updated using this finance_dept view.  At update time we see:

 

insert into (select * from emp where dept = ‘finance’ with check option)

values (…);

 

update

(select * from

(select sal, empno from emp, dept where dept = ‘finance’)

with check option)

set sal = 100000 where ename = ‘KING’;

 

A violation produces:

 

ORA-01402: view WITH CHECK OPTION where-clause violation

 

With an ORA-01412, the SQL tried to INSERT or UPDATE a record in a view that contained a WITH CHECK OPTION.  The resulting INSERT or UPDATE violates the WHERE clause of the view.

 

원본 위치 <http://www.dba-oracle.com/t_with_check_option.htm>


카테고리: Oracle | 댓글 남기기

오라클 옵티마이저 확인 방법

카테고리: Oracle | 댓글 남기기

net 명령어 사용하여 네트워크 드라이브 연결 끊기

 

 

네트워크 드라이브 연결 목록 확인

net use

 

네트워크 드라이브 연결 끊기

net use { 로컬 주소 | 원격 주소 } /delete

 

image

카테고리: 분류되지 않음 | 댓글 남기기

Oracle Instant Client setup

보유중인 오라클 클라이언트10g r2가 윈7에서 설치가 되질 않아 찾다보니

oracle instant client라는게 있더군요.

서버는 Oracle 9i Release 2이고,

클라이언트는 Windows7, Toad는 9.7.5.2 버전을 사용했습니다.

 

설치방법

1. 프로그램 다운로드(자신의 OS환경에 맞추어 다운받으면 됩니다.)

http://www.oracle.com/technology/software/tech/oci/instantclient/index.html

Instant Client Package – Basic: All files required to run OCI, OCCI, and JDBC-OCI applications

위 패키지만 다운받으셔도 됩니다. 나머지 패키지는 옵션이니 필요에 따라 받으시면 됩니다.

다운로드 후 적당한 위치에 압축을 풉니다.(ex: C:\instantclient_10_2)

** 11g까지 있으나, 서버에서 9i를 사용하는지라 10g버전을 다운받았네요.

 

2. 환경 설정 : 아래 항목을 환경 변수에 추가해야 합니다.

Path                             예) C:\instantclient_10_2; 를 추가.

LD_LIBRARY_PATH          예) /usr/local/instantclient_10_2    ** UNIX플랫폼의 경우 추가.

PC에 오라클이 설치되어 있지 않을 것이므로 아래 항목을 환경 변수에 추가하셔야 합니다.

NLS_LANG                     예) NLS_LANG= KOREAN_KOREA.KO16MSWIN949

**한글 설정인데 대부분 위의 옵션을 사용합니다만, 조회 시 한글이 깨져서 나오면

   KOREAN_KOREA.AL32UTF8 을 사용해 보세요.

ORACLE_HOME            예) ORACLE_HOME= C:\\instantclient_10_2

TNS_ADMIN                 예) TNS_ADMIN= C:\\instantclient_10_2

** tnsnames.ora파일을 설치하는 위치를 지정하는 변수입니다.

** HKEY_LOCAL_MACHINE\SOFTWARE\Oracle 키값을 생성하고,

    NLS_LANG라는 문자열값으로 지정해도 됩니다.

 

3. tnsnames.ora 파일 생성

tnsnames.ora파일은 설치 디렉토리에 만들면 됩니다.(진한 글씨만 수정)

ALIAS =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = IP주소)(PORT = PORT))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = SID명)
      (SRVR = DEDICATED)
    )
  )

 

 

** 참고 : 저의 경우 Oracle Instant Client 10.2를 설치하였는데 Toad를 실행하니 MSVCR71.dll을 요구하더군요.

            그래서 11g 버전에 있던 파일을 가져다 사용했습니다.

** 분명, tnsnames.ora파일을 설치디렉토리에 생성하였음에도, Toad에서 TNS를 불러오지 못하던데..

   이건 좀 더 알아봐야 할 듯… 뭘 잘못 지정한 건지..-0-

카테고리: 분류되지 않음 | 1개의 댓글

I’m back ;-)

:p

카테고리: 분류되지 않음 | 댓글 남기기