Установка Oracle9i на Slackware-9.1

Как известно, дистрибутив Slackware не является частью инициативы Oracle Unbreakable Linux, а посему официально не поддерживается. Что же делать тем, у кого нет ни возможности, ни желания переходить на что-либо сертифицированное? Читать эту статью!

[Dmitry A. Koptev (dimez@nm.ru)]

Установка Oracle9i на Slackware-9.1

Есть рабочий сервер с установленным Slackware-9.1 (можно и на Slackware-9.0 - разницы практически нет) Переустанавливать linux на сервере на тот, который сертифицирован Oracle, нет ни возможности, ни желания :-)

По умолчанию, та версия Oracle(9.2.0.1), которую можно утянуть с офсайта (http://www.oracle.com/) поставить не получается - при установке возникают 3 ошибки линкования и СУБД после этого нормально не работает. После вдумчивого искания на всяческих поисковиках, во всяческих группах, "курения" документации и общения с друзьями-ораклистами (и не только с друзьями - просто с ораклистами :-), примерно нащупал решение - решил проверить на рабочей машине

Итак, начнём...

Скачиваем с сайта Oracle (http://www.oracle.com/) собственно сам oracle (три файла солидного размера). Для скачки требуется бесплатная регистрация на сайте.

Скачиваем (если есть доступ на металинк, если нет - берём у друзей) файл p3095277_9204_LINUX.zip (тоже солидного размера).

Если используете OLAP - надо достать(с металинка или у друзей) файл p3084634_9204_LINUX.zip - исправляет ошибки, допущенные в 9.2.0.4 патчсете(я не пользую{пока} - не ставил)

Сам процесс установки описывать не буду - он описан на множестве сайтов, к примеру http://tutorial.ru/tutorials/13.html http://www.puschitz.com/InstallingOracle9i.html

Скажу лишь, что применительно для Slackware я проделал:

  1. в файл /etc/sysctl.conf прописал следующее:
    ---cut-/etc/sysctl.conf---
    kernel.sem=250 32000 100 128
    kernel.shmmax=2147483648
    kernel.shmmni=4096
    kernel.shmall=2097152
    fs.file-max=65536
    net.ipv4.ip_local_port_range=1024 65000
    ---end-of-cut-/etc/sysctl.conf---
    
  2. в стартовые скрипты(rc.local например) прописал:
    if [ -f /etc/sysctl.conf ]; then
    
        /sbin/sysctl -p /etc/sysctl.conf
    
    fi
    
  3. в домашний каталог пользователя oracle положил следующие файлы
    .bashrc(с точкой в начале :-)
    ---cut-.bashrc---
    ORACLE_BASE=/opt/oracle
    ORACLE_HOME=/opt/oracle/9.2.0
    ORACLE_SID=some_sid ### поправить на нужный
    ORACLE_TERM=xterm
    NLS_LANG=AMERICAN
    ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
    PATH=$PATH:$ORACLE_HOME/bin
    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:$ORACLE_HOME/network/lib
    CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
    CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib
    DISPLAY=localhost:0.0
    export PATH ORACLE_BASE ORACLE_HOME ORACLE_SID LD_LIBRARY_PATH ORACLE_TERM NLS_
    LANG ORA_NLS33 DISPLAY
    ---end-of-.bashrc---
    
    и сделал символические ссылки
    ln -s .bashrc .bash_login
    ln -s .bashrc .bash_profile
    
После почти успешной - с 3-мя ошибками, которые мы игнорируем (то есть, нажимаем "Ignore" :-) - установки, выходим из инсталлятора.

Дополнение

Одну ошибку, связанную с линкованием, можно вылечить в момент установки.

"Когда появится окно с ошибкой линкования, нужно отредактировать файл $ORACLE_HOME/ctx/lib/env_ctx.mk: добавить в строке начинающийся с INSO_LINK= новое значение $(LDLIBFLAG)dl т.е.

   INSO_LINK = -L$(CTXLIB) $(LDLIBFLAG)m $(LDLIBFLAG)dl $(LDLIBFLAG)sc_ca
   $(LDLIBFLAG)sc_fa $(LDLIBFLAG)sc_ex $(LDLIBFLAG)sc_da
   $(LDLIBFLAG)sc_ut $(LDLIBFLAG)sc_ch $(LDLIBFLAG)sc_fi $(LLIBCTXHX)
   $(LDLIBFLAG)c -Wl,-rpath,$(CTXHOME)lib $(CORELIBS) $(COMPEOBJS)
нажать кнопку повторить в модальном окне."

За дополнение большое спасибо Askhat A. Nadjibev.

Разархивируем куда-нибудь первый патчсет(3095277), после чтения README.html из патчсета делаем следующие вещи

root@db # su - oracle
oracle@db % cd $ORACLE_BASE/oui/bin/linux
oracle@db % ln -s libclntsh.so.9.0 libclntsh.so
oracle@db % cd $ORACLE_HOME/bin
oracle@db % ./runInstaller
выбираем путь в разархивированному патчсету(конкретно к products.jar из него)

Сначала патчим сам инсталлер до версии 2.2.0.18.0(что в патчсете), дожидаемся окончания установки инсталлера, выходим из него, запускаем заново, проверяем на всякий случай версию(а вдруг не обновилась :-) Затем выбираем установку самого патчсета(в меню он называется "Oracle9iR2 Patch Set 3 9.2.0.4.0") и устанавливаем его После установки по идее надо запустить Oracle Database Assistant, но мы его сначала подправим :-)

Открываем в любимом редакторе файл $ORACLE_HOME/bin/dbca, и в самом конце приводим к такому виду

#if [ -f /etc/rac_on ]; then
# Run DBCA
$JRE_DIR/bin/jre -native -DORACLE_HOME=$OH...
#else
# Run DBCA
#$JRE_DIR/bin/jre -DORACLE_HOME=$OH...
#fi
То есть, комментируем "лишнее" :-) Можно и сделать проще - создать файл /etc/rac_on, т.е.
       # touch /etc/rac_on
