생계/OERR2023. 1. 20. 10:17

'ORA-1555 snap shot too old'  에러는 개발자들을 당혹케 만드는 오라클 에러 중 하나이다.

해당 에러에 대한 oerr 유틸의 메세지는 아래와 같다. 

[oracle@asmtest ~]$ oerr ora 1555
01555, 00000, "snapshot too old: rollback segment number %s with name \"%s\" too small"
// *Cause: rollback records needed by a reader for consistent read are
//         overwritten by other writers
// *Action: If in Automatic Undo Management mode, increase undo_retention
//          setting. Otherwise, use larger rollback segments

한 사용자가  A 쿼리를 날렸는데 해당 데이터 블록이 (내가 읽으려고 하는 시점 이전에 다른 사용자에 의해 )
변경이 되어, 롤백 세그먼트에서 해당 블록의 변경전 데이터를 찾으려고 하는데 이미 다른사용자가 
해당 롤백 레코드를 덮어 써버려서 이전 데이터를 찾을수 없어서 발생하는 에러. 

이를 그림으로 표현하자면 아래와 같다. 

 

개발자들이 이 현상을 이해하려면 아래 두가지에 대한 이해가 필요하다. 

- 읽기 일관성

- 언두(롤백) segment 의 매커니즘  

 

1. 읽기 일관성 ( Read consistency)


여기서는 읽기 일관성을 최대한 간단하게 설명해보겠다. (자세한건 검색으로..)

읽기 일관성이란 쿼리의 리턴 데이터들의 시점이 일관성이 있어야 한다는 것이다. 

즉, 위의 그림에서 쿼리 A 가 아무리 오래 걸려도 이들 결과 값은 같은 시점의 데이터여야 한다는 것이다. 

마치 쿼리 A 가 시작했을때, 해당 DB 의 그 시점의 스냅샷을 뜬것처럼 데이터를 리턴해야 한다는 것이다. 

위 그림의 예를 들면 table 이 존재하고, pk 가 aa 인 1 row 가 있다고 가정하자.

조회쿼리 Query A 가 08:00 시에 실행되었다고 치면, 그 당시에 col A 의 값은 1 이었다. 

그런데 다른 쿼리 Query B 가 해당 row 를 08:10 에 col A 를 2로 업데이트 했다. 

또다시 Query C 가 해당 row 를 08:15 에 col A 를 3 으로 업데이트 했다.

 그러면 08:00 에 시작한 Query A 가 08:16 분에 해당 row 를 읽으려고 하면 어떤 값을 return 해야하는가?

현재 데이터블록의 해당 row 값은 3 이지만, 읽기 일관성의 관점에서는 Query A 의 시작시점 값인 1 을 리턴해야한다. 

이를위해서 오라클은 과거시점의 데이터를 읽기일관성을 위해 DB의 공간에 저장할 필요가 있는데 

이곳이 언두(롤백) 세그먼트 이다.  

 

2. 언두세그먼트 의 매커니즘


언두세그먼트는 디비 전체 (정확히는 instance별) 에서 공유하는 resource 이다. 

설정된 공간을 계속해서 덮어쓰는 구조이다. 언두 공간이 부족하면 추가를 할수 있지만 아무런 기준없이 추가를 계속할수는 없고 관리자의 입장에서 사이트의 특성을 고려해서 전략적으로 선택해야한다.

- undo retention

 언두 사이즈도 중요하지만 언두데이터를 얼마의 시간동안 유지 할것인가도 중요하다. 

  유지시간을 너무 짧게 잡으면 금방 다른 데이터로 덮어씌여져 SNAPSHOT TOO OLD 가 발생할 수 있다. 

 반면 필요 이상으로 길게 잡으면 언두블록을 할당받아야할 세션들에 병목이 발생할수 있다.

 식당으로 치면 회전률이 안나오는 격이니 주인 입장에서는 골치가 아프다. 

 

3. 에러에 대한 조치


 - ORA-1555 가 발생한 쿼리가 너무 오래동안 수행되었다면 쿼리성능 개선을 고려해본다.

 - UNDO RETENTION 이 너무 짧다면 좀 더 길게 변경 해준다. 

- UNDO RETENTION 이 적정한데도 에러가 났다면 UNDO DATAFILE 을 추가해준다. 

- 업무시간 중에 대량의 DML 이 발생하지 않게 트랜잭션을 재배치 해준다. 

 

반응형
Posted by 돌고래트레이너
생계/Oracle2023. 1. 15. 21:36

앞선 포스팅에서 single server 에서 asm 을 사용하기 위한 grid 설치를 알아보았다. 

19c grid 설치 Standalone server (Oracle Restart)

이제 FILESYSTEM 이 아닌 ASM diskgroup 에 데이터베이스를 생성해보자. 

