Blame
|
1 | # Redo - Массовое пересоздание redo логов |
||||||
| 2 | ||||||||
|
3 | > [!CAUTION] |
||||||
|
4 | > Логи с отличным от дефолтного(512 байт) размером блока после превращения в архивлог, судя по всему не жрутся Informatiкой |
||||||
|
5 | |||||||
| 6 | #### Имеющиеся файлы и их размер |
|||||||
|
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 | ``` |
|||||||
|
10 | |||||||
| 11 | #### Расположение файлов |
|||||||
|
12 | ```ora |
||||||
| 13 | SELECT * FROM v$logfile; |
|||||||
| 14 | ``` |
|||||||
|
15 | |||||||
| 16 | #### Добавление новых групп |
|||||||
|
17 | ```ora |
||||||
| 18 | ALTER DATABASE ADD LOGFILE GROUP 4 ( |
|||||||
|
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 | #### Если нужно переключиться вручную на другую группу, то необходимо выполнить |
|||||||
|
30 | ```ora |
||||||
| 31 | Alter system switch logfile; |
|||||||
|
32 | --Формирование чекпоинта, для перехода групп в состояние INACTIVE |
||||||
|
33 | alter system checkpoint; |
||||||
|
34 | ``` |
||||||
|
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 | ``` |
|||||||