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 | ``` |