| Q: Что мне нужно
знать про СУБД Oracle ? |
|
A: Я рекомендую собственную
:)) лекцию. Она
действительно создавалась в расчете на не
профессиональных администраторов СУБД, а
на пользователей Дозор-Джет, которые смогли
бы совместно со службой технической
поддержки решать возникающие проблемы. Т.е.
направлена на обучение только необходимым
Вам функциям. Найдите, пожалуйста, время и
прочитайте ее. Спасибо.
|
| Q: Какие
требования к настройкам СУБД есть для
работы Дозор-Джет ? |
|
A: Рассмотрим организацию,
которая получает до 1 Gb писем в день. И хочет
иметь оперативный архив глубиной 3 месяца. В
этом случае мы рекомендуем выделить под
Дозор-Джет 2 сервера:
-
Сервер разбора почты. Здесь
существенны требования к частоте
процессора и объему дисковой подсистемы.
Допустимо использовать Intel (linux) сервер.
-
Сервер СУБД. Рекомендуем
машину класcа Sun Fire, 1Gb оперативной памяти,
дисковый массив (raid).
Это общие слова по архитектуре
системы. Если Вы выдержали наши
рекомендации, то существуют следующие два
варианта: письма хранятся в СУБД,
выделенной только под эту задачу, или СУБД,
выполняющей также и другие задачи.
| Требование |
Выд. Субд |
Разделяемая СУБД |
Прим. для DBA |
| Версия СУБД |
8.1.7 (9i в бета режиме) |
8i |
Наиболее стабильно показала себя 8.1.7.4
под Sun Solaris |
| размер system tablespace |
200Mb |
Не менее 50 Mb свободного места в system |
Схема Субд содержит около 300 объектов в
зависимости от типа установки |
| размер temp tablespace |
1 Gb |
зависит от настроек sort_area_size, hash_area_size |
Выборки данных могут быть очень
существенных объемов. Предпочтительно
создать табличное простраство с помощью
команды create temporary tablespace temp2 tempfile <file name here>size
1024M extent management local; |
| размер и кол-во rollback segment tablespace |
1 Gb, 5 сегментов, 1 выделенный для batch (rb_big) |
Используйте правило |
Обычно в системе присутствует 10 сессий,
создаваемых mail -filter'ами, + соединения
ваших администраторов безопасности |
| размер и кол-во redo log'ов |
3 группы по 20 Mb каждый член группы |
|
Убедитесь, что нет ожиданий при
переключении журналов |
| режим СУБД и способ backup |
Archive Log, инкрементальный |
|
Используйте rman |
| настройки СУБД |
Мы делаем их сами |
Просмотрите следующий файл |
|
Более точные рекомендации, можно
получить, заполнив специальную анкету, а
также по результатам тестовой эксплуатации. Так
например, некоторые
параметры хранения писем, можно
определить только по результатам тестовой
эксплуатации.
|
| Q: Как
установить схему данных ДОЗОР-ДЖЕТ ? |
|
A: Прочитайте общее описание
схемы данных. Описание важнейших
параметров(формат xls), часть из них Вам придется
изменить. В целом, установка схемы данных
выглядит так: вы правите поставлеямый в
составе дозор-джет файл config.sql.template,
сохраняете eго под именем config.sql. Сама
установка выглядит так:
sqlplus /nolog @create-all
Но перед ее выполнением
обязательно прочитайте руководство
по установкеа также новости последнего
релиза.
|
| Q: Как
обеспечить хранение большого архива писем
(секционирование архива) ? |
|
A: Понятно, что большой архив
требует большого объема диска. Но как быть,
если объема диска на сервере не хватает, но
есть ленточное устройство или файловый
сервер ? Ответ - использовать опцию
секционирования. Очень подробно, теория и
практика работы с таким рахивом изложена
документе
Модуль сегментирования
архива почтовых сообщений СМАП Дозор-Джет
|
| Q: Как
определить средний размер письма ? |
|
A: Во первых постараюсь
ответить зачем это нужно. Дело в том, что мы
храним письма в oracle в объектах типа lob. У
объектов этого типа в отличии от
объектов других типов минимальный размер
данных не блок базы данных, а chunk. Выберем
большой chunk - будет работать быстро, но много
места пропадет. Выберем маленький -
медленно будет работать.
На основе опытной эксплуатации
нам удалось выяснить что у средний размер
писем в БД - 8kb. Так ли это у Вас вы можете
проверить сами:
SQL> select avg(dbms_lob.getlength(text_body)) from
text_part_t1;
Теперь можно посмотреть сколько
места у вас теряется из-за особенностей
хранения писем:
Первый запрос - реальный объем
писем
SQL>select sum(dbms_lob.getlength(text_body))
from text_part_t1.
Второй запрос сколько места
занято в БД
set serveroutput on;
begin
dba_utils.show_space(p_segname => 'TEXT_BODY_L1',
p_type
=> 'LOB');
end;
Вышеуказанные дествия можно
проделывать для самих писем (таблица message,
сегмент MESSAGE_L1), или для текстовых
представлений писем (таблица text_part_t1,
сегмент TEXT_BODY_L1)
|
| Q: Как
удалить письма из БД ? |
|
A: Я написал для этого специальный
скрипт, del_messages.sql.
Проверьте версию -- $Id:
del_messages.sql,v 1.3 2003/05/23 11:17:21 dsvolk Exp $ Пользоваться
им очень легко: sqlplus
smap/smap SQL> @del_messages.sql Проверьте
дату самого раннего письма в БД: SQL> alter session set nls_date_format = 'DD-MON-YYYY HH24 MI'; SQL> select min(timestamp) from message;
MIN(TIMESTAMP)
-----------------
22-MAY-2003 17 21 Его отличия от
стандартной утилиты таковы:
-
Скрипт удаляет письма по дате
физического попадания в БД, не проверяя
никаких меток или прав доступа. Т.е. Вы
указываете, сколько дней хранятся письма
в БД в переменной скрипта days_ago. Значение
30, обозначает, что все письма, пришедшие
за 30 дней до дня запуска скрипта будут
удалены. Если Вы запустите скрипт 23 мая 2003
года в 15 часов 16 минут, то будут удалены
все письма попавшие в БД до 23 апреля 15
часов 16 минут.
-
Используется специально
создаваемый для этой цели rollback segment, rb_big.
Это ускоряет процесс удаления писем.
Проверьте если он у Вас в БД.
SQL> SET transaction USE rollback segment rb_big;
SET transaction USE rollback segment rb_big
*
ERROR at line 1:
ORA-01534: rollback segment 'RB_BIG' doesn't exist
Если вы получили такую ошибку, то
однократно выполните такое действие:
CONNECT sys/&sys_passwd@&smap_tns
create public rollback segment rb_big storage (initial 50M next 50M maxextents
unlimited);
alter rollback segment rb_big online;
Что скрипт не делает :
Как автоматизировать этот
процесс:
|
| Q: Как
оценить свободное место для писем ? |
|
A: Что бы оценить сколько места у
Вас в БД можно воспользоваться скриптом free_space.sql
(тоже что показывает монитор).
TABLESPACE_NAME Mb
------------------------------ ----------------------------
SMAP13_DICT 255
SMAP13_INDEXES 700
SMAP13_MESSAGES 2,600
SMAP26 430
SMAP26_DICT 82
SMAP26_INDEXES 235
SMAP26_MESSAGES 3,050
SMAPD1 440
SMAPD_DICT 82
SMAPD_INDEXES 235
SMAPD_MESSAGE1 200
Можно также
воспользоваться более продвинутым
вариантом мониторинга tabspacen.sql
c псевдографикой :)). Здесь дается
распределением места в датафайлах и даются
доп характеристики табличного пространства.
Name File Name Size Used
-------------------- --------------------------------------------- -------------------- --------------------
SMAP_SERGEY_MESSAGE /jet2/DVP/oradata/smap_sergey_message_01.dbf 2,048,000K 972,800K
SYSTEM /jet/oracle/oradata/DVP/system01.dbf 409,600K 369,856K
TEMP /jet/oracle/oradata/DVP/temp01.dbf 1,024,000K 72K
TEMP /jet2/DVP/oradata/temp02dvp.dbf 512,000K 136K
TOOLS /jet/oracle/oradata/DVP/tools01.dbf 204,800K 456K
Tablespace definitions
Name Init Next %Inc Min Max Stat Percent full
-------------------- ---------------- ---------------- ---- ---------------- ---------------- ---- ------------------------------
DIMITRI 40,960 40,960 50 1 505 OnL |*********** |
DIMITRI_TMP 40,960 40,960 50 1 505 OnL |
DRSYS 65,536 65,536 50 1 2,147,483,645 OnL |* |
EUL 40,960 40,960 50 1 505 OnL | |
MPB 2,097,152 2,097,152 0 1 2,147,483,645 OnL | |
MPB_DICT 106,496 106,496 0 1 2,147,483,645 OnL |***** |
MPB_INDEXES 5,242,880 5,242,880 0 1 2,147,483,645 OnL |********** |
MPB_MESSAGES 52,428,800 52,428,800 0 1 2,147,483,645 OnL |******* |
PERFSTAT 40,960 40,960 50 1 505 OnL |*************************** |
RBS 524,288 524,288 50 8 4,096 OnL |**** |
Но если Вы
удаляете записи из БД, этот скрипт
продолжает показывает старые данные. Это
потому, что после удаления записей, место
освобождается в таблицах, а не в табличных
пространствах. Чтобы приблизительно
оценить, сколько писем еще сможет
поместиться в БД выполните следующую
операцию: smap13@DVP8.1.7> analyze table message compute statistics;
Table analyzed. smap13@DVP8.1.7>
set serveroutput on;
smap13@DVP8.1.7> exec dba_utils.show_space('MESSAGE');
Free Blocks :329
Total Blocks :1280
Total Bytes :10,485,760
Unused Blocks :484
Unused Bytes :3,964,928
Last Used Ext FileId :28
Last Used Ext BlockId:2569
Last Used Block :796 Free
Blocks - сколько блоков Oracle свободно в таблице
(1 блок - 8192 байта) Total Blocks -
сколько всего Unused Blocks - блоки
в которых еще никогда не было записей. Запишите
эти числа. Посчитайте кол-во писем в БД. smap13@DVP8.1.7>
select count(*) from message;
COUNT(*)
----------
63610
Теперь оценим что 1 письмо
занимает select
(1280 - 329 - 484 )*8192/63610 from dual (1280-329-484)*8192/63610
-------------------------
60.1424933 байт. Значит мы можем еще
принять примерно select
(329 + 484)*8192/60 from dual; (329+484)*8192/60
-----------------
111001.6 писем. Надо
понимать что это грубая оценка, основанная
на предположении о равномерности типов
писем в будущем . Т.е. примерно 111 тыс писем. Возвращаясь
к свободному месту в табличном
пространстве. Если его нет вообще, то даже
при регулярном удалении писем и
перестройке индексов (!) нельзя
исключить ситуации, когда Вам придет писем
чуть больше чем Вы ожидали. Поэтому,
правильной ситуацией является когда 5% от
размера табличного пространства
свободно. |
| Q: Какие
регламентные работы я должен проводить с
СУБД ? |
|
A: Практика показывает что, в
порядка частоты возникновения проблем:
Например
так: select min(timestamp) from message. Следите за
свободным местом.
Проверять что проводиться
анализ данных. select distinct (last_analyzed) from
user_tables. Дата должна отстоять от текущей не
более чем на 7 дней.
Проверять, выполнился
ли backup СУБД.
Проверять протокол СУБД
$ORACLE_HOME/admin/SMAP/alertSMAP.log на предмет сообщений
ORA**
Если Вам интересен
полный список работ Oracle DBA, см. здесь |
| Q: В
чем разница между 2 вариантами полнотекстового поиск по телам
писем ? |
|
A: При установке системы сразу
есть возможность указать, хотите ли Вы
выполнять полнотекстовый поиск по типам
индексов. При это можно выбирать из двух
типов индексов - индекс с использованием
Russian Context Optimizer ver 4.0 (RCO) и
обычный Context (Oracle Text) индекс. Давайте
разберемся, чем же они различаются и чего
это стоит.
Основное отличие - RCO позволяет
производить поиск и хранение индекса с
учетом морфологии русского языка. Реализован RCO как фильтр в и терминологии
Context Options.
Сравнение индекса построенного с
помощью RCO и обычного контекстного
индекса производилось на
следующем массиве данных:
SQL> set serveroutput on
SQL> analyze table text_part_t1 estimate statistics sample 10 percent;
SQL> exec dba_utils.show_space ('text_body_l1', user, 'LOB');
Free Blocks :0
Total Blocks :44800
Total Bytes :367,001,600
Unused Blocks :1038
Unused Bytes :8,503,296
Last Used Ext FileId :72
Last Used Ext BlockId:6409
Last Used Block :5364
SQL> select count(*) from text_part_t1;
COUNT(*)
----------
9617
RCO строил индекс 27 минут 25 сек,
индекс занял
SQL> exec dba_utils.show_space ('text_part_i1',
user, 'INDEX');
============================================================
Space usage of Text Index: SMAP13.TEXT_PART_I1
============================================================
TABLE_NAME = DR$TEXT_PART_I1$I
TABLESPACE NAME = SMAP13_DICT
ALLOCATED BLOCKS = 2860
ALLOCATED BYTES = 23,429,120 ( 22.34Mb)
USED BLOCKS = 2857
USED BYTES = 23,404,544 ( 22.32Mb)
------------------------------------------------------------
TABLE_NAME = DR$TEXT_PART_I1$R
TABLESPACE NAME = SMAP13_DICT
ALLOCATED BLOCKS = 13
ALLOCATED BYTES = 106,496 ( 0.10Mb)
USED BLOCKS = 2
USED BYTES = 16,384 ( 0.02Mb)
------------------------------------------------------------
============================================================
TOTAL ALLOCATED BLOCKS = 2873
TOTAL ALLOCATED BYTES = 23,535,616 ( 22.45Mb)
TOTAL USED BLOCKS = 2859
TOTAL USED BYTES = 23,420,928 ( 22.34Mb)
Запускаем умышленно не сложный
запрос
1188 rows selected.
Elapsed: 00:00:00.43
Обычный запрос был построен за 4
мин 30 сек, и занял место
SQL> exec dba_utils.show_space ('text_part_i1',
user, 'INDEX');
============================================================
Space usage of Text Index: SMAP13.TEXT_PART_I1
============================================================
TABLE_NAME = DR$TEXT_PART_I1$I
TABLESPACE NAME = SMAP13_DICT
ALLOCATED BLOCKS = 4160
ALLOCATED BYTES = 34,078,720 ( 32.50Mb)
USED BLOCKS = 4152
USED BYTES = 34,013,184 ( 32.44Mb)
------------------------------------------------------------
TABLE_NAME = DR$TEXT_PART_I1$R
TABLESPACE NAME = SMAP13_DICT
ALLOCATED BLOCKS = 13
ALLOCATED BYTES = 106,496 ( 0.10Mb)
USED BLOCKS = 2
USED BYTES = 16,384 ( 0.02Mb)
------------------------------------------------------------
============================================================
TOTAL ALLOCATED BLOCKS = 4173
TOTAL ALLOCATED BYTES = 34,185,216 ( 32.60Mb)
TOTAL USED BLOCKS = 4154
TOTAL USED BYTES = 34,029,568 ( 32.45Mb)
Запускаем запрос:
31 rows selected.
Elapsed: 00:00:00.11
Число записей изменилось ! Это
объясняется тем, что я создавал RCO
нормализуя русский язык.
Выводы:
RCO индекс создается медленнее чем
обычный. Думаю, что разница все же составит
не в 5 раз, а меньше в реальных условиях. По
объему он соотноситься как 2/3 от
стандартного и с ростом данных отрыв будет
увеличиваться. Соотношение объемов данные/индекс
как 10/1 в реальных условиях, как мне кажется,
сохраниться и во многом зависит от словаря
стоп-слов.
Тем не менее, несмотря на время
построения RCO индекса он предоставляет
возможности, не воспользоваться которыми
обидно и досадно.
Под реальными условиями я
подразумеваю реальный почтовый поток.
Тестирование происходило на
машине HP-UX alpha B.11.00 U 9000/800, 1 CPU 440 MHz, HDD 2*36
Gb, RAM 1 Gb.
Есть еще такие данные:
-
За 21 час было проиндексировано 377400,
после постройки индекса он создавался 6
часов.
-
6,5 Gb объем текстового поля,
число записей 147936, объем индекса при этом
5,6 Gb
|
| Q:
Настраиваем RCO ? |
|
A: У компании RCO действительно
хорошая документация. Там есть все. Есть
даже подготовленные скрипты. Но так кратко
написано, что иногда хочется разобраться
заново самому :((.
Итак, из документа " Руководство
администратора Установка и настройка Russian
Context Optimizer ver 4.0 Unix нам приходит знание, что
для того чтобы индексация по выбранной нами
таблице происходила нужно запустить
процесс rco_lsnr. Что он делает - нам неизвестно.
Могу только догадываться, что идея была в
том, что образованием словоформ занимается
один выделенный сервер (в нашем случае это и
есть rco_lsnr), а фильтры, вызываемые Intermedia
общаются с этим сервером. Но это не так !
Оказывается индексация и поиск
документов (т.е фильтры RCO) прекрасно
работают без всякого rco_lsnr, достаточно лишь
обычного ctxsrv !
Зачем же нужен rco_lsnr ?
Вот если мы захотим
воспользоваться функциями API rco, скажем (пример
из документации RCO)
SET SERVEROUTPUT ON
DECLARE str VARCHAR2(128);
BEGIN
str := rco_context.WordGetExtensions('президент', 'dsvolk');
DBMS_OUTPUT.PUT_LINE(str);
END;
/
(настройка dsvolk было создана
заранее в соответствии с документацией),
То получим сообщение об ошибке:
DECLARE str VARCHAR2(128);
*
ERROR at line 1:
ORA-20100: RCO_CONTEXT.WordGetExtensions failed -
ORA-06512: at "CTXSYS.RCO_CONTEXT", line 67
ORA-06512: at "CTXSYS.RCO_CONTEXT", line 326
ORA-06512: at line 4
И только тогда придет время
запускать rco_lsnr
Итак, я нахожусь в директории
$RCO_HOME (обычно это $ORACLE_HOME/rco)
cat admin/rco_lsnr_dsvolk
#!/bin/ksh
DOC_FORMAT="TEXT or HTML"; export DOC_FORMAT
RCO_SETTING_NAME=dsvolk; export RCO_SETTING_NAME
INCHARSET=CL8KOI8R; export INCHARSET
OUTCHARSET=CL8KOI8R; export OUTCHARSET
RCO_TRACE_LEVEL=DEBUG; export RCO_TRACE_LEVEL
$RCO_HOME/bin/rco_lsnr -user $1
# End mk_lsnr section
admin/rco_lsnr_dsvolk &
[1] 3427
oracle@alpha:~/RCO40/installation} cd log/
[1]+ Exit 4 admin/rco_lsnr_dsvolk (wd: ~/RCO40/installation)
(wd now: ~/RCO40/installation/log)
oracle@alpha:~/RCO40/installation/log} ls
rco_lsnr_3428.err
oracle@alpha:~/RCO40/installation/log} ls -l
total 1
-rw-r--r-- 1 oracle dba 309 Oct 14 19:03 rco_lsnr_3428.err
oracle@alpha:~/RCO40/installation/log} less rco_lsnr_3428.err
INFO: 19:03:43 14.10.03 ----------------------------------
Starting RCO listener service
DEBUG: 19:03:43 14.10.03 RCO_HOME = /jet/oracle/RCO40/installation/
ERROR: 19:03:43 14.10.03 Main: The number of main args is not equal 2
Actual number of args = 2, Proper number = 3 or 1
Ага, хорошая новость - ведутся
логи, это потому что мы указали RCO_TRACE_LEVEL=DEBUG.
(по умолчанию MEDIUM). Плохая новость - забыли
подать аргументы - имя/пароль пользователя
под которым присоединиться к БД. Зачем это
нужно процессу rco_lsnr ? Могу только
догадываться, что ему нужны детали нашей
settings (dsvolk в нашем случае). Почему нельзя
было их положить во внешнем файле - тоже
неясно. Ну ладно. Так сделано, значит так
нужно.
Подаем аргументы,
admin/rco_lsnr_dsvolk smap/smap &
Смотрим в logfile:
Среди прочего:
CloseSem: failed to unlink semaphore semRCO_152_RQNew
Это сообщение можно игнорировать.
INFO: 19:27:51 14.10.03 Waiting for request ...
Это успех нашего предприятия.
Теперь повторяя наш pl/sql код получаем
ПРЕЗИДЕНТ=ПРЕЗИДЕНТА=ПРЕЗИДЕНТАМ=ПРЕЗИДЕНТАМИ=ПРЕЗИДЕНТАХ=ПРЕЗИДЕНТЕ=ПРЕЗИДЕНТОВ
=ПРЕЗИДЕНТОМ=ПРЕЗИДЕНТУ=ПРЕЗИДЕНТЫ
Общая рекомендация - поставить
после отладки RCO_TRACE_LEVEL=MEDIUM, поскольку
иначе в ответ на каждый запрос в
директории log рождаются файлы.
|
| Q: Как
мне оценить распределение писем в БД по
объему ? |
|
A: По объему во времени удобно
использовать файл mstat.sql.
Его вывод выглядит так:
smap13@DVP8.1.7> @mstat
Date Count Size Kb
------------------------- ------- -------------------
01/08/2003 7 1,626.57
31/07/2003 2024 99,487.54
30/07/2003 12 1,232.17
29/07/2003 2433 87,991.98
28/07/2003 112 13,361.84
25/07/2003 1 234.21
24/07/2003 861 30,327.06
23/07/2003 5 1.07
22/07/2003 6 2.99
21/07/2003 21 288.82
17/07/2003 2 241.82
16/07/2003 5 3.06
15/07/2003 1004 48,863.03
13 rows selected.
Первая колонка - дата, вторая кол-во писем,
третья - их объем.
С другой стороны может быть интересно
найти самые большие письма по объему за всю
историю БД. Это удобно выполнить с помощью
скрипта topm.sql
smap13@DVP8.1.7> @topm
Message Id Date Size Kb
------------ ------------------------- -------------------
1971 24/07/2003 2,938.98
893 15/07/2003 2,788.63
1970 24/07/2003 2,788.63
5439 31/07/2003 2,788.63
4401 29/07/2003 2,788.63
3035 29/07/2003 2,788.63
6438 31/07/2003 2,788.63
896 15/07/2003 2,691.42
4404 29/07/2003 2,691.42
Первая колонка id письма, вторая - дата
поступления в БД, третья - объем письма в Кб.
По умолчанию, показывается наибольшие 10
писем. Если Вам это не подходит, измените
параметр topN в скрипте.
|
| Q:
Как добавить графику в СМАП ? |
|
Вернее будет, как мне отобразить
графически результаты запросов СМАП ?
A: Попробую показать на примере распределения
писем по объему во времени.
1. Войти как sys, посмотреть в какое
значение установлена переменная utl_file_dir
SQL> conn sys/manager
Connected.
SQL> show parameter utl_file_dir
NAME TYPE VALUE
------------------------------------ ------- --------------------
utl_file_dir string /tmp
У меня в /tmp. Исправить это можно,
установив utl_file_dir = <you_directory> в init.ora. Если
хотите иметь возможность писать в
произвольную директорию поставьте там *.
Это значит, что вы сможете писать в любую
директорию, к которой имеет доступ
пользователь oracle.
Проверим:
bear% touch /tmp/text.slk
bear%
Без ошибок. Ок.
Установим пакет owa_sylk.
SQL>@owa_sylk.sql
....
Package created.
No errors.
Package body created.
No errors
Поправим gmstat.sql (модернизированная
версия mstat.sql)
define dir='/tmp' -- Должна быть такая
же как и utl_file_dir
define file='mstat.slk' -- имя файла куда писать
результат
:sql := 'select trunc(m.timestamp) timestamp, count(*) mcount, sum(dbms_lob.getlength(value))/1024 msize from message m, message_label l
where l.message = m.id and l.type = 1 group by trunc(m.timestamp) order by 1
asc'; -- А это сам запрос
Запускаем скрипт, полученный файлик mstat.slk (файлик
на сервере СУБД !!) выглядит так
ID;ORACLE
P;FCourier New;M200
P;FCourier New;M200;SB
P;FCourier New;M200;SUB
F;C1;FG0R;SM1;G
F;C2;FG0R;SM0
F;C3;FG0R;SM0
F;C4;FG0R;SM0
...
Открываем его с помощью Excel,
выделяем колонку дат и колонку объема писем,
запускаем визард - вот результат
|
|