Blame

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