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