1. 들어가며
✅ Ubuntu 22.04 64bit 환경에서 Oracle 11g 설치하기
2. Oracle XE 다운로드하기
- [다운로드 링크]
XE Prior Release Archive
Getting Started: Support Oracle Database Express Edition (XE) is a community supported edition of the Oracle Database family. Please go to the Oracle Database XE Community Support Forum for help, feedback, and enhancement requests. Note: Oracle Support Ser
www.oracle.com
- Linux 버전을 다운로드한다.
3. Oracle XE 파일 업로드 및 압축 해제
- wget을 이용해 파일 다운로드
wget https://download.oracle.com/otn/linux/oracle11g/xe/oracle-xe-11.2.0-1.0.x86_64.rpm.zip
- wget 실행 안될 경우
- wget 패키지 설치
sudo apt-get install wget
- zip 파일 압축 해제
unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip
4. Oracle XE 설치 시 필요한 패키지 설치
Ubuntu에서는 rpm 파일을 사용하여 패키지 설치를 할 수 없으므로, RPM을 Debian의 deb 패키지로 변경이 필요하다. 변경 및 설치를 위해 필요한 패키지는 아래와 같다.
- alien : RPM 패키지를 Debian 패키지로 변환
- libaio1 : Linux 커널 AIOAsynchronous I/O 액세스 라이브러리
- unixodbc : ODBC (Open Database Connectivity ) 라이브러리
sudo apt-get install -y alien libaio1 unixodbc
4. Oracle XE RPM → DEB 변환
- 다운로드한 rpm 파일을 alien을 이용해 deb 파일로 변환
alien --scripts -d oracle-database-xe-18c_1.0-2_amd64.rpm
5. Oracle XE 환경설정
- 경로
/sbin/chkconfig
- Redhat 패키지들은 설치 시
/sbin/chkconfig
를 시용해야 하지만, Ubuntu에는 해당 파일이 없기 때문에/bin/chkconfig
파일을 생성
sudo vi /sbin/chkconfig
#!/bin/bash
# Oracle 11gR2 XE installer chkconfig hack for Ubuntu
file=/etc/init.d/oracle-xe
if [[ ! `tail -n1 $file | grep INIT` ]]; then
echo >> $file
echo '### BEGIN INIT INFO' >> $file
echo '# Provides: OracleXE' >> $file
echo '# Required-Start: $remote_fs $syslog' >> $file
echo '# Required-Stop: $remote_fs $syslog' >> $file
echo '# Default-Start: 2 3 4 5' >> $file
echo '# Default-Stop: 0 1 6' >> $file
echo '# Short-Description: Oracle 11g Express Edition' >> $file
echo '### END INIT INFO' >> $file
fi
update-rc.d oracle-xe defaults 80 01
#EOF
- 파일 생성 후 실행할 수 있도록 755 권한 설정
sudo chmod 755 /sbin/chkconfig
6. Kernel 파라미터 설정
Oracle이 Linux 커널의 파라미터를 사용하여 운영되기 때문에 Oracle 서버를 운영하기 우해서는 커널 파라미터 설정이 필요하다. 시스템 컨트롤 데몬에 시스템 파라미터 설정을 저장하여 등록한다.
- file.file-max : 오픈하는 파일의 수를 지정하는 커널 파라미터(각 오라클 인스턴스는 512 * Process만큼 file descriptor를 가짐.)
- net.ipv4.iplocalport_range : TCP와 UDP 트랙픽을 위한 범위를 설정하는 커널 파라미터
- kernel.sem : 세마포를 지정하는 커널 파라미터
- kernel.shmmax : 공유 메모리 페이지를 지정하는 커널 파라미터
sudo vi /etc/sysctl.d/60-oracle.conf
# Oracle 11g XE kernel parameters
fs.file-max=6815744
net.ipv4.ip_local_port_range=9000 65000
kernel.sem=250 32000 100 128
kernel.shmmax=536870912
- 커널 파라미터 로드
sudo systemctl start procps
## procps 패키지 설치가 안되있다면
sudo apt-get install procps
7. Oracle XE용 파일 추가
- Oracle XE는
/bin/awk
를 사용하지만, Ubuntu에서는/usr/bin/awk
에 설치되기 때문에 심볼릭 링크를 만들어 줌.
sudo ln -s /usr/bin/awk /bin/awk
## ubuntu 22.04 /bin/awk 존재하고있어 심볼릭 링크를 따로 만들필요없음
## 혹시 모르니 확인 필요
- Oracle XE의 리스터가 사용할 lock 파일 생성
sudo mkdir /var/lock/subsys
## ubuntu 22.04 /var/lock/subsys 존재하고있어 따로 폴더를 만들필요없음
## 혹시 모르니 확인 필요
sudo touch /var/lock/subsys/listener
- (오류 발생 시) 메모리 설정
Oracle XE를 설치하고 나서 특별한 에러 없이 Oracle 프로세스가 리스너만 시작되고 다른 프로세스가 실행되지 않는 문제를 만날 수 있다. Oralce XE를 설치할 때 정상적으로 설치가 되지 않거나 오류가 발생하게 되면 $ORACL_HOME안의 log 디렉터리를 살펴보면 된다. 설치가 정상적으로 되지 않거나, 설치는 되었는데 에러 없이 Oracle이 정상적으로 시작이 되지 않을 경우 로그를 살펴보면 ORA-000845:MEMORY_TARGET 에러가 발생하게 되는 경우가 있는데 메모리의 설정이 잘못되거나 사이즈가 부족해서 그런 경우이다. 이런 경우 메모리 설정을 위해서 다음 과정을 진행한다.
- 현재 설정된 shared memeory 삭제
sudo rm -rf /dev/shm
- 새로운 SHM을 생성하여 mount
sudo mkdir /dev/shm
sudo mount -t tmpfs shmfs -o -size=4096m /dev/shm
- shm 설정을 데몬에 등록, 로드하기 위해 아래 내용을 파일로 생성
sudo vi /etc/rc2.d/S01shm_load
#!/bin/sh
case "$1" in
start) mkdir /var/lock/subsys 2>/dev/null
touch /var/lock/subsys/listener
rm /dev/shm 2>/dev/null
mkdir /dev/shm 2>/dev/null
mount -t tmpfs shmfs -o size=4096m /dev/shm ;
*) echo error
exit 1 ;;
esac
sudo chmod 755 /etc/rc2.d/S01shm_load
8. Oracle XE 패키지 설치
- deb 패키지 설치
sudo dpkg --install oracle-xe_11.2.0-2_amd64.deb
- 정상적으로 설치되면 아래와 같이 나오고 데몬이 자동으로 등록된다.
Selecting previously unselected package oracle-xe.
(데이터베이스 읽는중 ...현재 205338개의 파일과 디렉터리가 설치되어 있습니다.)
Preparing to unpack oracle-xe_11.2.0-2_amd64.deb ...
Unpacking oracle-xe (11.2.0-2) ...
oracle-xe (11.2.0-2) 설정하는 중입니다 ...
Executing post-install steps...
You must run '/etc/init.d/oracle-xe configure' as the root user to configure the database.
Processing triggers for libc-bin (2.31-0ubuntu9) ...
Processing triggers for systemd (245.4-4ubuntu3.1) ...
Processing triggers for gnome-menus (3.36.0-1ubuntu1) ...
Processing triggers for desktop-file-utils (0.24-1ubuntu2) ...
Processing triggers for mime-support (3.64ubuntu1) ...
- 설치 후 Oracle XE 사용을 위해 Oracle 최초 설정을 /etc/init.d/oracle-xe configure로 설정한다.
sudo /etc/init.d/oracle-xe configure
- 최초 설정 내용은 아래와 같은 서비스 포트와 패스워드 설정이다.
- 포트 번호 설정은 건드리지 않고 패스워드만 설정한다. (필요시 포트번호 변경)
Specify the HTTP port that will be used for Oracle Application Express [8080]:
Specify a port that will be used for the database listener [1521]:
Specify a password to be used for database accounts. Note that the same password will be used for SYS and SYSTEM. Oracle recommends the use of different passwords for each database account.
This can be done after initial configuration:
Enter password : <<password 입력>>
Confirm the password : <<password 확인 입력>>
Do you want Oracle Database 11g Express Edition to be started on boot (y/n) [y]:
Starting Oracle Net Listener...Done
Configuring database...Done
Starting Oracle Database 11g Express Edition instance...Done
Installation completed successfully.
9. Oracle XE 환경 변수 설정
리눅스 계정마다 환경 변수 설정해 줘야 된다. 필자는 testid라는 계정으로 접속하여 설정
9.1 첫 번째 방법
su - testid
vi ~/.bashrc
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
export ORACLE_SID=XE
export NLS_LANG=`$ORACLE_HOME/bin/nls_lang.sh`
export ORACLE_BASE=/u01/app/oracle
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PATH
9.2 두번째 방법 (저는 이 방법으로 함)
- /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh ~/.bashrc 파일에 oracle_env.sh 파일 내용을 추가하고 저장한다.
## 아래 명령어 실행 후 해당 명령어 복사
. /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh
vi ~/.bashrc
- ~/.bashrc 맨 아래 복사 한 명령어를 작성하고 저장해 준다.
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth
# append to the history file, don't overwrite it
shopt -s histappend
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize
# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar
# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
esac
# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes
if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
# We have color support; assume it's compliant with Ecma-48
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
# a case would tend to support setf rather than setaf.)
color_prompt=yes
else
color_prompt=
fi
fi
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
# Add an "alert" alias for long running commands. Use like so:
# sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
## 복사한 명령어를 맨아래 추가
. /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh
## oracle_env.sh 파일 내용
##----start--------
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
export ORACLE_SID=XE
export NLS_LANG=`$ORACLE_HOME/bin/nls_lang.sh`
export PATH=$ORACLE_HOME/bin:$PATH
##----end----------
- 변경 사항 반영
source ~/.bashrc
10. Oracle XE 상태 확인
- Oracle의 네티워크 상태 확인을 위해 리스너 확인
lsnrctl status
LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 29-5월 -2020 14:09:30
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.2.0 - Production
Start Date 29-5월 -2020 13:16:50
Uptime 0 days 0 hr. 52 min. 40 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Default Service XE
Listener Parameter File /u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/miris-A320M-H/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_XE)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=miris-A320M-H)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=miris-A320M-H)(PORT=8080))(Presentation=HTTP)(Session=RAW))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "XE" has 1 instance(s).
Instance "XE", status READY, has 1 handler(s) for this service...
Service "XEXDB" has 1 instance(s).
Instance "XE", status READY, has 1 handler(s) for this service...
The command completed successfully
- Sqlplus 테스트 접속
sqlplus system
SQL*Plus: Release 11.2.0.2.0 Production on 금 5월 29 14:13:56 2020
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Enter password:
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
SQL>
11. Oracle XE 작업 준비
Tablespace 및 사용자 등의 추가 작업 : 이 부분은 각자 상황에 따라 다르게 적용되며, SQL로 작업한다.
11.1 Tablespace 생성
- 우선 테이블 스페이스가 저장되는 경로 확인을 위해 테이블스페이스 파일 테이블을 조회한다.
SELECT * FROM DBA_DATA_FILES;
...
CREATE TABLESPACE Tablespace명
datafile '/u01/app/oracle/oradata/XE/Tablespace명.dbf'
SIZE 100M
reuse autoextend ON;
/********************
CREATE TABLESPACE [이름]
DATAFILE [데이터 파일 경로]
SIZE[파일 사이즈][K | M]
AUTOEXTEND [ON | OFF]
[ONLINE | OFFLINE]
[PERMANENT | TEMPORARY]
EXTENT MANAGEMENT [DICTIONARY | LOCAL [AUTOALLOCATE | UNIFORM]]
BLOCKSIZE [사이즈][K | M]
**********************/
## 테이블 스페이스 삭제
DROP TABLESPACE 테이블스페이스명 INCLUDING CONTENTS;
- TABLESPACE : 테이블 스페이스의 이름을 지정한다.
- DATAFILE : 테이블 스페이스를 저장할 데이터 파일의 이름과 경로를 지정한다.
- SIZE : 데이터 파일의 용량을 지정한다. 단위는 K(킬로바이트) 또는 M(메가바이트) 사용
- AUTOEXTEND : 공간이 부족할 때 자동으로 확장할지 여부를 지정한다.
- ONLINE | OFFLINE : 테이블 스페이스를 즉시 사용할지 여부를 지정한다. (Default : ONLINE)
- PERMANENT | TEMPORARY : 저장할 정보가 영구적인지 임시인지를 지정한다. (Default : PERMANENT)
- EXTENT MANAGEMENT DICTIONARY | LOCAL
- DICTIONARY : 테이블 스페이스 내의 EXTENT들이 DICTIONARY TABLE에서 관리된다. (기본값)
- LOCAL : 테이블 스페이스 내의 EXTENT들이 각 DATAFILE 내에서 BITMAP으로 관리된다.
- AUTOALLOCATE : 시스템에서 관리함. 사용자가 EXTENT SIZE를 지정할 수 없음.
- UNIFORM : 사용자가 지정한 일정한 사이즈로 생성됨. (Default : 1M)
- BLOCKSIZE : 인스턴스를 구성하는 블록의 사이즈를 지정한다.
11.2 사용자 생성
## 사용자 생성
CREATE USER User명 IDENTIFIED BY User비밀번호
DEFAULT TABLESPACE Tablespace명
TEMPORARY TABLESPACE temp;
## 사용자 삭제
DROP USER UserId CASCADE;
11.3 사용자 권한 부여
- 권한 부여는 GRANT, 취소는 REVOKE
## 사용자 권한 부여
GRANT CONNECT, RESOURCE, DBA to User명;
## 역할 (기본적으로 사용자를 생성하면 CONNECT, RESOUCE 역할을 준다.)
-- CONNECT ROLE : 세션 생성 및 테이블 생성, 조회 등의 가장 일반적인 권한들로 이루어진다.
-- RESOURCE ROLE : Store Procedure 또는 Trigger와 같은 PL/SQL을 사용할 수 있는 권한들로 이루어진다.
-- DBA ROLE : 모든 시스템 권한이 부여된 역할이다
-- CRATE USER : 데이터 베이스 유저 생성 권한
-- SELECT ANY TABLE : 모든 유저의 테이블 조회 권한
-- CREATE ANY TABLE : 모든 유저의 테이블 생성 권한
-- CREATE SESSION : 데이터베이스 접속 권한
-- CREATE TABLE : 테이블 생성 권한
-- CREATE PROCEDURE : 프로시져 생성 권한
-- CREATE SEQUENCE : 시퀀스 생성 권한
-- SYSDBA : 데이터베이스를 관리하는 최고 권한
-- SYSOPER : 데이터베이스를 관리하는 권한
11.4 테스트용 테이블 생성 (생선 된 UserID로 로그인)
- 사용자별 테이블 권한 부여
CREATE TABLE test_tb (
name varchar2(10),
age number(3)
);
insert into test_tb values("test", 13);
- 권한 부여는 GRANT, 취소는 REVOKE
grant select, insert, delete, update on 권한부여할Table명 to User명;
11.5 기타 참고용 SQL
- 현재 생성된 계정 확인
SELECT * FROM DBA_USERS;
SELECT * FROM ALL_USERS;
- 사용자에게 부여된 시스템 권한 확인
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE='User명';
- 사용자에게 부여된 Role 확인
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE='User명';
- Role에 부여된 시스템 권한 확인
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'Role명';
- 다른 사용자에게 부여된 객체(테이블 등) 권한 확인
SELECT
*
FROM DBA_SYS_PRIVS
WHERE OWNER = '테이블소유자명';
SELECT
*
FROM DBA_SYS_PRIVS
WHERE GRANTEE = '권한부여자명';
- 사용자가 소유한 모든 테이블 조회
SELECT * FROM USER_TABLES;
- 유저들의 DEFAULT TEMP TABLESPACE 확인
SELECT USERNAME, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE FROM DBA_USERS;
- Default Temp Tablespace를 TEMP에서 TEMP2로 변경
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP2;
12. Oracle XE 삭제
- Oracle XE 서비스 정지
sudo systemctl stop oracle-xe
- Oracle XE 패키지 삭제
sudo dpkg --purge oracle-xe
- Oracle XE 디렉터리 삭제
sudo rm -rf /u01/app
- Oracle XE 데몬 삭제 및 갱신
sudo rm /etc/default/oracle-xe
sudo update-rc.d oracle-xe remove
- Ubuntu 설정 파일 삭제
sudo rm /sbin/chkconfig
sudo rm /etc/rc2.d/s01shm_load
sudo rm /etc/sysctl.d/60-oracle.conf
- Oracle XE Ubuntu 계정 삭제
sudo userdel -r oracle
sudo delgroup dba