Tuesday, November 28, 2006

LOGON_TIME, для трассировки сессий, запущенных на одном хосте

Если пользователи используют базу через вебинтерфейс приложения, запущенного под каким-то пользователем 'user', то можно использовать хотя бы LOGON_TIME для идентификации sid'а интересующей сессии, по которой нужно сделать трассировку.
Например, для включения трассировки своей сессии, запускаем веб-приложение, регистрируемся и включаем трассировку след.образом:
select sid,serial#,osuser,TO_CHAR(logon_time, 'DD.MM.YYYY HH24:MI') "logon_time" from v$session where osuser='user';

Определяем по logon_time свою сессию и включаем трассировку своей сессии
exec sys.dbms_system.set_ev(sid,serial,10046,12,'');
и повторяем проблемные "щелчки", о которых сообщил юзер


===========
Также полезно использовать триггер after logon на включение трассировки
(после трассировки не забыть отключить его через alter trigger trace_login_trigger disable)
CREATE OR REPLACE TRIGGER trace_login_trigger
AFTER logon ON DATABASE
BEGIN
IF (USER = <'USERNAME'>) THEN
EXECUTE IMMEDIATE 'ALTER SESSION SET EVENTS ''10046 trace name
context forever, level 12';
END IF;
END;

Про snapshots

Правильно ли я понял на опыте сегодняшнего дня, что у snapshots '?' - дифференциальное обновление, 'c' - полное обновление, например,
дифференциальное - BEGIN DBMS_SNAPSHOT.REFRESH('schema.SNP_BRANCH','?'); END;
полное - BEGIN DBMS_SNAPSHOT.REFRESH('schema.SNP_BRANCH','С'); END;

Saturday, November 18, 2006

По установке Oracle 10GR2 в Linux (John Smiley & Tim)

Step-by-step установки Oracle 10.2.0.2 [ 3 | 4 ] на Centos 4.2[4]. (или Enterprise Linux Unbreakable)
на основе
Installing Oracle Database 10g Release 2 on Linux x86, by John Smiley


Предполагается установка патчсета 10.2.0.2 [ 3 | 4 ] и создание новой базы данных, поэтому рассматривается установка без апргейда работающей в 10.2.0.1 БД.
ASM для новой базы данных сконфигурен без ASMlib, на rawdevices.

В примерах далее в выражениях "<<" My уберите кавычки.

Установка и настройка CentOS по дефолту со swap-разделом в 1,5 (или в 2, см.доку) объема RAM, достаточным количеством дискового пространства, c установкой X-ов, Gnome, sysstat, mc etc.
При дисковом пространстве на 12 Gb и RAM на 1024 Мб я выделил разделы след. образом: /boot - 100 мб swap - 1600 мб / - 7 Gb остальное оставил "сырым" под rawdevices.
Без выделения /usr, /var, /tmp , т.е. все будет "валиться" в корень /.
Сразу после установки CentOS в консоли сервера.

1) Т.к. мой сервер под Oracle находится в защищенной сетке для удобства сразу открываю ssh для root (в /etc/ssh/sshd_config раскомментировать строку PermitRootLogin yes), для нормального отображения системных шрифтов в mc правлю /etc/sysconfig/i18n удалением UTF-8 так, что остается LANG="en_US", SUPPORTED="en_US:en"

2) Для последующей установки Oracle через X разрешаю протокол XDMCP (если лень лезть в конфиги, то в GNOME достаточно просто включить галочку в "Applications-System Setting-Login Screen-XDMCP").
Если есть под рукой XManager, то можно не включать XDMCP, а подключаться через XStart XManager’а.

3) Далее удобнее работать в ssh-сессии через putty под root-ом.

Установить все необходимые пакеты (copy-paste).

# rpm -q binutils compat-db control-center gcc gcc-c++ glibc glibc-common gnome-libs libstdc++ libstdc++-devel make pdksh sysstat xscreensaver libaio openmotif21

В моем случае не хватало libaio и openmotif21, о чем сообщил мне запрос
package libaio is not installed package openmotif21 is not installed и я их доустановил прямо из директории CentOS/RPMS дистрибутивного диска (copy-paste).

# rpm -Uvh openmotif21-2.1.30-11.RHEL4.6.i386.rpm libaio-0.3.105-2.i386.rpm

Также опыт показал, что во время установки Oracle возникает ошибка, если не установлен пакет compat-libstdc++ . Поэтому необходимо проверить ее наличие (copy-paste)

# rpm -ql compat-libstdc++-33-3.2.3-47.3

Если no installed, то установить из rpm-ов
# rpm -i compat-libstdc++-33-3.2.3-47.3.i386.rpm
(в Enterprise Linux 4.4 # rpm -Uvh compat-libstdc++-296-2.96-132.7.2.i386.rpm)

И удостовериться, что все доступно в системе
# rpm -ql compat-libstdc++-33-3.2.3-47.3 /usr/lib/libstdc++.so.5 /usr/lib/libstdc++.so.5.0.7

Конфигурирование Linux для установки Oracle

1) Заведение групп oinstall, dba и пользователя oracle (copy-paste)
# /usr/sbin/groupadd -g 502 oinstall
# /usr/sbin/groupadd -g 503 dba
# /usr/sbin/useradd -m -u 501 -g dba -G oinstall oracle

Проверка id и gid
# id oracle uid=501(oracle) gid=502(oinstall) groups=502(oinstall),503(dba)

Установка пароля passwd oracle через:
# passwd oracle

2) Создание директорий по OFA (copy-paste)
# mkdir /oracle
# chown -R oracle:oinstall /oracle
# chmod -R 775 /oracle