oracle 19c database 설치파일은 아래링크에서 다운받을수 있다. 

https://www.oracle.com/kr/database/technologies/oracle-database-software-downloads.html

oracle 계정의 .bash_profile 은 위의 글을 참조하자.

본격적으로 설치 시작 

db_env => 

=================================================
mkdir -p $ORACLE_HOME
mv LINUX.X64_193000_db_home.zip $ORACLE_HOME
cd $ORACLE_HOME
unzip LINUX.X64_193000_db_home.zip 

./runInstaller

엔진설치, DB생성을 모두 하자. 

 

 

설치파일이 있는 디렉토리와 oracle base 디렉토리가 자동으로 잡힌다. 

 

 

 container 설치는 목적이 아니니까 체크해제 한다.

 

ASM 을 선택하자 

 recovery 영역도 ASM 을 선택하자  

데이터베이스는 앞서 생성한 DATA 디스크그룹에 생성한다. 

 귀찮으니까 같은 패스워드로

 

설치중 root 로 진행하는 부분을 자동으로 설정 

설치가 완료되면 sqlplus 로 DB에 접속해보자. 

grid 환경으로 바꾸고(grid_env) crsctl stat res -t 명령어를 치면 database 가 online 으로 표시 되면 끝

반응형
Posted by 돌고래트레이너
생계/Oracle2023. 1. 11. 21:30

이전 포스팅에서 virtual box 에  오라클리눅스 설치를 완료했다. 

[virtualbox] 오라클리눅스 설치 oracle-linux 8.4

ASM 은 RAC 에서는 필수이지만 single node DB 에서는 파일시스템에 설치할수도 있다. 

싱글노드에서 ASM 을 설치하려면 grid 를 먼저 설치해야한다. 

 

오라클에서 제공하는 설치관련 가이드 문서는 아래 링크에서 확인가능하다. 

https://docs.oracle.com/en/database/oracle/oracle-database/19/cwlin/index.html

 

Grid Infrastructure Installation and Upgrade Guide

 

docs.oracle.com

 

 1-1) hostname 변경 


 @root 
hostname
hostnamectl set-hostname asmtest

vi /etc/hosts
10.0.2.15   asmtest

 1-2) SELINUX 

 


vi /etc/selinux/config
SELINUX=disabled
( 중간의 SELINUX=enforcing 를 변경해준다) 
 - 방화벽
systemctl stop firewalld


reboot


 1-3)설치준비 



  - YUM, RPM
 @root 
  
 yum install -y oracle-database-preinstall-19c
 cd /home/oracle

** 아래 파일들은 미리 준비가 필요하다. 
 rpm -ivh oracleasm-support-2.1.12-1.el8.x86_64.rpm
 rpm -ivh oracleasmlib-2.0.17-1.el8.x86_64.rpm

 - OS USER

groupadd asmadmin
groupadd asmdba
groupadd asmoper
usermod -g oinstall -G dba,oper,backupdba,dgdba,kmdba,racdba,asmdba,asmoper oracle


 - DIRECTORY

mkdir -p /app/grid 
 
chown -R oracle:oinstall /app
chmod -R 775 /app

@oracle

   mv LINUX.X64_193000_grid_home.zip   /app/grid

cd /app/grid 
unzip LINUX.X64_193000_grid_home.zip 
 

 - PROFILE 

root, oracle 계정의 .bash_profile  

편의상 grid 계정 분리하지 않고 oracle 한 계정으로 간다.  

alias 부분은 각자 취향에 맞게 편집하자

===== oracle bash profile =====
export TMP=/tmp
export TMPDIR=$TMP
 
export ORACLE_HOSTNAME=asmtest
export ORACLE_UNQNAME=orcl
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19.0.0/db_1
export GRID_HOME=/app/grid
export ORA_INVENTORY=/oraInventory
export ORACLE_SID=orcl
export PATH=/usr/sbin:/usr/local/bin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
export CV_ASSUME_DISTID=RHEL7.6 
 
export LANG=C
export LC_ALL=C

alias grid_env='export ORACLE_HOME=$GRID_HOME;export ORACLE_SID=+ASM;export PATH=$GRID_HOME/bin:$PATH'
alias db_env='export ORACLE_HOME=$ORACLE_BASE/product/19.0.0/db_1;export ORACLE_SID=orcl'
alias ss='sqlplus / as sysdba'
alias oh='cd $ORACLE_HOME'
alias gh='cd $GRID_HOME'
===== oracle bash profile =====

===== root bash profile =====

export ORACLE_BASE=/app/oracle
export GRID_HOME=/app/grid
export ORACLE_HOME=$ORACLE_BASE/product/19c/db_1
export PATH=$PATH:$GRID_HOME/bin

===== root bash profile =====

 
 - ASM CONFIG
 
