Blame
|
1 | # Redo - Массовое пересоздание redo логов |
||||||
| 2 | ||||||||
|
3 | :::danger |
||||||
| 4 | # ACHTUNG! |
|||||||
| 5 | Логи с отличным от дефолтного(512 байт) размером блока после превращения в архивлог, судя по всему не жрутся Informatiкой |
|||||||
| 6 | ::: |
|||||||
|
7 | |||||||
| 8 | #### Имеющиеся файлы и их размер |
|||||||
|
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 | ``` |
|||||||
|
12 | |||||||
| 13 | #### Расположение файлов |
|||||||
|
14 | ```ora |
||||||
| 15 | SELECT * FROM v$logfile; |
|||||||
| 16 | ``` |
|||||||
|
17 | |||||||
| 18 | #### Добавление новых групп |
|||||||
|
19 | ```ora |
||||||
| 20 | ALTER DATABASE ADD LOGFILE GROUP 4 ( |
|||||||
|
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 | #### Если нужно переключиться вручную на другую группу, то необходимо выполнить |
|||||||
|
32 | ```ora |
||||||
| 33 | Alter system switch logfile; |
|||||||
|
34 | --Формирование чекпоинта, для перехода групп в состояние INACTIVE |
||||||
|
35 | alter system checkpoint; |
||||||
|
36 | ``` |
||||||
|
37 | #### Удаление группы |
||||||
| 38 | Перед удалением старых файлов необходимо удостовериться, что они в данный момент в состоянии INACTIVE и ARCHIVE предварительно выполнив запрос |
|||||||
|
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 | ``` |
|||||||
|
42 | |||||||
| 43 | После чего можно по одному удалять неактивные группы файлов. |
|||||||
|
44 | ```ora |
||||||
| 45 | alter database drop logfile group 6; |
|||||||
| 46 | ``` |
|||||||
|
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 | ``` |
|||||||