Установка Oracle 11g Release 2 на Ubuntu 12.04 (amd64)

В данной заметке пойдёт речь о подготовке Ubuntu 12.04 amd64 к установки СУБД Oracle 11g Release 1, так как мне не удалось найти подходящий мануал на эту тему.

Итак, начнём установку Oracle:

Минимальный софт, который необходимо установить перед запуском инсталятора базы:

sudo apt-get install alien autoconf automake autotools-dev binutils bzip2 doxygen elfutils expat gawk gcc gcc-multilib g++-multilib ia32-libs ksh less lesstif2 lesstif2-dev lib32z1 libaio1 libaio-dev libc6-dev libc6-dev-i386 libc6-i386 libelf-dev libltdl-dev libmotif4 libodbcinstq4-1 libodbcinstq4-1:i386 libpth-dev libpthread-stubs0 libpthread-stubs0-dev libstdc++5 lsb-cxx make openssh-server pdksh rlwrap rpm sysstat unixodbc unixodbc-dev unzip x11-utils zlibc openssh-server

Так же нам потребуется 32х битная библиотека libstdc++5:

wget -c http://mirror.yandex.ru/ubuntu/pool/universe/g/gcc-3.3/libstdc++5_3.3.6-25ubuntu1_i386.deb

Теперь её нужно принудительно установить, так как система у нас 64х битная:

sudo dpkg --force-architecture -i libstdc++5_3.3.6-25ubuntu1_i386.deb

Если установка будет осуществляться на локальной машине, то ещё потребуется графический сервер, так как установщик написал на графической библиотеке java:

apt-get install xorg

Затем добавим необходимые группы и пользователей:

groupadd oinstall
groupadd dba
groupadd nobody
useradd -g oinstall -G dba,nobody -d /opt/oracle -s /bin/bash oracle
passwd oracle

Затем потребуются директории, в которых будет находиться наша будущая СУБД:

mkdir -pv /opt/oracle /opt/oraInventory /etc/rc.d
chown -R oracle:oinstall /opt/oracle /opt/oraInventory
chmod -R 755 /opt/oracle

Теперь необходимо отредактировать файл /etc/profile и добавить в него следующие строки:

export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11gR2/dbhome_1
export ORACLE_SID=orcl
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
PATH=$PATH:$ORACLE_HOME/bin

if [ "$USER" = oracle ]; then
  if [ $SHELL = "/bin/ksh" ];
   then
    ulimit -p 16384;
    ulimit -n 65536;
   else
    ulimit -u 16384 -n 65536;
  fi
fi

Теперь требуется настройка /etc/sysctl.conf (скорее всего на этапе проверки установщик будет рекомендовать Вам свои параметры)

kernel.shmall = 2097152
kernel.shmmax = 4294967295
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
fs.file-max = 6815744
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65000

Применим новые параметры командой:

sysctl -p

Теперь настроим файл /etc/security/limits.conf, необходимо добавить в него следующее:

oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536

Создадим необходимые символические ссылки:

mkdir -pv /usr/lib64
ln -s /usr/bin/basename /bin/basename
ln -sf /bin/bash /bin/sh
ln -s /usr/bin/rpm /bin/rpm
ln -s /usr/bin/awk /bin/awk
ln -s /usr/lib/x86_64-linux-gnu/libc_nonshared.a /usr/lib64
ln -s /usr/lib/x86_64-linux-gnu/libpthread_nonshared.a /usr/lib64
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib64
ln -s /lib/i386-linux-gnu/libgcc_s.so.1 /lib64
ln -s /usr/lib/i386-linux-gnu/libpthread_nonshared.a /usr/lib/libpthread_nonshared.a

Убедимся в том что имеется требуемая строка (session required pam_limits.so):

cat /etc/pam.d/login | grep session | grep pam_limits

Теперь требуется файл /etc/init.d/oracle-shm со следующим содержимым:

#! /bin/sh
#
### BEGIN INIT INFO
# Provides: oracle-shm
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Bind /run/shm to /dev/shm at system startup.
# Description: Fix to allow Oracle 11g use AMM.
### END INIT INFO
#
case "$1" in
 start)
  echo "Starting script /etc/init.d/oracle-shm"
  # Run only once at system startup
  if [ -e /dev/shm/.oracle-shm ]; then
   echo "/dev/shm is already mounted, nothing to do"
  else
   rm -f /dev/shm
   mkdir /dev/shm
   mount -B /run/shm /dev/shm
   touch /dev/shm/.oracle-shm
  fi
 ;;
 stop)
  echo "Stopping script /etc/init.d/oracle-shm"
  echo "Nothing to do"
 ;;
 *)
  echo "Usage: /etc/init.d/oracle-shm {start|stop}"
  exit 1;
 ;;
esac

Затем сделаем файл исполняемым и добавим его в уровни по умолчанию:

chmod a+x /etc/init.d/oracle-shm
update-rc.d oracle-shm defaults 98

Запустим демон, после чего проверим всё ли прошло так как нам нужно:

/etc/init.d/oracle-shm start
cat /etc/mtab | grep shm

Если есть эти 2 строки, то значит всё прошло удачно:

none /run/shm tmpfs rw,nosuid,nodev 0 0
/run/shm /dev/shm none rw,bind 0 0

Теперь залогинимся из под учётной записи oracle и распакуем пакеты с базой данных:

unzip Linux-x86-64_1of7.zip
unzip Linux-x86-64_2of7.zip

Перейдём в директорию с установщиком и запустим его:

startx
cd database
./runInstaller

Во время этапа линковки у Вас наверняка вылезет ошибка сборки типа Error in invoking target 'agent nmhs' of makefile (ничего не отменяем), чтобы избавиться от неё откроем ещё одну консоль, например от имени пользователя oracle и выполнить следующие команды:

sed -i 's/^(s*$(MK_EMAGENT_NMECTL))s*$/1 -lnnz11/g' $ORACLE_HOME/sysman/lib/ins_emagent.mk
sed -i 's/^($LD $LD_RUNTIME) ($LD_OPT)/1 -Wl,--no-as-needed 2/g' $ORACLE_HOME/bin/genorasdksh
sed -i 's/^(s*)($(OCRLIBS_DEFAULT))/1 -Wl,--no-as-needed 2/g' $ORACLE_HOME/srvm/lib/ins_srvm.mk
sed -i 's/^(TNSLSNR_LINKLINE.*$(TNSLSNR_OFILES)) ($(LINKTTLIBS))/1 -Wl,--no-as-needed 2/g' $ORACLE_HOME/network/lib/env_network.mk
sed -i 's/^(ORACLE_LINKLINE.*$(ORACLE_LINKER)) ($(PL_FLAGS))/1 -Wl,--no-as-needed 2/g' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/^(KFED_LINKLINE.*$(S0MAIN)) ($(SSKFEDED))/1 -Wl,--no-as-needed 2/g' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/^(KFOD_LINKLINE.*$(S0MAIN)) ($(SSKFODED))/1 -Wl,--no-as-needed 2/g' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/^(KFNDG_LINKLINE.*$(S0MAIN)) ($(SSKFNDGED))/1 -Wl,--no-as-needed 2/g' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/^(AMDU_LINKLINE.*$(S0MAIN)) ($(SSKFMUED))/1 -Wl,--no-as-needed 2/g' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
Затем в любом текстовом редакторе нужно выполнить правки файла $ORACLE_HOME/rdbms/lib/env_rdbms.mk строку:
ORACLE_KERNEL_LIBS=$(LLIBSKGTR) $(LLIBPERFSRV) $(NAETTOBJS) $(CONFIG)
$(SPOBJS) $(LLIBSERVER) $(LLIBODM) $(LLIBSAGE)
заменить на:
ORACLE_KERNEL_LIBS=$(LLIBSKGTR) $(LLIBPERFSRV) $(NAETTOBJS) $(CONFIG)
$(SPOBJS) -Wl,--no-as-needed $(LLIBSERVER) $(LLIBODM) $(LLIBSAGE)
Затем в любом текстовом редакторе нужно выполнить правки файла $ORACLE_HOME/srvm/lib/env_srvm.mk
строку:
GETCRSHOME_LINKLINE=$(LINK) $(LDPATHFLAG)$(RDBMSLIB) $(CDEBUG) $(OPT)
$(GETCRSHOME_OBJ1) $(OCRLIBS_DEFAULT) $(LLIBCLNTSH)
заменить на:
GETCRSHOME_LINKLINE=$(LINK) $(LDPATHFLAG)$(RDBMSLIB) $(CDEBUG) $(OPT)
$(GETCRSHOME_OBJ1) -Wl,--no-as-needed $(OCRLIBS_DEFAULT) $(LLIBCLNTSH)

