Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / И снова Logminer / 15 сообщений из 15, страница 1 из 1
04.12.2002, 14:25
    #32075618
babay
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова Logminer
Наверное что-то с руками не так:-)

Пытаюсь создать словарь
execute dbms_logmnr_d.build('dict.ora', 'd:\oracle\admin\ds\logs');
Некоторое время он сервак думает, а затем выдает сообщение
ORA-06532: Subscript outside of limit
ORA-06512: at "SYS.DBMS_LOGMNR_D", line 793
ORA-06512: at line 2
Причем файл при этом создается, но, как я понимаю, в него попадают не все объекты.
На другой БД все прекрасно работает.
Подскажите, кто занет. Заранее благодарен.
...
Рейтинг: 0 / 0
05.12.2002, 08:51
    #32075872
babay
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова Logminer
Если закомментировать строку 793 в sys.dbms_logmnr_d.build, то процедура больше ошибок не выдает. Но вот правильно ли это? Подскажите кто знает, please!
...
Рейтинг: 0 / 0
05.12.2002, 09:21
    #32075891
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова Logminer
Я думаю в оракловых пакетах ничего трогать не надо.
Перед вызовом процедуры build() для создания файла словаря LigMiner необходимо установить среду её использования, с помощью параметра utl_file_dir.
Выставлен ли у тебя этот параметр?:
utl_file_dir='d:\oracle\admin\ds\logs'
Если не установлен, надо установить, после чего обязательнонужно перезагрузить БД.

Проверте также, не существует ли уже файл d:\oracle\admin\ds\logs\dict.ora
...
Рейтинг: 0 / 0
05.12.2002, 09:40
    #32075899
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова Logminer
Пришли мне на ящик свой файл dbmslmd.sql
...
Рейтинг: 0 / 0
05.12.2002, 09:42
    #32075900
babay
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова Logminer
В init.ora выставлен utl_file_dir, БД перегружалась. Файл dict.ora создается каждый раз при вызове dbms_logmnr_d.build(), однако я могу его удалить руками.
...
Рейтинг: 0 / 0
05.12.2002, 10:32
    #32075936
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова Logminer
Судя по тексту пакета(который есть у меня для 8.1.7.3), такая картина:
1) В пакете dbms_logmnr_d есть следующая функция:
Код: plaintext
1.
2.
FUNCTION   get_column_description (
                in_Table_Name IN VARCHAR2 )

В которой есть курсор который возвращает список столбцов для указанной таблицы in_Table_name:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CURSOR obj_cols is
  SELECT col.name, col.length,
      decode(col.type#,  1 , decode(col.charsetform,  2 , 'NVARCHAR2', 'VARCHAR2'),
       2 , decode(col.scale, null,
               decode(col.precision#, null, 'NUMBER', 'FLOAT'),
               'NUMBER'),
       8 , 'LONG',
       9 , decode(col.charsetform,  2 , 'NCHAR VARYING', 'VARCHAR'),
       12 , 'DATE',  23 , 'RAW',  24 , 'LONG RAW',
       69 , 'ROWID',
       96 , decode(col.charsetform,  2 , 'NCHAR', 'CHAR'),
       105 , 'MLSLABEL',
       106 , 'MLSLABEL',
       111 , o.name,
       112 , decode(col.charsetform,  2 , 'NCLOB', 'CLOB'),
       113 , 'BLOB',  114 , 'BFILE',  115 , 'CFILE',
       121 , o.name,
       122 , o.name,
       123 , o.name,
      'UNDEFINED')
  FROM sys.col$ col, sys.obj$ o
  WHERE col.obj# = o.obj# and o.name = in_Table_Name and
    col.type# not in ( 113 ) and o.owner# =  0 
  ORDER BY col.col#;

2)Далее в цикле в функции get_column_description считывается этот курсор:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
LOOP
 --
 
 --
 
    FETCH obj_cols
        INTO col_test_array(col_count).col_name,
             col_test_array(col_count).col_datalength,
             col_test_array(col_count).col_datatype;
        EXIT objcol_loop  WHEN obj_cols%NOTFOUND;

    col_count := col_count +  1 ;
    EXIT WHEN col_count =  513 ;
 --
 
END LOOP objcol_loop;