После этого можно смело запускать dbca и создавать базу Да, при создании базы желательно залочить пользователя SCOTT :-)) После создания базы заходим(из-под пользователя oracle) в каталог $ORACLE_HOME/dbs
    oracle@db % cat initdw.ora |sed s/"#db_name = MY_DB_NAME"/"db_name = _SID_"/| \
	sed s/#control_files/control_files/ > init_SID_.ora
("_SID_" заменить на SID, с которым создавали базу) Теперь от имени root правим файл /etc/oratab
	
       _SID_::/opt/oracle/9.2.0:Y
Затем настраиваем listener
       oracle@db % $ORACLE_HOME/bin/netca
После создания базы и настройки listener надо озаботиться написанием стартового скрипта
---cut-rc.oracle---
#!/bin/sh
ORACLE_HOME=/opt/oracle/9.2.0
ORACLE_OWNER=oracle

oracle_start() {
        echo -n "Starting Oracle:"
        echo -n " listener"
    su - $ORACLE_OWNER -c "source /home/oracle/.bashrc;$ORACLE_HOME/bin/lsnrctl start" > /dev/null 2>&1
        echo " db"
    su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbstart" > /dev/null 2>&1
        }

oracle_stop() {
        echo -n "Stopping Oracle:"
        echo -n " db"
    su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbshut" > /dev/null 2>&1
        echo " listener"
    su - $ORACLE_OWNER -c "source /home/oracle/.bashrc;$ORACLE_HOME/bin/lsnrctl stop" > /dev/null 2>&1
}
case "$1" in
'start')
    oracle_start
    ;;
'stop')
    oracle_stop
    ;;
'restart')
    oracle_stop
    oracle_start
    ;;
*)
    echo "usage $0 start|stop|restart" ;;
esac
---end-of-rc.oracle---
Вот и всё Дополнение После накатывания 9.2.0.4-патчсета ломается экспорт Лечится это следующими действиями:
  1. Оракл переводится в startup migrate мод
  2. @?/rdbms/admin/catpatch.sql
  3. Делается shutdown и startup в normal моде
  4. connect / as sysdba 5) alter system set "_system_trig_enabled"=false;
  5. @?/rdbms/admin/catnools.sql (если у Вас в системе нет этого скрипта, возьмите его тут (file://localhost/usr/local/home/mc/file/docs/BASE/done/0/catnools.sql)
  6. @?/rdbms/admin/utlrp.sql 8) @?/rdbms/admin/prvtxdb.plb После этого экспорт будет работать. P.S. Не надо меня просить выслать вам патчи - у меня у самого нет доступа на металинк

P.P.S. Замечания, дополнения, тыканья носом приветствуются :-)