3) Конфигурирование параметров ядра (через copy-paste)
# cat >> /etc/sysctl.conf
 <<
MYEOF
kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=262144
net.core.wmem_max=262144
MYEOF
Проверить /sbin/sysctl -p

4) Установить Shell-лимиты для юзера oracle

#/bin/sh
cat >> /etc/security/limits.conf
 <<
MYEOF
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
MYEOF

# cat >> /etc/pam.d/login
 <<
MYEOF
session required /lib/security/pam_limits.so
MYEOF


# cat >> /etc/profile
 <<
MYEOF
if [ \$USER = "oracle" ]; then
if [ \$SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
MYEOF

# cat >> /etc/csh.login
 <<
MYEOF
if ( \$USER == "oracle" ) then
limit maxproc 16384
limit descriptors 65536
umask 022
endif
MYEOF


# cat >> /etc/profile
 <<
MYEOF
if [ \$USER = "oracle" ]; then
if [ \$SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
MYEOF

# cat >> /etc/csh.login
 <<
MYEOF
if ( \$USER == "oracle" ) then
limit maxproc 16384
limit descriptors 65536
umask 022
endif
MYEOF


Установка Oracle из графического окна.
….

=====
По созданию ASM на базе Rawdevices (взял здесь )
# ls /dev/sd*
sda sda1 sda2 sdb sdc sdd
# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.

The number of cylinders for this disk is set to 1305.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1305, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1305, default 1305):
Using default value 1305

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
#
====
После рестарта появился девайс /dev/sda4
# fdisk -l
Disk /dev/sda: 12.8 GB, 12884901888 bytes
255 heads, 63 sectors/track, 1566 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 778 6144862+ 83 Linux
/dev/sda3 1306 1566 2096482+ 82 Linux swap
/dev/sda4 779 1305 4233127+ 83 Linux

Partition table entries are not in disk order

Создаем директорию /dev/raw
# mkdir -p /dev/raw

и в файл /etc/sysconfig/rawdevices прописываем
/dev/raw/raw1 /dev/sda4
и делаем
# service rawdevices restart

Появился диск /dev/raw/raw1, к которому мы назначим хозяина и атрибуты
# chown oracle:dba /dev/raw/raw1
# chmod 660 /dev/raw/raw1

Также, чтобы после перезагрузки сервера атрибуты сохранились, добавим эти же строки в /etc/rc.local
# cat >> /etc/rc.local
 <<
My
chown oracle:dba /dev/raw/raw*
chmod 600 /dev/raw/raw*
My

Под рутом
# /oracle/product/10.2.0/db_1/bin/localconfig add

Затем создаем ASM-инстанс - для этого: ИЛИ запускаем GUI под юзером oracle, запускаем dbca и начинаем создание ASM-инстанса
Почему не вручную? Не вижу смысла создавать директории и файлы вручную, если так и так установка Oracle была из GUI.

Но ...
ИЛИ ВРУЧНУЮ на основе 2 статей Manually Creating an ASM Instance и Adventures in ASM (copy/paste)
# su - oracle
$ orapwd file=$ORACLE_HOME/dbs/orapw+asm password=my_passwd
$ mkdir -p $ORACLE_BASE/admin/+asm/bdump
$ mkdir -p $ORACLE_BASE/admin/+asm/cdump
$ mkdir -p $ORACLE_BASE/admin/+asm/hdump
$ mkdir -p $ORACLE_BASE/admin/+asm/pfile
$ mkdir -p $ORACLE_BASE/admin/+asm/udump

$ cat > $ORACLE_BASE/admin/+asm/pfile/init.ora
 <<
MY
*.background_dump_dest='/oracle/admin/+asm/bdump'
*.core_dump_dest='/oracle/admin/+asm/cdump'
*.instance_type='asm'
*.large_pool_size=12M
*.remote_login_passwordfile='SHARED'
*.user_dump_dest='/oracle/admin/+asm/udump'
MY

$ ln -s $ORACLE_BASE/admin/+asm/pfile/init.ora $ORACLE_HOME/dbs/init+asm.ora

$ export ORACLE_SID=+asm
# sqlplus "/ as sysdba"

SQL> startup
ASM instance started

Total System Global Area 75497472 bytes
Fixed Size 777852 bytes
Variable Size 74719620 bytes
Database Buffers 0 bytes
Redo Buffers 0 bytes
ORA-15110: no diskgroups mounted

SQL> create spfile from pfile;
SQL> alter system set asm_diskstring = '/dev/raw/raw*' scope=both;
SQL> alter system set asm_diskgroups = 'ASM_DATA' scope=both;
SQL> create diskgroup asm_data external redundancy disk '/dev/raw/raw1';

Полезно добавить в SQLPATH скриптик login.sql
==================
login.sql
set serveroutput on size 1000000
set trimspool on
set long 5000
set linesize 900
set pagesize 9999
column plan_plus_exp format a80
column global_name new_value gname
set termout off
define gname=+asm
column global_name new_value gname
select lower(user) || '@' || substr(global_name,1,
decode( dot, 0, length(global_name), dot-1) ) global_name
from (select global_name, instr(global_name,'.') dot from global_name );
set sqlprompt '&gname> '
set termout on

Thursday, November 16, 2006

Скоро на Сахалин!

Скоро еду отработать в Южносахалинск. Возлагаю большие надежды, что все пройдет нормально и готовлюсь сейчас к этой работе. Нужно перевести базу на новый сервер, проапгрейдить СУБД до 10GR2 и немного (при помощи snapshots) изменить логику базы данных.