Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-01578: ORACLE data block corrupted на IOT / 2 сообщений из 2, страница 1 из 1
27.04.2020, 15:59
    #39952010
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-01578: ORACLE data block corrupted на IOT
Если кому-то вдруг будет интересно или себе на будущее:
создаем IOT и дампим
Код: plsql
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.
-- drop table iottest purge;
-- drop tablespace ts_iot including contents and datafiles;
-- создаем ТС для индекса IOT, оверфлоу пусть валяется в USERS:
create tablespace ts_iot datafile '/opt/oracle/oradata/ORA18/PDB1/ts_iot.dbf' size 10m;
CREATE TABLE iottest
(id           varchar2(11),
 description  varchar2(10),
 padding      varchar2(100),
 CONSTRAINT pk_iottest PRIMARY KEY (id)
)
ORGANIZATION INDEX 
tablespace ts_iot
PCTTHRESHOLD 20
INCLUDING description
OVERFLOW tablespace users;

insert into iottest
select 'AAAAA'||to_char(100000-level,'fm00000'),
       'IOT-'||to_char(100000-level,'fm00000'),
       'padding #'||level 
from dual connect by level<200000;
commit;

-- дампим дерево индекса в IOTTREE:
alter session set MAX_DUMP_FILE_SIZE = unlimited;
alter session set tracefile_identifier='IOTTREE';
begin
   for r in (select object_id from user_objects o where object_name='PK_IOTTEST') loop
      execute immediate 'alter session set events ''immediate trace name treedump level '||r.object_id||'''';
   end loop;
   for r in (select TRACEFILE from v$process where addr = (select paddr from v$session where sid =userenv('sid'))) loop
      dbms_output.put_line(r.tracefile);
   end loop;
end;
/
alter session set tracefile_identifier='IOTDFDUMP'
/
begin
   for r in (
       select * 
       from dba_extents e 
       where tablespace_name='TS_IOT' 
       and segment_name='PK_IOTTEST'
       and extent_id=0
   )
   loop
      execute immediate 'alter system dump datafile '||r.file_id||' block min '||r.block_id||' block max '|| (r.block_id+r.blocks - 1);
   end loop;
end;
/
alter session set tracefile_identifier='END';
--  чистим буферный кэш
alter system flush buffer_cache;
alter system flush buffer_cache;
alter system flush buffer_cache;


получим что-то такое
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
----- begin tree dump
branch: 0x5400083 88080515 (0: nrow: 3, level: 2)
   branch: 0x540023f 88080959 (-1: nrow: 240, level: 1)
      leaf: 0x5400085 88080517 (-1: row:222.222 avs:4)
      leaf: 0x5400214 88080916 (0: row:222.222 avs:4)
      ...
   branch: 0x5400306 88081158 (0: nrow: 397, level: 1)
      leaf: 0x5400367 88081255 (-1: row:222.222 avs:4)
      leaf: 0x540036b 88081259 (0: row:222.222 avs:4)
      ...
   branch: 0x5400204 88080900 (1: nrow: 240, level: 1)
      leaf: 0x54001dc 88080860 (-1: row:235.235 avs:6)
      leaf: 0x54001d8 88080856 (0: row:235.235 avs:6)


затем ломаем выделенный бранч блок в hexedit, т.е. средний, который не будет давать ошибку для min/max запросов по индексу

и удостоверимся что запросы и с IFS и IFFS выдают ошибку:
Код: plsql
1.
2.
3.
4.
select/*+ index_ffs(i) */ max(substr(id,5)) from iottest i;
select/*+ no_index_ffs(i) */ max(substr(id,5)) from iottest i;
begin for r in (select id from iottest) loop null; end loop;end;
/


но вот при установке "_index_scan_check_skip_corrupt"=true увидим, что IFS по-прежнему валится с ошибкой, в то время как IFFS выдает все верные данные и сохраняет в трейс битые блоки:

Код: plsql
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.
SQL> alter session set "_index_scan_check_skip_corrupt"=true;

Session altered.

SQL> alter session set tracefile_identifier='CRRPTD';

Session altered.

SQL> select/*+ index_ffs(i) */ count(*),max(substr(id,5)) from iottest i;

  COUNT(*) MAX(SUBSTR(ID,5))
---------- ----------------------------
    199999 A99999

SQL> select/*+ no_index_ffs(i) */ count(*),max(substr(id,5)) from iottest i;
select/*+ no_index_ffs(i) */ count(*),max(substr(id,5)) from iottest i
                                                             *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 21, block # 131)
ORA-01110: data file 21: '/opt/oracle/oradata/ORA18/PDB1/ts_iot.dbf'

SQL> create table recover as select * from iottest;

Table created.

SQL> select count(padding) from iottest;

COUNT(PADDING)
--------------
        199999



Код: plsql
1.
2.
*** 2020-04-27T12:43:24.934559+00:00 (PDB1(3))
index scan: segment: tsn: 6 rdba: 0x05400082            skipping corrupt block file# 21 block# 131


т.е. если поврежден только бранч блок, то с _index_scan_check_skip_corrupt легко сохранить все данные
...
Рейтинг: 0 / 0
28.04.2020, 13:00
    #39952326
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-01578: ORACLE data block corrupted на IOT
xtender

т.е. если поврежден только бранч блок, то с _index_scan_check_skip_corrupt легко сохранить все данные

Саян, если тест еще не снес, попробуй плиз для чистоты эксперимента (со сломанным leaf тоже интересно):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE TABLE iottest_rep as select * from iottest where 1=0;
begin
  for i in (select/*+ no_index_ffs(i) */ * from iottest i order by id) loop
    insert into iottest_rep values i;
    commit;
  end loop;
exception
  when others then -- не уверен, что отловит этот exception, но все-таки
    for i in (select/*+ no_index_ffs(i) */ * from iottest i order by id desc) loop
      insert into iottest_rep values i;
      commit;
    end loop;
end;
/
select count(*) from iottest_rep;
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-01578: ORACLE data block corrupted на IOT / 2 сообщений из 2, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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