При считывании этого курсора данные о столбцах помещаются в массив VARRAY, который был описан в начале пакета:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 /* column count of largest table we touch */ 
 /* if new tables are added to Flatfile    */ 
 /* check column count against this number */ 
MAX_TABLE_COLUMNS CONSTANT INTEGER :=  38 ;
 --
 
TYPE col_desc_array IS VARRAY( 38 ) OF col_description;
 --
 
col_test_desc col_description;
 --
 
col_test_array col_desc_array := col_desc_array();  -- initialize empty varray
 


Ошибка которая у тебя происходит:"ORA-06532: Subscript outside of limit " означает что происходит обращение за границу массива, в данном случае масива col_test_array.
Из определения видно, что он расчитан на максимальное кол-во столбцов таблицы = 38.

Отсюда вывод: ошибка происходит при вызове функции get_column_description() для таблицы у которой более 38 столбцов.
Эта функция в свою очередь вызывается из другой функции: record_table().
А функция record_table() вызывается для конкретных таблиц(видно из текста пакета):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
  record_table_result := record_table('OBJ$',
                            'WHERE type# != 4 AND type# != 5 AND type# != 7 AND type# != 8
                            AND type# != 9 AND type# != 10 AND type# != 22');
 --
 
  record_table_result := record_table('TAB$', '');
 --
 
  record_table_result := record_table('COL$', '');
 --
 
  record_table_result := record_table('SEG$', '');
 --
 
  record_table_result := record_table('UNDO$', '');
 --
 
  record_table_result := record_table('UGROUP$', '');
 --
 
  record_table_result := record_table('TS$', '');
 --
 
  record_table_result := record_table('CLU$', '');
 --
 
  record_table_result := record_table('IND$', '');
 --
 
  record_table_result := record_table('ICOL$', '');
 --
 
  record_table_result := record_table('LOB$', '');
 --
 
  record_table_result := record_table('USER$', '');
 --
 
  record_table_result := record_table('FILE$', '');
 --
 
  record_table_result := record_table('PARTOBJ$', '');
 --
 
  record_table_result := record_table('PARTCOL$', '');
 --
 
  record_table_result := record_table('TABPART$', '');
 --
 
  record_table_result := record_table('INDPART$', '');
 --
 
  record_table_result := record_table('SUBPARTCOL$', '');
 --
 
  record_table_result := record_table('TABSUBPART$', '');
 --
 
  record_table_result := record_table('INDSUBPART$', '');
 --
 
  record_table_result := record_table('TABCOMPART$', '');
 --
 
  record_table_result := record_table('INDCOMPART$', '');


Тебе необходимо выяснить какое максимальное кол-во столбцов может быть для указанных таблиц и выставить это значения для(вместо 38):
Код: plaintext
1.
2.
MAX_TABLE_COLUMNS CONSTANT INTEGER :=  38 ;
TYPE col_desc_array IS VARRAY( 38 ) OF col_description;


Определить какие таблицы имеют более 38 столбцов можно выяснить запросом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select table_name,count(*)
from
dba_tab_columns
where
 owner = 'SYS' and
 table_name like '%$'
group by table_name
having count(*) >  38 ;
order by count(*) desc


Ищи среди них выше указанные таблицы и определишь.
Потом в пакете поменяй макс. значение в файле dbmslmd.sql и выполни его.
...
Рейтинг: 0 / 0
05.12.2002, 11:05
    #32075957
babay
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова Logminer
У меня версия 8.1.7.0. Насколько я понимаю, пакеты у нас различаются. Упоминания "38" в моем пакете нет, запрос тоже не выдает ни одной таблицы.
TYPE col_desc_array IS VARRAY( 513 ) OF col_description;
...
Рейтинг: 0 / 0
05.12.2002, 11:15
    #32075967
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова Logminer
Вышли свой dbmslmd.sql
...
Рейтинг: 0 / 0
05.12.2002, 11:16
    #32075968
babay
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова Logminer
да я уж выслал минут 40 назад
...
Рейтинг: 0 / 0
05.12.2002, 11:38
    #32075987
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова Logminer
1)Вначале попробуй следующее:
перед вызовом execute dbms_logmnr_d.build('dict.ora', 'd:\oracle\admin\ds\logs'),
сделай set serveroutput on;
Выполняй или в SQLWorksheet или в SQL*Plus. Это даст более точно понять какая ошибка. Должно быть сообщение типа:ERROR <.........>
Сообщение кинь в форум. Потом попробуй пункт 2.
2)
Что-бы понять в какой строке происходит исходная ошибка, закомментарь временно следующий блок в файле, замени пакет и вновь попробуй:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 --  EXCEPTION
 
     -- Create Exception to simply display error code and message
 
 --    WHEN OTHERS THEN
 
 --        DBMS_OUTPUT.PUT_LINE
 
 --      (%af_src_str_0 || SQLCODE || %af_src_str_1 || SQLERRM);
 
 --        NULL;
 
 --    COMMIT;
 
 --    RAISE;
 
 --
 
 --    UTL_FILE.FCLOSE(dict_filehandle);
 