[root@asmtest oracle]# oracleasm configure -i
Configuring the Oracle ASM library driver.

This will configure the on-boot properties of the Oracle ASM library
driver.  The following questions will determine whether the driver is
loaded on boot and what permissions it will have.  The current values
will be shown in brackets ('[]').  Hitting <ENTER> without typing an
answer will keep that current value.  Ctrl-C will abort.

Default user to own the driver interface []: oracle
Default group to own the driver interface []: asmadmin
Start Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration: done
[root@asmtest oracle]#  

[root@asmtest oracle]# oracleasm init
Creating /dev/oracleasm mount point: /dev/oracleasm
Loading module "oracleasm": oracleasm
Configuring "oracleasm" to use device physical block size
Mounting ASMlib driver filesystem: /dev/oracleasm
[root@asmtest oracle]#  oracleasm status
Checking if ASM is loaded: yes
Checking if /dev/oracleasm is mounted: yes
[root@asmtest oracle]#  oracleasm configure
ORACLEASM_ENABLED=true
ORACLEASM_UID=oracle
ORACLEASM_GID=asmadmin
ORACLEASM_SCANBOOT=true
ORACLEASM_SCANORDER=""
ORACLEASM_SCANEXCLUDE=""
ORACLEASM_SCAN_DIRECTORIES=""
ORACLEASM_USE_LOGICAL_BLOCK_SIZE="false"
[root@asmtest oracle]#
 
 
 
 - FDISK 

디스크 추가 전

[root@asmtest dev]# ls  /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2


ASM 에서 사용할 디스크그룹을 아래와 같이 추가하자

 - crs1,2,3 : asm 파일용, 대충 각 1G
 - data : database 용, 최소 20G
 - reco : recovery 영역, 대충 5G
  

VM관리자에서 설정 클릭

 

 

 

 

* 디스크는 online 상에선 추가가 안되고 vm 이 down 된 상태에서 가능하다. 처음부터 준비하면 좋다.

 

  fdisk /dev/sdb
  n(new) -> p(primary) -> 1 -> Enter(default) -> Enter(default) -> w(write)
  fdisk /dev/sdc
  fdisk /dev/sdd
  fdisk /dev/sde
  fdisk /dev/sdf
  

디스크 5개를 추가했으니 5개 반복해준다. 

다했으면 추가된 디스크로 asmdisk 를 만들자.
 
oracleasm createdisk CRS1 /dev/sdb1
oracleasm createdisk CRS2 /dev/sdc1
oracleasm createdisk CRS3 /dev/sdd1
oracleasm createdisk DATA /dev/sde1
oracleasm createdisk RECO /dev/sdf1
 
oracleasm scandisks
oracleasm listdisks
  
  
 - tmpfs


 vi /etc/fstab  => 아래 한줄 추가 
 tmpfs                   /dev/shm                tmpfs   size=8g         0 0

df -h
mount -o remount /dev/shm
df -h

cd /app/grid/cv/rpm/
rpm -ivh cvuqdisk-1.0.10-1.rpm


 2) grid설치


grid_env => grid 환경으로 변경 alias (path, oracle_sid)

cd /app/grid
./gridSetup.sh 

oracle restart 선택 

change discovery path 클릭, asm disk 가 있는 경로를 써준다. 

 

 

 

설치 도중 root 권한으로 진행이 필요한 부분을 자동으로 실행하기 위해 auto 선택

 설치가 원활하려면 최소 메모리 8G 를 되야 한다. 아무리 작아도 4G 보다는 커야 하고 사전체크에서 걸리면 ignore

 

- DATA, RECO diskgroup 추가 

 CRS 디스크그룹만 생성하고 grid 설치가 끝났다. 추가로 DATA, RECO 디스크 그룹을 만들자.

 

[oracle@oraasm grid]$ asmca

 

하단의 create..  클릭

디스크그룹 이름을 DATA 로 하고 disk 선택  하고 하단의 Ok.

 동일하게 RECO 를 생성하자. 

생성이 끝나고 아래 명령어로 확인 

crsctl stat res -t 

 

 디스크그룹이 잘 생성이 되었다. 

 이제 여기에 데이터베이스를 생성이 가능한데, 그것은 다음글에서 알아보자. 

  [ASM] 19c database 설치

반응형

'생계 > Oracle' 카테고리의 다른 글

[VM] oracle virtual box DB 연결 DBeaver 설치  (0) 2023.01.21
[ASM] 19c database 설치  (0) 2023.01.15
[OEL] 오라클 19c single ASM 설치  (0) 2022.12.28
[ASM] 스크립트 로 database 수동 생성  (0) 2022.12.22
오라클 DISKGROUP RENAME  (0) 2022.12.21
Posted by 돌고래트레이너