Заметки DBA
Attachments
History
Blame
View Source
Changelog
Documentation
About An Otter Wiki
Toggle dark mode
Login
Home
A - Z
Menu
AWR и ASH
Управление файлами
Python
Ссылочки
Page Index
oracle
oracle files
Archivelog - Объем сгенерированных логов
Controlfile - Перенос
Datafile - Добавление n файлов
Redo - Массовое пересоздание redo логов
Redo - Отключение записи в лог
Segment - Рост БД по месяцам
oracle
oracle files
Redo - Массовое пересоздание redo логов
edebd7
Commit
edebd7
2025-12-06 10:18:07
feagor
: -/-
oracle/oracle_files/Redo_-_Массовое_пересоздание_redo_логов.md
..
@@ 2,3 2,102 @@
> [!CAUTION]
> Логи с отличным от дефолтного(512 байт) размером блока после превращения в архивлог, судя по всему не жрутся Informatiкой
+
+
#### Имеющиеся файлы и их размер
+
```ora select group#,members,status,archived,bytes/1024/1024 as mb,first_time,next_time from v$log t order by 1;```
+
+
#### Расположение файлов
+
```ora SELECT * FROM v$logfile;```
+
+
#### Добавление новых групп
+
```ora ALTER DATABASE ADD LOGFILE GROUP 4 (
+
'/u01/db/system/DW/redo04a.log',
+
'/u01/db/system/DW/redo04b.log') SIZE 2048M;
+
ALTER DATABASE ADD LOGFILE GROUP 5 (
+
'/u01/db/system/DW/redo05a.log',
+
'/u01/db/system/DW/redo05b.log') SIZE 2048M;
+
ALTER DATABASE ADD LOGFILE GROUP 6 (
+
'/u01/db/system/DW/redo06a.log',
+
'/u01/db/system/DW/redo06b.log') SIZE 2048M;
+
```
+
+
#### Если нужно переключиться вручную на другую группу, то необходимо выполнить
+
```ora Alter system switch logfile;```
+
--Формирование чекпоинта, для перехода групп в состояние INACTIVE
+
```ora alter system checkpoint;```
+
#### Удаление группы
+
Перед удалением старых файлов необходимо удостовериться, что они в данный момент в состоянии INACTIVE и ARCHIVE предварительно выполнив запрос
+
```sql select group#,members,status,archived,bytes/1024/1024 as mb,first_time,next_time from v$log t order by 1;```
+
+
После чего можно по одному удалять неактивные группы файлов.
+
```ora alter database drop logfile group 6;```
+
+
#### Скрипт пересоздания логфайлов
+
```ora
+
--select group#,members,status,archived,bytes/1024/1024 as mb,first_time,next_time from v$log t order by 1;
+
--SELECT * FROM v$logfile;
+
declare
+
l_path1 varchar2(400):= '/u01/db/redolog_a/CBSPROD/';
+
l_path2 varchar2(400):= '/u01/db/redolog_b/CBSPROD/';--поставить null если нужОн только 1 член в группе
+
l_size varchar2(400):= '2048M';
+
l_grpcnt int:= 5; --Количество групп логов
+
---------------------------------------------------
+
l_maxgrp# int;
+
l_curcnt int;
+
l_cmd varchar2(4000);
+
begin
+
execute immediate 'alter system switch logfile';
+
execute immediate 'alter system checkpoint';
+
select max( group#),count(1) into l_maxgrp#,l_curcnt from v$log t;
+
DBMS_OUTPUT.PUT_LINE( 'max group# is '||l_maxgrp#);
+
if l_maxgrp#-l_curcnt>greatest(l_curcnt,l_grpcnt) then
+
l_maxgrp# :=0;
+
DBMS_OUTPUT.PUT_LINE( 'max group# set to 0');
+
end if;
+
+
for r in (
+
SELECT t.*,row_number() over (order by p#,next_time,group#) rn
+
FROM (
+
SELECT group#,status,next_time,
+
decode(status,'UNUSED',1,'INACTIVE',2,'ACTIVE',3,'CURRENT',4) p#,count(1) over () as cnt
+
FROM v$log t
+
) t
+
order by p#,next_time,group#
+
) loop
+
if r.cnt-r.rn>1 then
+
l_cmd:='alter database clear logfile group '||r.group#;
+
DBMS_OUTPUT.PUT_LINE(l_cmd);
+
execute immediate l_cmd;
+
l_cmd:='alter database drop logfile group '||r.group#;
+
DBMS_OUTPUT.PUT_LINE(l_cmd);
+
execute immediate l_cmd;
+
end if;
+
end loop;
+
for i in l_maxgrp#+1..l_maxgrp#+l_grpcnt loop
+
if l_path2 is null then
+
l_cmd := 'ALTER DATABASE ADD LOGFILE GROUP '||i||'('''||l_path1||'redo'||lpad(i,2,'0')||'.log'') SIZE '||l_size;
+
else
+
l_cmd := 'ALTER DATABASE ADD LOGFILE GROUP '||i||'('''||l_path1||'redo'||lpad(i,2,'0')||'.log'','''||l_path2||'redo'||lpad(i,2,'0')||'.log'') SIZE '||l_size;
+
end if;
+
DBMS_OUTPUT.PUT_LINE( l_cmd);
+
execute immediate l_cmd;
+
end loop;
+
execute immediate 'alter system switch logfile';
+
dbms_lock.sleep(2);
+
execute immediate 'alter system switch logfile';
+
dbms_lock.sleep(2);
+
execute immediate 'alter system checkpoint';
+
for r in (
+
SELECT group#,status,row_number() over(order by next_time nulls last, group#) rn,count(1) over () as cnt,
+
count(1) over () - row_number() over(order by next_time nulls last) d
+
FROM v$log t
+
order by next_time nulls last,group#
+
) loop
+
if r.cnt-r.rn>=l_grpcnt then
+
l_cmd := 'alter database drop logfile group '||r.group#;
+
DBMS_OUTPUT.PUT_LINE( l_cmd);
+
execute immediate l_cmd;
+
end if;
+
end loop;
+
end;
+
```
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9