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