В очередной раз об ORA-00600: internal error code, arguments: [12700].А также ORA-01498: block check failure

dbstalker, 25 ноября

Согласитесь, бывают радости в нашей жизни. На этот раз - ORA-00600: internal error code, arguments: [12700], [58262], …….

  1. Предлагаю действовать так:
    SELECT owner, object_name, object_type, object_id, data_object_id
    FROM dba_objects
    WHERE data_object_id = 58262 – это число из сообщения об ошибке.
    

    Таким образом, узнали с каким объектом проблемы.

    Если проблемы в индексе, то тут легко и просто. Удалили и пересоздали.

    Если это таблица, то есть несколько вариантов:

    • попробуем сберечь информацию из таблицы:
      create table my_temp_table as select * from my_table_corrupt; 
      Затем поломанную таблицу удаляем и создаем вновь из нашей временной.
    • Поменяем только характеристики блоков данных (см здесь). Например,
      alter table my_table_corrupt  pctfree хх, pctused хх; 
      alter table t move;
    • можно попробовать перенести в другое табличное пространство
      alter table t move tablespace tbs_new;
  2. Если из этих относительно хороших вариантов ничего не сработало, то пробуем дальше:

  3. ANALYZE TABLE [название поломанного объекта] VALIDATE STRUCTURE;
    ANALYZE TABLE [название поломанного объекта] VALIDATE STRUCTURE CASCADE.
    ANALYZE TABLE [название поломанного объекта] VALIDATE STRUCTURE CASCADE INTO INVALID_ROWS ; (это для партиционных таблиц ;не забудьте выполнить скрипт utlvalid.sql для создания таблицы INVALID_ROWS )
    

    И если мы получим здесь сообщение - ORA-01498: block check failure - see trace file, то поступим так, как советует здесь Donald K. Burleson

    А именно:
    DBMS_REPAIR.CHECK_OBJECT
    =========================
    
    CHECK_OBJECT procedure checks the specified object and populates the repair
    table with information about corruption and repair directive(s).  Validation
    consists of block checking all blocks in the object.  All blocks previously
    marked corrupt will be skipped.
    
    Note: In the initial release of DBMS_REPAIR the only repair is to mark the 
          block as software corrupt.
    
    SQL> @checkObject
    SQL> set serveroutput on
    SQL>
    SQL> declare
      2    rpr_count int;
      3  begin
      4    rpr_count := 0;
      5  dbms_repair.check_object (
      6    schema_name => 'SYSTEM',
      7    object_name => 'T1',
      8    repair_table_name => 'REPAIR_TABLE',
      9    corrupt_count => rpr_count);
    10    dbms_output.put_line('repair count: ' || to_char(rpr_count));
    11  end;
    12  /
    repair count: 1
    
    PL/SQL procedure successfully completed.
    
    SQL> desc repair_table
    Name                                      Null?    Type
    ----------------------------------------- -------- ----------------------------
    OBJECT_ID                                NOT NULL NUMBER
    TABLESPACE_ID                            NOT NULL NUMBER
    RELATIVE_FILE_ID                          NOT NULL NUMBER
    BLOCK_ID                                  NOT NULL NUMBER
    CORRUPT_TYPE                              NOT NULL NUMBER
    SCHEMA_NAME                              NOT NULL VARCHAR2(30)
    OBJECT_NAME                              NOT NULL VARCHAR2(30)
    BASEOBJECT_NAME                                    VARCHAR2(30)
    PARTITION_NAME                                    VARCHAR2(30)
    CORRUPT_DESCRIPTION                                VARCHAR2(2000)
    REPAIR_DESCRIPTION                                VARCHAR2(200)
    MARKED_CORRUPT                            NOT NULL VARCHAR2(10)
    CHECK_TIMESTAMP                          NOT NULL DATE
    FIX_TIMESTAMP                                      DATE
    REFORMAT_TIMESTAMP                                DATE
    
    SQL> select object_name, block_id, corrupt_type, marked_corrupt,
      2  corrupt_description, repair_description
      3  from repair_table;
    
    OBJECT_NAME                      BLOCK_ID CORRUPT_TYPE MARKED_COR
    ------------------------------ ---------- ------------ ----------
    CORRUPT_DESCRIPTION
    --------------------------------------------------------------------------------
    REPAIR_DESCRIPTION
    --------------------------------------------------------------------------------
    T1                                      3            1 FALSE
    kdbchk: row locked by non-existent transaction
            table=0  slot=0
            lockid=32  ktbbhitc=1
    mark block software corrupt
    

2 комментария

Прокоментировать

Виктор
30 декабря 2008 г. в 07:12

Хорошая статья. Спасибо.
Но вот тут косячокс.
SELECT owner, object_name, object_type, object_id, data_object_id
FROM dba_objects
WHERE data_object_id = 58262 – это число из сообщения об ошибке.

Надо писать не
... WHERE data_object_id = ...
а
... WHERE object_id = ...

dbstalker
30 декабря 2008 г. в 09:12

data_object_id - номер объекта словаря данных для сегмента, содержащего объект.
object_id - номер объекта словаря данных для объекта

 

Новый комментарий

Я не спамер: введите суму 3+3



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Нужен поставщик Дропшиппинг
10 декабря, 1 ответа
КИНО КАФЕ!!!!!!!!!!!!!!!!
10 декабря, 1 ответа