Код:
declare
status varchar(30);
lim number := 50;
begin
for i in (select *
from v$logfile
where type = 'ONLINE'
and group# in
(select group# from v$log where bytes / 1024 / 1024 < lim)) loop
select status into status from v$log where group# = i.group#;
while status != 'INACTIVE' loop
execute immediate 'alter system switch logfile';
execute immediate 'alter system checkpoint';
select status into status from v$log where group# = i.group#;
end loop;
execute immediate 'alter database drop logfile group ' || i.group#;
execute immediate 'alter database add logfile group ' || i.group# ||
' (''' || i.member || ''') size '||lim||'M reuse';
end loop;
end;
собственно, lim - минимальный размер файла в Мб. Все файлы пересоздаются на месте старых. Скрипт нормально обрабатывает standby-логи, но убивает всех мемберов, кроме первого попавшегося, если их больше одного.