© 2003 Dmitry A. Koptev <dimez@nm.ru>

========================
catnools.sql:

Rem
Rem $Header: catnools.sql 02-may-2001.15:36:35 srtata Exp $
Rem
Rem catnools.sql
Rem
Rem Copyright (c) Oracle Corporation 2001. All Rights Reserved.
Rem
Rem NAME
Rem catnools.sql -
Rem
Rem DESCRIPTION
Rem This script drops the OLS product and all of its LBACSYS
Rem objects from a database instance. All OLS policies will
Rem also be dropped but user tables will not have their OLS
Rem policy columns automatically dropped.
Rem
Rem NOTES
Rem Must be run as SYSDBA.
Rem
Rem MODIFIED (MM/DD/YY)
Rem srtata 05/02/01 - Add error handling.

WHENEVER SQLERROR EXIT;

BEGIN

-- Check the user who is executing this script.
if sys_context('userenv','session_user') != 'SYS' then
RAISE_APPLICATION_ERROR(-20000,
'Execute the script as user SYS as SYSDBA');
end if;
END;
/

WHENEVER SQLERROR CONTINUE;


-- drop OLS database triggers.
DROP TRIGGER LBACSYS.lbac$after_drop;
DROP TRIGGER LBACSYS.lbac$startup;
DROP TRIGGER LBACSYS.lbac$logon;
DROP TRIGGER LBACSYS.lbac$after_create;
DROP TRIGGER LBACSYS.lbac$before_alter;

-- copy system.aud$ back to sys.aud$.
DROP SYNONYM aud$;
CREATE TABLE SYS.aud$ AS SELECT * FROM SYSTEM.aud$;
CREATE INDEX SYS.i_aud1 ON SYS.aud$(sessionid, ses$tid);
DROP table SYSTEM.aud$;

-- cleanup OLS by removing any roles, contexts,or synonyms
-- owned by LBACSYS.
DECLARE

CURSOR lbacroles IS
SELECT granted_role
FROM dba_role_privs
WHERE grantee = 'LBACSYS'
AND granted_role like '%_DBA'
AND admin_option = 'YES';

CURSOR lbaccontexts IS
SELECT namespace
FROM dba_context
WHERE schema = 'LBACSYS';

CURSOR lbacsynonyms IS
SELECT synonym_name
FROM dba_synonyms
WHERE table_owner = 'LBACSYS';

rolename VARCHAR2(30);

BEGIN

-- drop roles
FOR r IN lbacroles LOOP
dbms_output.put_line('Dropping role ' || r.granted_role );

BEGIN
EXECUTE IMMEDIATE 'DROP ROLE ' || r.granted_role;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Unable to drop role ' || r.granted_role);
END;

END LOOP;

-- drop contexts
FOR c IN lbaccontexts LOOP
dbms_output.put_line('Dropping context ' || c.namespace);

BEGIN
EXECUTE IMMEDIATE 'DROP CONTEXT ' || c.namespace;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Unable to drop context ' || c.namespace);
END;

END LOOP;

-- drop synonyms
FOR s IN lbacsynonyms LOOP
dbms_output.put_line('Dropping public synonym ' || s.synonym_name);

BEGIN
EXECUTE IMMEDIATE 'DROP PUBLIC SYNONYM ' || s.synonym_name;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Unable to drop synonym ' || s.synonym_name);
END;

END LOOP;

END;
/

-- now remove lbacsys account and it's content
DROP USER LBACSYS CASCADE;
DELETE FROM exppkgact$ WHERE PACKAGE = 'LBAC_UTL';
COMMIT;

REM end of catnools.sql
Оригинал: http://dimez.forexpf.ru/docs/oracle/

Статья взята с сайта OpenNET.

[ опубликовано 20/02/2004 ]

Dmitry A. Koptev (dimez@nm.ru) - Установка Oracle9i на Slackware-9.1   Версия для печати