Налетел... 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;