09.08.2019 21:56
OlegON
 
Налетел... 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 tsWHERE 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 tsWHERE 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

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