Blame

e4a9e6 feagor 2025-12-06 10:13:15 1
# Redo - Массовое пересоздание redo логов
2
a17dcc feagor 2025-12-06 10:21:55 3
:::danger
4
# ACHTUNG!
5
Логи с отличным от дефолтного(512 байт) размером блока после превращения в архивлог, судя по всему не жрутся Informatiкой
6
:::
edebd7 feagor 2025-12-06 10:18:07 7
8
#### Имеющиеся файлы и их размер
2e2667 feagor 2025-12-06 10:18:59 9
```ora
10
select group#,members,status,archived,bytes/1024/1024 as mb,first_time,next_time from v$log t order by 1;
11
```
edebd7 feagor 2025-12-06 10:18:07 12
13
#### Расположение файлов
2e2667 feagor 2025-12-06 10:18:59 14
```ora
15
SELECT * FROM v$logfile;
16
```
edebd7 feagor 2025-12-06 10:18:07 17
18
#### Добавление новых групп
2e2667 feagor 2025-12-06 10:18:59 19
```ora
20
ALTER DATABASE ADD LOGFILE GROUP 4 (
edebd7 feagor 2025-12-06 10:18:07 21
'/u01/db/system/DW/redo04a.log',
22
'/u01/db/system/DW/redo04b.log') SIZE 2048M;
23
ALTER DATABASE ADD LOGFILE GROUP 5 (
24
'/u01/db/system/DW/redo05a.log',
25
'/u01/db/system/DW/redo05b.log') SIZE 2048M;
26
ALTER DATABASE ADD LOGFILE GROUP 6 (
27
'/u01/db/system/DW/redo06a.log',
28
'/u01/db/system/DW/redo06b.log') SIZE 2048M;
29
```
30
31
#### Если нужно переключиться вручную на другую группу, то необходимо выполнить
2e2667 feagor 2025-12-06 10:18:59 32
```ora
33
Alter system switch logfile;
edebd7 feagor 2025-12-06 10:18:07 34
--Формирование чекпоинта, для перехода групп в состояние INACTIVE
6b4845 feagor 2025-12-06 10:19:08 35
alter system checkpoint;
2e2667 feagor 2025-12-06 10:18:59 36
```
edebd7 feagor 2025-12-06 10:18:07 37
#### Удаление группы
38
Перед удалением старых файлов необходимо удостовериться, что они в данный момент в состоянии INACTIVE и ARCHIVE предварительно выполнив запрос
f2c6ca feagor 2025-12-06 10:19:33 39
```sql
40
select group#,members,status,archived,bytes/1024/1024 as mb,first_time,next_time from v$log t order by 1;
41
```
edebd7 feagor 2025-12-06 10:18:07 42
43
После чего можно по одному удалять неактивные группы файлов.
f2c6ca feagor 2025-12-06 10:19:33 44
```ora
45
alter database drop logfile group 6;
46
```
edebd7 feagor 2025-12-06 10:18:07 47
48
#### Скрипт пересоздания логфайлов
49
```ora
50
--select group#,members,status,archived,bytes/1024/1024 as mb,first_time,next_time from v$log t order by 1;
51
--SELECT * FROM v$logfile;
52
declare
53
l_path1 varchar2(400):= '/u01/db/redolog_a/CBSPROD/';
54
l_path2 varchar2(400):= '/u01/db/redolog_b/CBSPROD/';--поставить null если нужОн только 1 член в группе
55
l_size varchar2(400):= '2048M';
56
l_grpcnt int:= 5; --Количество групп логов
57
---------------------------------------------------
58
l_maxgrp# int;
59
l_curcnt int;
60
l_cmd varchar2(4000);
61
begin
62
execute immediate 'alter system switch logfile';
63
execute immediate 'alter system checkpoint';
64
select max( group#),count(1) into l_maxgrp#,l_curcnt from v$log t;
65
DBMS_OUTPUT.PUT_LINE( 'max group# is '||l_maxgrp#);
66
if l_maxgrp#-l_curcnt>greatest(l_curcnt,l_grpcnt) then
67
l_maxgrp# :=0;
68
DBMS_OUTPUT.PUT_LINE( 'max group# set to 0');
69
end if;
70
71
for r in (
72
SELECT t.*,row_number() over (order by p#,next_time,group#) rn
73
FROM (
74
SELECT group#,status,next_time,
75
decode(status,'UNUSED',1,'INACTIVE',2,'ACTIVE',3,'CURRENT',4) p#,count(1) over () as cnt
76
FROM v$log t
77
) t
78
order by p#,next_time,group#
79
) loop
80
if r.cnt-r.rn>1 then
81
l_cmd:='alter database clear logfile group '||r.group#;
82
DBMS_OUTPUT.PUT_LINE(l_cmd);
83
execute immediate l_cmd;
84
l_cmd:='alter database drop logfile group '||r.group#;
85
DBMS_OUTPUT.PUT_LINE(l_cmd);
86
execute immediate l_cmd;
87
end if;
88
end loop;
89
for i in l_maxgrp#+1..l_maxgrp#+l_grpcnt loop
90
if l_path2 is null then
91
l_cmd := 'ALTER DATABASE ADD LOGFILE GROUP '||i||'('''||l_path1||'redo'||lpad(i,2,'0')||'.log'') SIZE '||l_size;
92
else
93
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;
94
end if;
95
DBMS_OUTPUT.PUT_LINE( l_cmd);
96
execute immediate l_cmd;
97
end loop;
98
execute immediate 'alter system switch logfile';
99
dbms_lock.sleep(2);
100
execute immediate 'alter system switch logfile';
101
dbms_lock.sleep(2);
102
execute immediate 'alter system checkpoint';
103
for r in (
104
SELECT group#,status,row_number() over(order by next_time nulls last, group#) rn,count(1) over () as cnt,
105
count(1) over () - row_number() over(order by next_time nulls last) d
106
FROM v$log t
107
order by next_time nulls last,group#
108
) loop
109
if r.cnt-r.rn>=l_grpcnt then
110
l_cmd := 'alter database drop logfile group '||r.group#;
111
DBMS_OUTPUT.PUT_LINE( l_cmd);
112
execute immediate l_cmd;
113
end if;
114
end loop;
115
end;
116
```