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-логи, но убивает всех мемберов, кроме первого попавшегося, если их больше одного.