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

Пытаюсь создать словарь
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
И снова Logminer
    #32075872
babay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если закомментировать строку 793 в sys.dbms_logmnr_d.build, то процедура больше ошибок не выдает. Но вот правильно ли это? Подскажите кто знает, please!
...
Рейтинг: 0 / 0
И снова Logminer
    #32075891
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю в оракловых пакетах ничего трогать не надо.
Перед вызовом процедуры build() для создания файла словаря LigMiner необходимо установить среду её использования, с помощью параметра utl_file_dir.
Выставлен ли у тебя этот параметр?:
utl_file_dir='d:\oracle\admin\ds\logs'
Если не установлен, надо установить, после чего обязательнонужно перезагрузить БД.

Проверте также, не существует ли уже файл d:\oracle\admin\ds\logs\dict.ora
...
Рейтинг: 0 / 0
И снова Logminer
    #32075899
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пришли мне на ящик свой файл dbmslmd.sql
...
Рейтинг: 0 / 0
И снова Logminer
    #32075900
babay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В init.ora выставлен utl_file_dir, БД перегружалась. Файл dict.ora создается каждый раз при вызове dbms_logmnr_d.build(), однако я могу его удалить руками.
...
Рейтинг: 0 / 0
И снова Logminer
    #32075936
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по тексту пакета(который есть у меня для 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
И снова Logminer
    #32075957
babay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня версия 8.1.7.0. Насколько я понимаю, пакеты у нас различаются. Упоминания "38" в моем пакете нет, запрос тоже не выдает ни одной таблицы.
TYPE col_desc_array IS VARRAY( 513 ) OF col_description;
...
Рейтинг: 0 / 0
И снова Logminer
    #32075967
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вышли свой dbmslmd.sql
...
Рейтинг: 0 / 0
И снова Logminer
    #32075968
babay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да я уж выслал минут 40 назад
...
Рейтинг: 0 / 0
И снова Logminer
    #32075987
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
И снова Logminer
    #32076015
babay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сообщение 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
И снова Logminer
    #32076041
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошика происходит для таблицы 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
И снова Logminer
    #32076052
babay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Patch то у меня есть 8.1.7.4. Но почитал перепалку между вами и .dba и как то призадумался, а сыр во рту держал:-). А если БД распределенная и снимки с нее отправляются в БД без установленного патча?
...
Рейтинг: 0 / 0
И снова Logminer
    #32076115
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, гарантии никто дать не сможет. Поставь хотя бы патч 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
И снова Logminer
    #32076190
babay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / И снова Logminer
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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