09.08.2019 21:56
Налетел... Bug 20951828
исправлен только в 12.2, суть бага в том, что в TS$ пропущенные табличные пространства (даже если они удаленные) недопустимы. Рукожопые программеры.
SQL код:
SET SERVEROUTPUT ON
     DECLARE
        max_tsno number;
    cur_tsno number;
    count_tsno number;
    missing_count number := 0;
      BEGIN
     dbms_output.put_line('Checking TS$ for missing TS#''s... ');
     SELECT max(ts#) INTO max_tsno FROM ts$;
     dbms_output.put_line
        ('scanning TS$, looking for TS# 0 through to max TS# ' ||
          max_tsno || ' inclusive');
     for cur_tsno in 0..max_tsno loop
       SELECT count(*) INTO count_tsno FROM ts$ WHERE ts# = cur_tsno;
       if count_tsno = 0 then
         missing_count := missing_count + 1;
         dbms_output.put_line('TS# ' || cur_tsno || ' not found!');
       end if;
     end loop;
     if missing_count = 0 then
       dbms_output.put_line('No TS#''s missing ');
       dbms_output.put_line('Check completed.');
     else
       dbms_output.put_line('Total number of TS#''s missing: ' ||
                 missing_count );
       dbms_output.put_line('Check completed.');
     end if;
      END;
      / 
скрипт выше проверяет наличие этих пропущенных записей.

В общем, если вы не собираетесь немедленно обновляться, то единственный для вас способ - открыть базу в ридонли после пересоздания контрольника (список табличных пространств убивается при первой попытке открыть базу), сразу после этого, без перезагрузки
SQL код:
alter system set "_disable_read_only_open_dict_check"=TRUE;
alter database open read only; 
и экспортнуть ее. Второй, рисковый, но тоже работающий вариант: при наличии базы-исходника - заполнить в исходнике пропуски фейковыми данными (я заполнил удаленными UNDO-табличными пространствами)
SQL код:
DECLARE 
max_tsno number;
cur_tsno number;
count_tsno number;
missing_count number := 0;
BEGIN SELECT max(ts#) INTO max_tsno FROM ts$; 
for cur_tsno in 0..max_tsno 
loop 
SELECT count(*) INTO count_tsno FROM ts$ WHERE ts# = cur_tsno;
if count_tsno = 0 then dbms_output.put_line('TS# ' || cur_tsno || ' not found!');
execute immediate 'insert into ts$ select '||cur_tsno||',''JOPA'||cur_tsno||''',0,3,0,0,0,8192,1,0,0,1,2147483645,8,128,8,0,1,2147483645,8,0,1,4113,3,3534435689,NULL,NULL,NULL,0,0,NULL,NULL from dual';
commit;
end if;
end loop;
END; 
Часовой пояс GMT +3, время: 09:10.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.