Затем в инсталяторе нажмём кнопку Retry. После чего установка пройдёт без ошибок.

По завершению всех шагов с развёртыванием базы скорее всего возникнет сложность с неочевидной ошибкой MEMORY_TARGET, после которой не хочет запустаться Asistant для создания базы. Обойти её можно добави в файл /etc/fstab строку вида:

tmpfs /run tmpfs rw,nosuid,noexec,size=2000m 0 0

Затем выполнить команду:

mount -o remount /run

или

mount -o remount,size=2000m /run

И вновь нажать Retry в инсталяторе.
По завершению установки нас попросят выполнить скрипт root.sh, сделаем это:

sudo bash $ORACLE_HOME/root.sh

Теперь нам потребуется скрипт запуска базы данных:

#!/bin/bash
#
# /etc/init.d/oracledb
#
# Run-level Startup script for the Oracle Listener and Instances
# It relies on the information on /etc/oratab

. /etc/profile

if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ];
then
echo "Oracle startup: cannot start"
exit 1
fi

case "$1" in
start)
# Oracle listener and instance startup
echo -n "Starting Oracle: "
su $ORACLE_OWNR -c "$ORACLE_HOME/bin/lsnrctl start"
su $ORACLE_OWNR -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME"
su $ORACLE_OWNR -c "$ORACLE_HOME/bin/emctl start dbconsole"
touch /var/lock/oracle
echo "OK"
;;
stop)
# Oracle listener and instance shutdown
echo -n "Shutdown Oracle: "
su $ORACLE_OWNR -c "$ORACLE_HOME/bin/emctl stop dbconsole"
su $ORACLE_OWNR -c "$ORACLE_HOME/bin/lsnrctl stop"
su $ORACLE_OWNR -c "$ORACLE_HOME/bin/dbshut $ORACLE_HOME"
rm -f /var/lock/oracle
echo "OK"
;;
reload|restart)
$0 stop
$0 start
;;
*)
echo "Usage: `basename $0` start|stop|restart|reload"
exit 1
;;
esac

exit 0

Далее выполним следующие команды:

chmod a+x /etc/init.d/oracledb
update-rc.d oracledb defaults 99

Затем отредактируем файл /etc/oratab и запишем в него:

orcl:/opt/oracle/product/11gR2/dbhome_1:Y

Теперь настроим timezone, иначе Enterprise Manager не будет запускаться:

/etc/init.d/oracledb stop

Откроем в текстовом редакторе файл /etc/profile и добавим в него строку:

export TZ=Etc/GMT-4

После чего перечитаем конфиг из под пользователя oracle:

source /etc/profile

Сбросим настройки часового пояса у агента oracle:

$ORACLE_HOME/bin/emctl resetTZ agent

Теперь необходимо разблокировать пользователя SYSMAN, для этого необходимо залогиниться из под пользователя oracle:

sqlplus /nolog
conn / as sysdba
ALTER USER SYSMAN ACCOUNT UNLOCK;

Ну во вроде и всё, удачного вам рабочего дня! 😉