...
Рейтинг: 0 / 0
05.12.2002, 12:11
    #32076015
babay
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова Logminer
Сообщение SQLPlus с исходным текстом пакета:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
LogMnr Dictionary Procedure started
LogMnr Dictionary File Opened
TABLE: OBJ$ recorded in LogMnr Dictionary File
TABLE: TAB$ recorded in LogMnr Dictionary File
TABLE: COL$ recorded in LogMnr Dictionary File
TABLE: SEG$ recorded in LogMnr Dictionary File
TABLE: UNDO$ recorded in LogMnr Dictionary File
TABLE: UGROUP$ recorded in LogMnr Dictionary File
TABLE: TS$ recorded in LogMnr Dictionary File
TABLE: CLU$ recorded in LogMnr Dictionary File
TABLE: IND$ recorded in LogMnr Dictionary File
TABLE: ICOL$ recorded in LogMnr Dictionary File
TABLE: LOB$ recorded in LogMnr Dictionary File
TABLE: USER$ recorded in LogMnr Dictionary File
TABLE: FILE$ recorded in LogMnr Dictionary File
TABLE: PARTOBJ$ recorded in LogMnr Dictionary File
TABLE: PARTCOL$ recorded in LogMnr Dictionary File
TABLE: TABPART$ recorded in LogMnr Dictionary File
TABLE: INDPART$ recorded in LogMnr Dictionary File
TABLE: SUBPARTCOL$ recorded in LogMnr Dictionary File
TABLE: TABSUBPART$ recorded in LogMnr Dictionary File
TABLE: INDSUBPART$ recorded in LogMnr Dictionary File
TABLE: TABCOMPART$ recorded in LogMnr Dictionary File
ERROR - 6532   ORA- 06532 : Subscript outside of limit
BEGIN dbms_logmnr_d.build('dict.ora', 'd:\oracle\admin\ds\logs'); END;

*
ERROR at line  1 :
ORA- 06532 : Subscript outside of limit
ORA- 06512 : at  "SYS.DBMS_LOGMNR_D" , line  793 
ORA- 06512 : at line  1 

После закомментирования:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
LogMnr Dictionary Procedure started
LogMnr Dictionary File Opened
TABLE: OBJ$ recorded in LogMnr Dictionary File
TABLE: TAB$ recorded in LogMnr Dictionary File
TABLE: COL$ recorded in LogMnr Dictionary File
TABLE: SEG$ recorded in LogMnr Dictionary File
TABLE: UNDO$ recorded in LogMnr Dictionary File
TABLE: UGROUP$ recorded in LogMnr Dictionary File
TABLE: TS$ recorded in LogMnr Dictionary File
TABLE: CLU$ recorded in LogMnr Dictionary File
TABLE: IND$ recorded in LogMnr Dictionary File
TABLE: ICOL$ recorded in LogMnr Dictionary File
TABLE: LOB$ recorded in LogMnr Dictionary File
TABLE: USER$ recorded in LogMnr Dictionary File
TABLE: FILE$ recorded in LogMnr Dictionary File
TABLE: PARTOBJ$ recorded in LogMnr Dictionary File
TABLE: PARTCOL$ recorded in LogMnr Dictionary File
TABLE: TABPART$ recorded in LogMnr Dictionary File
TABLE: INDPART$ recorded in LogMnr Dictionary File
TABLE: SUBPARTCOL$ recorded in LogMnr Dictionary File
TABLE: TABSUBPART$ recorded in LogMnr Dictionary File
TABLE: INDSUBPART$ recorded in LogMnr Dictionary File
TABLE: TABCOMPART$ recorded in LogMnr Dictionary File
BEGIN dbms_logmnr_d.build('dict.ora', 'd:\oracle\admin\ds\logs'); END;

