Установка Oracle на RHEL 5 (VM) для проведения тестов

Jan 5, 2013 19:15 · 544 words · 3 minute read tutorial

Добрый день, %username%! Передо мной возникла задача создания виртуальной машины для тестов продукта под Oracle. Тесты какие-никакие уже есть, но необходимо автоматизировать настройку среды и их прогон. Идея до безобразия простая — запускается машина, создаётся снапшот (дабы не портить базу), устанавливается продукт, запускаются тесты. Думаю, это стандартная схема, реализовывать же это планируется на VirtualBox + RHEL 5 + Oracle 11.2.

Настройка ВМ

Как выяснилось опытным путём, Oracle при установке требует swap, причём минимум гиг. Его можно сэмулировать с помощью устройства смаппированного на диск, но проще создать при установке ОС. Ещё этой БД нужно минимум гиг оперативки для работы и гигов 5 места на жёстком диске. В итоге получилась следующая конфигурация ВМ: оперативки 1,5Gb, предел загрузки CPU 75%, 1ый ЖД 12Gb (RHEL + Oracle займёт 10Gb и это без файлов tablespaceов!), 2ый ЖД 10Gb (под базы). Второй ЖД нужен для организации снапшотов БД средствами LVM (об этом ниже).

Установка и настройка ОС

Для комфортной работы советую подключить следующие репозитории:

Файл для запуска/остановки Oracle нашёл где-то в интернете:

#!/bin/sh

ORA_HOME=/opt/oracle/product/11.2.0/db_1
ORA_OWNER=oracle

if [ ! -f $ORA_HOME/bin/dbstart ]
then
    echo "Oracle startup: cannot start"
    exit
fi

case "$1" in
    'start')
        su - $ORA_OWNER -c "$ORA_HOME/bin/dbstart $ORA_HOME"
        touch /var/lock/subsys/dbora
        ;;
    'stop')
        su - $ORA_OWNER -c "$ORA_HOME/bin/dbshut $ORA_HOME"
        rm -f /var/lock/subsys/dbora
        ;;
esac

Там я немного схитрил :) Дело в том, что запуск должен производиться от локального пользователя, который включён в группу oradba (кажется), соответственно строка подключения будет sqlplus / as sysdba, а работать я хочу со строкой подключения sqlplus SYS/[email protected] as sysdba. Мешает этому политика аутентификации Oracle в файле sqlnet.ora. Пока не придумал ничего лучше, чем sedом его править перед запуском/остановкой, а потом возвращать обратно. Это лучше посмотреть в скрипте 😉 Ах да, не забываем поменять в /etc/oratab ‘N’ на ‘Y’ для автозапуска Oracle, а также зарегистрировать скрипт запуска: chkconfig --add oracle.

Настройка LVM

Логическое управление томами (LVM) - очень крутая штука, которая позволяет проводить всякие волшебные вещи с разделами. Например, добавлять диски и разделы без даунтайма или создавать снапшоты. Подробнее об этом можно почитать в статье на ibm.com. Мне же она нужна больше для создания снапшотов ФС. Т.е. можно остановить Oracle, сделать снапшот его баз (для этого они были перемещены на отдельный раздел), подключить его вместо оригинальной ФС, попортить, а потом спокойно удалить, т.к. первоначальное состояние баз не изменилось 🙂 Чудо! Для работы со снапшотом написал простенький класс на Python:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import os
from subprocess import call


class psSnapshot(object):
    def __init__(self):
        super(psSnapshot, self).__init__()
        self.size = '1G'
        self.name = 'snap'
        self.vg = 'oradata'
        self.lv = 'oradata'
        self.mountPoint = '/oradata'

    def getVG(self):
        return '/dev/%s' % self.vg

    def getBaseDevice(self):
        return os.path.join(self.getVG(), self.lv)

    def getDevice(self):
        return os.path.join(self.getVG(), self.name)

    def __runAndCheck(self, cmd, message):
        retcode = call(cmd, shell=True)
        if retcode != 0:
            raise Exception(message)

    def create(self):
        self.__runAndCheck('lvcreate -s -L %s -n %s %s' % (self.size, self.name, self.getBaseDevice()), 'Cannot create snapshot')

    def __mount(self, device):
        self.__runAndCheck('umount %s' % self.mountPoint, 'Cannot umount %s' % self.mountPoint)
        self.__runAndCheck('mount %s %s' % (device, self.mountPoint), 'Cannot mount %s to %s' % (device, self.mountPoint))

    def mount(self):
        self.__mount(self.getDevice())

    def umount(self):
        self.__mount(self.getBaseDevice())

    def delete(self):
        self.__runAndCheck('lvremove -f %s' % self.getDevice(), 'Cannot delete snapshot')

Правда не уверен, что он мне не особо понадобится, однако команды по работе со снапшотами можно в нём посмотреть. Не забываем также читать статью с ibm.com, там всё подробно разжёвано!