*
ERROR at line  1 :
ORA- 06532 : Subscript outside of limit
ORA- 06512 : at  "SYS.DBMS_LOGMNR_D" , line  301 
ORA- 06512 : at  "SYS.DBMS_LOGMNR_D" , line  651 
ORA- 06512 : at  "SYS.DBMS_LOGMNR_D" , line  771 
ORA- 06512 : at line  1 
...
Рейтинг: 0 / 0
05.12.2002, 12:40
    #32076041
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова Logminer
Ошика происходит для таблицы INDCOMPART$(line 771):
Код: plaintext
1.
record_table_result := record_table('INDCOMPART$', '');


Для этой таблицы делается вызов функции(line651):
Код: plaintext
1.
col_count := get_column_description(in_Table_Name);


Конкретная ошибка происходит в функции при выполнении get_column_description(line 301):
Код: plaintext
1.
col_test_array.EXTEND;


col_test_array содержит массив записей,где каждая запись содержит информацию об столбце.То есть в массив можно записать информацию о 513 колонках всех таблиц в целом. На таблице INDCOMPART$ массив исчерпался и происходит ошибка.

Необходимо изменит это число(513) на число столбов во всех таблицах:

Верни исходный текст пакета, замени 513 на новое значение в:
Код: plaintext
1.
TYPE col_desc_array IS VARRAY( 513 ) OF col_description;


и в:
Код: plaintext
1.
EXIT WHEN col_count =  513 ;


Если же указать просто значение больше 513, наобум, но бельше реального кол-ва столбцов всех таблиц - то будут другие ошибки.

А вообще я советую тебе патч поставить. В LogMinere с 8.1.7.0 до 8.1.7.4 было три бага устранено.
...
Рейтинг: 0 / 0
05.12.2002, 12:48
    #32076052
babay
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова Logminer
Patch то у меня есть 8.1.7.4. Но почитал перепалку между вами и .dba и как то призадумался, а сыр во рту держал:-). А если БД распределенная и снимки с нее отправляются в БД без установленного патча?
...
Рейтинг: 0 / 0
05.12.2002, 14:05
    #32076115
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова Logminer
Да, гарантии никто дать не сможет. Поставь хотя бы патч 8.1.7.3 - вроде никаких неожиданностей не было, у меня в мульти-мастер репликации один сервер стоит Linux Oracle 8.1.7.3 а другой Window Oracle 8.0.5.
Кстати в 8.1.7.3 в пакете тоже есть условие EXIT WHEN col_count = 513, так что я думаю, всё равно произойдёт выход из цикла. Всё равно крректировать придёться видимо. Если конечно патч не меняет кол-во столбцов.

Посмотри запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
select count(column_name)
from
dba_tab_columns
where table_name in ('OBJ$','TAB$','COL$','SEG$','UNDO$','UGROUP$','TS$','CLU$','IND$','ICOL$','LOB$',
'USER$','FILE$', 'PARTOBJ$','PARTCOL$','TABPART$','INDPART$','SUBPARTCOL$',
'TABSUBPART$','INDSUBPART$','TABCOMPART$','INDCOMPART$');


У меня:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQLWKS> select count(column_name)
      2 > from
      3 > dba_tab_columns
      4 > where table_name in ('OBJ$','TAB$','COL$','SEG$','UNDO$','UGROUP$','TS$','CLU$','IND$','ICOL$','LOB$',
      5 > 'USER$','FILE$', 'PARTOBJ$','PARTCOL$','TABPART$','INDPART$','SUBPARTCOL$',
      6 > 'TABSUBPART$','INDSUBPART$','TABCOMPART$','INDCOMPART$');
COUNT(COLU
 ----------
 
        494 
Выбрана  1  строка.
...
Рейтинг: 0 / 0
05.12.2002, 15:24
    #32076190
babay
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова Logminer
Спасибо.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / И снова Logminer / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]