вторник, 24 февраля 2009 г.

Oracle Сегменты отката

В oracle 8i все было так :

Создание сегмента отката

!!! Все экстенты сегмента отката в БД должны быть одинаковы

при создании используются следующие параметры:

initial - размер начального экстента сегмента отката

next - размер следующего экстента сегмента отката
указывайте его равным initial

minextents - минимальное число экстентов в сегменте отката
должно быть больше или равно 2

maxextents - максимально разрешенное число экстентов в сегменте отката
ставте число а не unlimited
особенно полезно это для autoextend

optimal - общий оптимальный размер сегмента отката
он не меньше чем initial*minextents, так как initial=next


create rollback segment rollseg01
tablespace orgdbrbs
storage (
initial 10k
next 10k
minextents 20
maxextents 450
optimal 300k
);


alter rollback segment имя online;

Отключить сегмент отката можно только если в нем нет
активных экстентов с незафиксированными транзакциями.

alter rollback segment имя offline;


Изменим параметры
(можно менять все параметры за исключением initial)
изменение параметра next не изменит размер уже существующих
экстентов и делать это не рекомендуется

alter rollback segment rollseg01
storage ( maxextents 200
optimal 310k );



Удалить сегмент отката

drop rollback segment rollseg01;


Вручную сузить область область, отведенную сегменту отката до размера
не меньше чем указано в optimal


alter rollback segment rollseg01 shrink to 220k;

по умолчанию сегмент отката сжимается до optimal

alter rollback segment rollseg01 shrink;

Оракл не уменьшает размер сегмента откатаб если активны его экстенты,
размер которых превышает указанный


select r.usn, r.name, ((sum(e.blocks)+min(s.curblk))*min(p.value))/(1024*1024) Mb
from v$rollname r, v$rollstat s, v$parameter p, dba_extents e
where p.name='db_block_size'
and s.usn=r.usn
and s.usn in (select xidusn from v$transaction)
and e.segment_type='ROLLBACK'
and e.segment_name=r.name
and e.extent_id<=s.curext
group by segment_type, segment_name, r.name, r.usn;



select a.name,
b.xacts,
b.extents,
b.rssize,
b.optsize,
b.hwmsize,
b.status
from v$rollname a,
v$rollstat b
where a.usn=b.usn



select a.username,
a.sid,
a.serial#,
b.name as rbsname,
c.used_ublk
from v$session a,
v$rollname b,
v$transaction c
where a.saddr=c.ses_addr
and b.usn=c.xidusn;


Не закоммиченная транзакция
такого пользователя нужно убить
оракл откатит убитую транзакцию

select a.username,
a.sid,
a.serial#,
to_char(b.start_time,'MM/DD/YY HH24:MI:SS') as start_time,
c.name
from v$session a,
v$transaction b,
v$rollname c,
v$rollstat d
where a.saddr=b.ses_addr
and b.xidusn=c.usn
and c.usn=d.usn
and ((d.curext=b.start_uext-1) or
((d.curext=d.extents-1) and b.start_uext=0))


select s.username,
s.sid,
s.serial#,
t.start_time, t.xidusn
from v$session s,
v$transaction t,
v$rollstat r
where s.saddr=t.ses_addr
and t.xidusn=r.usn
and ((r.curext=t.start_uext-1)
or
((r.curext=r.extents-1)
and (t.start_uext=0)));



Представления

dba_rollback_segs - информация о всех сегментах отката

v$rollstat - размер, текущее число экстентов, наивысшая точка,
оптимальный размер

v$rollname - имя сегмента отката и его номер,
соответствующий записям в v$rollstat

v$transaction - адрес сеанса и использование сегментов
отката текущими транзакциями

v$session - имя sid и порядковый номер адреса сеанса,
соответствуют адресу сеанса в v$transaction


Ошибки

ORA-01562 insufficient space in rollback segment
недостаточно места в сегменте отката

ORA-01560 insufficient space in the tablespace
недостаточно места в табличной области

ORA-01628 MAXEXTENTS has been reached
достигнуто значение MAXEXTENTS



ORA-01555 snapshot to old (rollback segment to small)
моментальный снимок слишком стар
сегмент отката слишком мал
простое повышение maxextents тут не поможет
тут нужно повысить minextents и optimal пересоздав сегмент отката


select s.username, s.sid, rn.name, rs.extents
,rs.status, t.used_ublk, t.used_urec
,do.object_name
from v$transaction t
,v$session s
,v$rollname rn
,v$rollstat rs
,v$locked_object lo
,dba_objects do
where t.addr = s.taddr
and t.xidusn = rn.usn
and rn.usn = rs.usn
and t.xidusn = lo.xidusn(+)
and do.object_id = lo.object_id;


To monitor rollback usage (waits/gets should be < 1 %)

select name, waits, gets
from v$rollstat, v$rollname
where v$rollstat.usn = v$rollname.usn;



select
substr(s.username,1,18) username,
substr(s.program,1,15) program,
decode(s.command,
0,'No Command',
1,'Create Table',
2,'Insert',
3,'Select',
6,'Update',
7,'Delete',
9,'Create Index',
15,'Alter Table',
21,'Create View',
23,'Validate Index',
35,'Alter Database',
39,'Create Tablespace',
41,'Drop Tablespace',
40,'Alter Tablespace',
53,'Drop User',
62,'Analyze Table',
63,'Analyze Index',
s.command||': Other') command
from
v$session s,
v$process p,
v$transaction t,
v$rollstat r,
v$rollname n
where s.paddr = p.addr
and s.taddr = t.addr (+)
and t.xidusn = r.usn (+)
and r.usn = n.usn (+)
order by 1


undo_management=auto and bounce your database:

CREATE UNDO TABLESPACE ts_undo
DATAFILE '/u01/oradata/prod/ts_undo.dbf'
SIZE 2M REUSE AUTOEXTEND ON;

Alter system set undo_tablespace=ts_undo;
Alter system set undo_management=auto;

Календарные строки

Синтаксис использования календарной строки для значения параметра repeat_interval процедуры CREATE_JOB чрезвычайно прост.

Например, если вы определяете задание, которое выполняется с понедельника по пятницу ровно в 7 часов утра и 3 часа дня,
то значением параметра repeat_interval может быть такая календарная строка:


FREQ=DAILY; BYDAY=MON,TUE,WED,THU,FRI; BYHOUR=7,15  с понедельника по пятницу ровно в 7 часов утра и 3 часа дня

Предложение FREQ может быть ровно одно, а предложений BY может быть несколько разных видов.

Предложение FREQ задает интервал между повторными выполнениями.

Если задание должно повторяться каждый день FREQ = DAILY.

FREQ=DAILY;
FREQ=HOURLY;
FREQ=MINUTELY;
FREQ=SECONDLY;

FREQ=YEARLY;
FREQ=MONTHLY;
FREQ=WEEKLY;

Предложение BY определяет, когда именно задание будет выполняться.

В примере, определяя частоту выполнения, мы указали, что задание выполняется ежедневно (FREQ=DAILY).
Теперь следует ограничить множество дней (задание должно выполняться только в рабочие дни), указав BYDAY=MON,TUE,WED,THU,FRI.
Далее необходимо потребовать, чтобы задание запускалось в 7 часов утра и в 3 часа дня, указав BYHOUR=7,15.


Разрешены следующие ключевые слова:
BYMONTH,
BYMONTHDAY,
BYYEARDAY,
BYHOUR,
BYMINUTE и
BYSECOND


Предположим, что задание следует запускать ежедневно (вне зависимости от дня недели) в 10 часов утра, в 2 часа дня и в 8 часов вечера.
Тогда параметр repeat_interval может быть таким:

FREQ=DAILY; BYHOUR=10,14,20   ежедневно (вне зависимости от дня недели) в 10 часов утра, в 2 часа дня и в 8 часов вечера.

FREQ=DAILY; INTERVAL=2, BYHOUR=10,14,20  через день, а не каждый день Используем новое ключевое слово – INTERVAL

Предложение INTERVAL=2 изменяет частоту вдвое по отношению к значению, указанному в предложении FREQ. В нашем случае FREQ=DAILY,
поэтому задание будет выполняться каждые два дня.

FREQ=DAILY; BYHOUR= - 2  Отрицательные значения означают отсчет от конца периода. Например, следующая строка задает второй час, начиная с конца дня

BYMONTH Планирование выполнение задания в определенные месяцы.
BYMONTH=JUN,DEC чтобы выполнялось только в июне и декабре
BYMONTH=6,12  по номерам месяцев
Точная дата внутри месяца, когда задание будет выполнено, совпадает с днем его запуска.
Например, если задание запускается 4 июля, то в декабре и в июне оно будет выполнено 4 числа.
Если необходимо, чтобы задание выполнялось в другой день, следует использовать ключевое слово BYMONTHDAY.

BYMONTHDAY Указывает, в какой именно день месяца должно выполняться задание.
FREQ=MONTHLY; BYMONTHDAY=1; BYHOUR=15 первого числа каждого месяца в 3 часа дня
Если опустить предложение BYHOUR, задание по умолчанию будет выполняться в полночь.

BYYEARDAY Указывает, в какой день года должно выполняться задание.
FREQ=YEARLY; BYYEARDAY=15 в пятнадцатый день каждого года

BYHOUR Планирование выполнения задания в определенные часы.
FREQ=DAILY; BYHOUR=3,6,9    каждый день в 3, 6 и 9 часов утра задаем:
FREQ=MINUTELY; BYHOUR=3,6,9 каждую минуту в определённые часы ( 03:00:00-03:59:00, 06:00:00-06:59:00, 09:00:00-09:59:00)

BYMINUTE Планирование выполнения задания в определенную минуту.
FREQ=MINUTELY; BYMINUTE=30 каждые полчаса
FREQ=HOURLY; BYMINUTE=30 каждые полчаса так как составляющая часа не указывается
FREQ=DAILY; BYMINUTE=30  выполняется каждый день в 00:30  округление будет вестись с точностью до дня

BYSECOND  планирования выполнения задания в определенную секунду.
Отрицательное значение какого то ключевого слова означает отсчет от конца (а не от начала) периода.
Например, следующая календарная строка
FREQ=YEARLY; BYYEARDAY= - 1  указывает на первый день года, начиная с его конца.
Поэтому такое задание будет выполняться каждый год 31 декабря.


Примеры календарных строк:

Пусть сегодня 5 июля 2005 года

FREQ=YEARLY  будет выполняться 5 июля каждый год, начиная с 2006 в полночь

FREQ=YEARLY; INTERVAL=2  будет выполнено 5 июля в 2007 году, 2009, 2011 и т. д. (через год)

FREQ=YEARLY; BYMONTH=JAN будет выполняться ежегодно 5 января (опять таки в полночь) просто поменялся месяц.

FREQ=YEARLY; BYMONTH=JAN; BYMONTHDAY=2  будет выполняться 2 января 2006 года, 2 января 2007 года и т. д.

FREQ=YEARLY; BYMONTH=JAN; BYDAY=SUN  будет выполняться ежегодно каждое воскресенье января

FREQ=YEARLY; BYMONTH=JAN; BYMONTHDAY=2; BYDAY=SUN будет выполняться каждое воскресенье января, если оно выпадет на 2-е число

FREQ=YEARLY; BYYEARDAY=60 выполнение задания каждый 60-й день года
планировщик учел високосность 2008 года: в нем 60-й день выпадает на 29 января В остальных случаях шестидесятым днем года является 1 марта

FREQ=YEARLY; BYYEARDAY=60; BYMONTHDAY=1 Пусть задание выполняется в 60-й день года и в первый день месяца (високосный год будет пропущен)

FREQ=YEARLY; BYWEEKNO=2 выполняться каждый день второй недели года  Все семь дней второй недели каждого года

FREQ=DAILY; BYHOUR=3,6,9 выполняется ежедневно ровно в три, шесть и девять часов утра

FREQ=DAILY; INTERVAL=2; BYHOUR=3,6,9  тоже но через два дня  Задание выполняется 6 июля ровно в три, шесть и девять часов утра, затем 8 июля

FREQ=DAILY; BYHOUR=3,6,9; BYMINUTE=00,15,30,45  выполняется ежедневно в 3, 6 и 9 часов дня, но в указанные минуты






Oracle Создание тестовой базы

1. Создаем все каталоги

export ORACLE_SID=sapdbt1
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=/app/oracle/product/10.2.0/db_1
export ORACLE_DATA=/app/oracle/oradata/$ORACLE_SID
export ORACLE_ADMIN=$ORACLE_BASE/admin/$ORACLE_SID

mkdir $ORACLE_ADMIN
mkdir $ORACLE_ADMIN/pfile
mkdir $ORACLE_ADMIN/bdump
mkdir $ORACLE_ADMIN/cdump
mkdir $ORACLE_ADMIN/udump
mkdir $ORACLE_ADMIN/create

2. Скопируем файл параметров

cp $ORACLE_HOME/dbs/initsapdb.ora $ORACLE_HOME/dbs/initsapdbt1.ora

в винде делаем так:

> cp $ORACLE_HOME\dbs\initsapdb.ora d:\app\oracle\admin\sapdbt1\pfile\initsapdbt1.ora

> notepad $ORACLE_HOME\dbs\initsapdbt1.ora > IFILE = d:\app\oracle\admin\sapdbt1\pfile\initsapdbt1.ora

3. Отредактируем файл initsapdbt1.ora

*.db_block_size=8192
*.compatible='10.2.0.3.0'
*.optimizer_features_enable='9.2.0'
*.optimizer_secure_view_merging=FALSE
*.timed_statistics=TRUE

*.db_name='sapdbt1'
*.db_domain='msk.oracle.com'


*.audit_sys_operations=TRUE
*.audit_trail='XML'
*.audit_file_dest='/app/oracle/admin/sapdbt1/adump'

*.background_dump_dest='/app/oracle/admin/sapdbt1/bdump'
*.user_dump_dest='/app/oracle/admin/sapdbt1/udump'
*.core_dump_dest='/app/oracle/admin/sapdbt1/cdump'
*.control_files='/app/oracle/oradata/sapdbt1/control1/control01.ctl','/app/oracle/oradata/sapdbt1/control2/control02.ctl'

*.db_recovery_file_dest='/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648

*.log_archive_dest_1='LOCATION=/app/oracle/archlogs/arch01/sapdbt1/ MANDATORY'
*.log_archive_dest_2='LOCATION=/app/oracle/archlogs/arch02/sapdbt1/ OPTIONAL'
*.log_archive_format='sapdb_%t_%s_%r.arc'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=sapdbt1XDB)'
*.nls_language='AMERICAN'
*.remote_login_passwordfile='EXCLUSIVE'
*.archive_lag_target=900
*.db_cache_advice='READY'

*.db_file_multiblock_read_count=16

*.sga_max_size=48318382080
*.db_cache_size=9663676416
*.db_keep_cache_size=8589934592
*.db_recycle_cache_size=12884901888
*.dbwr_io_slaves=4
*.shared_pool_size=1363148800
*.shared_pool_reserved_size=136314880
*.pga_aggregate_target=5368709120
*.large_pool_size=100M
*.java_pool_size=157286400
*.job_queue_processes=20
*.open_cursors=700
*.processes=1500
*.sessions=1655

*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.undo_retention=21600


4. Создаем файл паролей

orapwd file=$ORACLE_HOME/dbs/orapwsapdbt1 password=TEST entries=4

в винде еще создаем сервис

oradim -new -sid sapdbt1 -intpwd TEST


5. Выполняем горячее резервное копирование


6. Создаем сценарий управляющего файла

alter database backup controlfile to trace resetlogs;

он будет создан в каталоге

select value from v$parameter where name='user_dump_dest';

или

> show parameter user_dump_dest

переименуйте его в mk_sapdbt1.sql и поместите в
$ORACLE_BASE/admin/sapdbt1/create

отредактируйте его примерно так

STARTUP NOMOUNT pfile='/u01/app/oracle/oracle/product/10.2.0/db_1/dbs/initsapdbt1.ora';
CREATE CONTROLFILE SET DATABASE "SAPDBT1" RESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 732
LOGFILE
GROUP 1 '/app/oracle/oradata/sapdbt1/redoa/redo01.log' SIZE 50M,
GROUP 2 '/app/oracle/oradata/sapdbt1/redoa/redo02.log' SIZE 50M,
GROUP 3 '/app/oracle/oradata/sapdbt1/redoa/redo03.log' SIZE 50M
DATAFILE
'/app/oracle/oradata/sapdbt1/system/system01.dbf',
'/app/oracle/oradata/sapdbt1/undotbs/undotbs01.dbf',
'/app/oracle/oradata/sapdbt1/sysaux/sysaux01.dbf',
'/app/oracle/oradata/sapdbt1/users/users01.dbf'
CHARACTER SET CL8MSWIN1251
;
alter database recover automatic FROM '/app/oracle/archlogs/arch01/sapdbt1/' until cancel using backup controlfile;
alter database recover automatic cancel;
alter database open resetlogs;
ALTER TABLESPACE TEMP ADD TEMPFILE '/app/oracle/oradata/sapdbt1/temp/temp01.dbf'
SIZE 29360128 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;


выполните его

export ORACLE_SID=sapdbt1
cd $ORACLE_BASE/admin/$ORACLE_SID/create
sqlplus /nolog
connect sys/passw as sysdba;
@mk_sapdbt1.sql


Можно и руками восстановить (накатить базу) sapdbt1:

sql> set logsource /app/oracle/archlogs/arch01/sapdbt1;
sql> recover database using backup controlfile until cancel;

когда закончатся все архивные логи, можно попробовать скормить
и оперативный текущий редо-лог, предварительно остановив базу sapdb

просто введите путь:
/app/oracle/oradata/sapdb/redoa/redo01.log
в ответ на приглашение начать восстановление

или не закрывая переключите несколько раз журналы и скормите архивные файлы.

Откройте БД supdbt1

alter database open resetlogs;


С помощью RMAN восстанавливать так:

export ORACLE_SID=testdb
rman target /

CATALOG START WITH '/u09/tape_restore/testdb';
recover database;

alter database open resetlogs;

Примеры скриптов для пересоздания управляющего файла:

STARTUP NOMOUNT pfile='/u01/app/oracle/product/10.2.0.4/db_1/dbs/inittestdb.ora';
CREATE CONTROLFILE SET DATABASE "TESTDB" RESETLOGS NOARCHIVELOG
    MAXLOGFILES 40
    MAXLOGMEMBERS 3
    MAXDATAFILES 300
    MAXINSTANCES 8
    MAXLOGHISTORY 2920
LOGFILE
  GROUP 1 '/u09/app/oracle/oradata/testdb/redoa/redo01a.log'  SIZE 500M,
  GROUP 2 '/u09/app/oracle/oradata/testdb/redoa/redo02a.log'  SIZE 500M,
  GROUP 3 '/u09/app/oracle/oradata/testdb/redoa/redo03a.log'  SIZE 500M,
  GROUP 4 '/u09/app/oracle/oradata/testdb/redoa/redo04a.log'  SIZE 500M,
  GROUP 5 '/u09/app/oracle/oradata/testdb/redoa/redo05a.log'  SIZE 500M,
  GROUP 6 '/u09/app/oracle/oradata/testdb/redoa/redo06a.log'  SIZE 500M,
  GROUP 7 '/u09/app/oracle/oradata/testdb/redoa/redo07a.log'  SIZE 500M,
  GROUP 8 '/u09/app/oracle/oradata/testdb/redoa/redo08a.log'  SIZE 500M
DATAFILE
  '/u09/app/oracle/oradata/testdb/sysaux01.dbf',
  '/u09/app/oracle/oradata/testdb/system01.dbf',
  '/u09/app/oracle/oradata/testdb/temp01.dbf',
  '/u09/app/oracle/oradata/testdb/undotbs1_01.dbf',
  '/u09/app/oracle/oradata/testdb/undotbs2_02.dbf',
  '/u09/app/oracle/oradata/testdb/users01.dbf'
CHARACTER SET CL8MSWIN1251
;

или так:

STARTUP NOMOUNT pfile='/u01/app/oradb/product/11.2.0.3/dbhome_1/dbs/inittestdb.ora';
CREATE CONTROLFILE SET DATABASE "TESTDB" RESETLOGS NOARCHIVELOG
    MAXLOGFILES 40
    MAXLOGMEMBERS 3
    MAXDATAFILES 300
    MAXINSTANCES 8
    MAXLOGHISTORY 2920
LOGFILE
  GROUP 1 '+REDO/redo01a.log'  SIZE 500M BLOCKSIZE 512,
  GROUP 2 '+REDO/redo02a.log'  SIZE 500M BLOCKSIZE 512,
  GROUP 3 '+REDO/redo03a.log'  SIZE 500M BLOCKSIZE 512,
  GROUP 4 '+REDO/redo04a.log'  SIZE 500M BLOCKSIZE 512,
  GROUP 5 '+REDO/redo05a.log'  SIZE 500M BLOCKSIZE 512,
  GROUP 6 '+REDO/redo06a.log'  SIZE 500M BLOCKSIZE 512,
  GROUP 7 '+REDO/redo07a.log'  SIZE 500M BLOCKSIZE 512,
  GROUP 8 '+REDO/redo08a.log'  SIZE 500M BLOCKSIZE 512
DATAFILE
  '+TEST/testdb/datafile/system.584.824808053',         
  '+TEST/testdb/datafile/undotbs1.702.824808053',       
  '+TEST/testdb/datafile/sysaux.701.824808053',         
  '+TEST/testdb/datafile/users.589.824808213'          
CHARACTER SET CL8MSWIN1251
;

Файл параметров:

$more inittestdb.ora
*.aq_tm_processes=0
*.archive_lag_target=900
*.audit_file_dest='/u01/app/oracle/admin/testdb/adump'
*.audit_sys_operations=TRUE
*.audit_trail='XML'
*.background_dump_dest='/u01/app/oracle/admin/testdb/bdump'
*.compatible='10.2.0.3.0'
*.control_files='/u09/app/oracle/oradata/testdb/control/control01.ctl','/u09/app/oracle/oradata/testdb/control/control02.ctl','/u09/ap
p/oracle/oradata/testdb/control/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/testdb/cdump'
*.db_block_size=8192
*.db_cache_size=3221225472
*.db_domain='msk.vbrr.loc'
*.db_files=1024
*.db_name='testdb'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=21474836480
*.dispatchers='(PROTOCOL=TCP) (SERVICE=testdbt0XDB)'
*.fast_start_mttr_target=300
*.fast_start_parallel_rollback='LOW'
*.java_pool_size=268435456
*.job_queue_processes=0
*.large_pool_size=200M
*.log_archive_dest_1='LOCATION=/u09/app/oracle/archlogs/arch01/testdb/ MANDATORY'
*.log_archive_format='testdb_%t_%s_%r.arc'
*.log_archive_max_processes=10
*.log_archive_min_succeed_dest=1
*.open_cursors=1000
*.optimizer_features_enable='9.2.0'
*.optimizer_secure_view_merging=FALSE
*.pga_aggregate_target=1g
*.processes=2500
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_max_size=5368709120
*.shared_pool_size=1073741824
*.smtp_out_server='solaris-mx.sun.com'
*.standby_file_management='AUTO'
testdb.streams_pool_size=335544320
*.undo_management='AUTO'
*.undo_retention=14400
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/testdb/udump'


или так:


*.archive_lag_target=900
*.audit_sys_operations=TRUE
*.audit_trail='DB'
*.compatible='11.2.0'
*.control_files='+TEST/testdb/controlfile/current.866.822734201','+TEST/testdb/controlfile/current.867.822734201'#Restore Controlfile
*.control_management_pack_access='DIAGNOSTIC+TUNING'
*.db_block_size=8192
*.db_cache_size=12884901888
*.db_create_file_dest='+TEST'
*.db_create_online_log_dest_1='+REDO'
*.db_domain='msk.vbrr.loc'
*.db_files=1024
*.db_name='testdb'#Reset to original value by RMAN
*.db_recovery_file_dest='+RECO'
*.db_recovery_file_dest_size=107374182400
*.diagnostic_dest='/u01/app/oradb'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=testdbXDB)'
*.fast_start_mttr_target=300
*.fast_start_parallel_rollback='LOW'
*.java_pool_size=268435456
*.job_queue_processes=60
*.large_pool_size=268435456
*.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES, ALL_ROLES)'
*.log_archive_dest_state_3='ENABLE'
*.log_archive_format='%t_%s_%r.arc'
*.log_archive_max_processes=4
*.log_archive_min_succeed_dest=1
*.open_cursors=1000
*.optimizer_secure_view_merging=FALSE
*.os_authent_prefix='OSP$'
*.pga_aggregate_target=6442450944
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.resource_manager_plan=''
*.sec_case_sensitive_logon=FALSE
*.sga_max_size=16106127360
*.shared_pool_size=2147483648
*.smtp_out_server='afina-mx.vbrr.ru'
*.standby_file_management='AUTO'
*.undo_retention=14400
*.undo_tablespace='UNDOTBS1'


Добавление временных файлов:

ALTER TABLESPACE TEMP ADD TEMPFILE '/app/oracle/oradata/sapdbt1/temp/temp01.dbf'
SIZE 29360128 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;

или так:

CREATE TEMPORARY TABLESPACE "TEMP" TEMPFILE SIZE 61865984 AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1048576;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE "TEMP";
ALTER TABLESPACE "TEMP" ADD TEMPFILE SIZE 500M AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;


Установить DBID для тестовой базы можно так:

set ORACLE_SID=TESTDB
sqlplus sys/sys as sysdba
shutdown immediate;
startup open read only;

declare
  v_chgdbid   binary_integer;
  v_chgdbname binary_integer;
  v_skipped   binary_integer;
  old_name    varchar2(100);
  old_dbid    varchar2(100);

begin

  select name, dbid into old_name, old_dbid from v$database;
  dbms_backup_restore.nidbegin('TESTDB', old_name, 97255669, old_dbid, 0, 0, 10);
  dbms_backup_restore.nidprocesscf(v_chgdbid,v_chgdbname);
  for i in (select file#,name from v$datafile) loop
     dbms_backup_restore.nidprocessdf(i.file#,0, v_skipped,v_chgdbid,v_chgdbname);
  end loop;
  for i in (select file#,name from v$tempfile) loop
     dbms_backup_restore.nidprocessdf(i.file#,1, v_skipped,v_chgdbid,v_chgdbname);
  end loop;
  dbms_backup_restore.nidend;
end;

/

shutdown immediate;
startup mount;
alter database open resetlogs;
startup force;

















Oracle Трассировка

Находим sid и serial# сессии:

select  s.username
,   s.sid
,   s.serial#
,   s.osuser
,   s.machine
,   s.terminal
,   p.spid
,   last_call_et
,   status
from    V$SESSION s
,   V$PROCESS p
where   s.PADDR = p.ADDR
and s.sid='123';


Включить трассировку:

BEGIN
SYS.DBMS_System.Set_Ev(156, 13, 10046, 12, '');
END;
/

Отключить трассировку сессии:

BEGIN
SYS.DBMS_System.Set_Ev(156, 13, 10046, 0, '');
END;
/

Файлы трассировок находятся:

show parameter dump_dest

или так:


select name, value
 from v$parameter
 where name like '%dump_dest%';

set serveroutput on
exec dbms_output.put_line( scott.get_param( 'user_dump_dest' ) )


В 11g так:

with home
 as
 (select value home
    from v$diag_info
  where name = 'ADR Home'
 )
 select name,
        case when value <> home.home
                 then replace(value,home.home,'$home$')
                        else value
        end value
from v$diag_info, home
/



 select c.value || '/' || d.instance_name || '_ora_' ||
 a.spid || '.trc' ||
 case when e.value is not null then '_'||e.value end trace
 from v$process a, v$session b, v$parameter c, v$instance d, v$parameter e
 where a.addr = b.paddr
 and b.audsid = userenv('sessionid')
 and c.name = 'user_dump_dest'
 and e.name = 'tracefile_identifier'
/


Обработка файлов трассировки:

Обработка файла трассировки выполняется при помощи утилиты tkprof, поставляемой
в комплекте Oracle Server. Формат вызова команды:

$tkprof trace_file processed_trace_file explain=username/password sort=exeela fchela

где

- trace_file - исходный необработанный файл трассировки;
- processed_trace_file - имя результирующего обработанного файла трассировки;
- username - имя пользователя, под которым работала трассируемая сессия;
- password - пароль пользователя.

Анализ файлов трассировки.
Анализ статистики работы сессии.
Выявление проблемных SQL предложений.

Обработанный файл трассировки состоит из последовательно расположенных
блоков SQL-предложений, выполняемых данной сессией. В конце файла приводится
суммарная статистика по всем SQL-предложениям, выполнявшимся данной сессией.
SQL-предложения в файле располагаются в порядке, зависящем от параметра
sort команды tkprof. Наиболее полезным параметром сортировки является
elapsed time (общее затраченное время). Наибольшее время обычно занимает
процедура выполнения (execute) или выборки (fetch) SQL-предложений,
поэтому используются параметры sort = exeela или sort = fchela соответственно.


tkprof test1_j000_10411.trc test1_j000_10411.prf explain=user/passw@test1 table=user.tun_plan_table sort=(exeela,fchela)





Трассировка сессии

Включение/выключение трассировки. Получение и обработка файлов
Для того чтобы получить файл трассировки заданной сессии необходимо включить
для нее режим трассировки, подождать необходимое для накопления информации
время, выключить режим трассировки и обработать полученный файл.
Иногда может возникнуть необходимость исследования необработанного
файла трассировки. В этом случае для получения более детальной информации
о трассируемом процессе рекомендуется включать трассировку через
Server Manager, используя 12-ый уровень отладки.

Процедура включения / выключения трассировки при помощи SQLPlus

Включение

Для включения трассировки сессии с параметрами SID и SERIAL# необходимо
выполнить из SQLPlus следующую последовательность команд:

SQL>alter system set timed_statistics = true;
SQL>alter system set max_dump_file_size = unlimited;
SQL>exec dbms_system.set_sql_trace_in_session( , , TRUE);

Выключение

Для выключения трассировки сессии с параметрами SID и SERIAL# необходимо
выполнить из SQLPlus следующую последовательность команд:


SQL>exec dbms_system.set_sql_trace_in_session( , , FALSE);

Скрипт: ode.sql




Процедура включения / выключения трассировки при помощи Server Manager

Включение

Для включения трассировки сессии необходимо определить SPID
соответствующего ей процесса и выполнить следующую последовательность
команд:

SVRMGRL> oradebug setospid
SVRMGRL> oradebug unlimit
SVRMGRL> oradebug event 10046 trace name context forever, level 8

или для более детальной информации в необработанном файле трассировки
(в том числе вывода bind переменных и oracle events)

SVRMGRL> oradebug event 10046 trace name context forever, level 12


Выключение

Для выключения трассировки сессии необходимо определить SPID
соответствующего ей процесса и выполнить следующую последовательность
команд:

SVRMGRL> oradebug event 10046 trace name context off

Следует помнить, что остановка трассировки не закрывает созданный файл
в операционной системе, поэтому, если вы начнете трассировку заново,
то информация будет добавляться в уже существующий файл.
При удалении файла трассировки, он не исчезнет до тех пор, пока не будет
принудительно закрыт или не завершится трассируемая сессия.
Для принудительного закрытия файла трассировки следует использовать
следующую команду Server Manager:

SVRMGRL> oradebug setospid
SVRMGRL> oradebug close_trace

Файл трассировки создается в каталоге, указанном в параметре базы данных
background_dump_dest для фоновых процессов или в параметре user_dump_dest
для пользовательскиx процессов.

Имя файла формируется по маске _*_.trc, где

- DBNAME - имя базы данных;
- SPID - идентификатор процесса в UNIX.

Имя файла трассировки также можно узнать, выполнив в Server Manager следующую
последовательность команд:

SVRMGRL> oradebug setospid
SVRMGRL> oradebug tracefile_name

Обработка файла трассировки выполняется при помощи утилиты tkprof, поставляемой
в комплекте Oracle Server. Формат вызова команды:

$tkprof \
explain=/ sort=exeela fchela

где

- - исходный необработанный файл трассировки;
- - имя результирующего обработанного файла
трассировки;
- - имя пользователя, под которым работала трассируемая сес-сия;
- - пароль пользователя.

Анализ файлов трассировки. Анализ статистики работы сессии.
Выявление проблемных SQL.предложений

Обработанный файл трассировки состоит из последовательно расположенных
блоков SQL-предложений, выполняемых данной сессией. В конце файла приводится
суммарная статистика по всем SQL-предложениям, выполнявшимся данной сессией.
SQL-предложения в файле располагаются в порядке, зависящем от параметра
sort команды tkprof. Наиболее полезным параметром сортировки является
elapsed time (общее затраченное время). Наибольшее время обычно занимает
процедура выполнения (execute) или выборки (fetch) SQL-предложений,
поэтому используются параметры sort = exeela или sort = fchela соответственно.

При анализе файла трассировки необходимо обращать внимание на следующие
статистики, сигнализирующие о возможном наличии узких или проблемных мест:

1. Большое общее затраченное время (столбец elapsed).
Большое затраченное процессорное время (столбец cpu) в данном случае
означает, что сессия тратит большое количество процессорного времени
на данную операцию. Возможно проблема в неоптимальном SQL-предложении.

Относительно маленькое затраченное процессорное время (столбец cpu)
означает, что сессия большинство времени простаивает, ожидая выполнения
какого-либо внешнего условия. Необходимо анализировать события ожидания
сессии. Возможно проблема в настройке базы данных.

Большое время, зарачиваемое на разбор (parse) SQL-предложения
сигнализирует о проблемах в настройках памяти базы данных. Возможно
слишком маленький размер shared pool.

2. Большое количество обращений к блокам базы данных (большое суммарное
значение столбцов query и current). Обычно сигнализирует о неверном
плане выполнения SQL-предложения.

3. Большой процент чтений блоков с диска (большое значение отношения
disk/(query + current) может быть вызван неоптимальным планом выполнения
SQL-предложения или неверной настройкой базы данных.

4. Частые разборы SQL-предложений (поле Parse count > 1), скорее всего,
вызваны неверной настройкой размера shared pool.

5. Большое количество вызовов данного SQL-предложения, не согласующееся с
выполняемыми им функциями, возможно вызвано ошибкой в данном программном
модуле.
Наиболее простой и продуктивный метод анализа файла трассировки
- сравнение его с аналогичным файлом трассировки, собранной во время
нормального функционирования программного модуля. Поскольку в различных
файлах обычно содержится информация, накопленная за различное время,
сравнивать следует нормированные значения статистик. Например, можно
поделить все временные статистики SQL-предложения на количество вызовов
той или иной операции, а статистики по обращениям к блокам базы данных
- на количество обработанных записей.

Пример 1

Проблема длительных разборов SQL-предложения.
На 19 разборов было затрачено 691.42 сек. процессорного времени
и прошло 853.79 сек. реального времени. То есть на один разбор
тратится 853/19 = 45 сек. реального времени.

select count(up) from num_calls where up=:up and strt=to_date(:strt,
:d_mask) and dur=:dur and srv_a=:srv_a and ((:num_a is null and num_a is
null) or num_a=:num_a) and ((num is null and :num is null) or num=:num)
and ((:onls='@' and services is null) or :onls=services) and
billpar>:billpar

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 19 691.42 853.79 0 0 0 0
Execute 0 0.00 0.00 0 0 0 0
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 19 691.42 853.79 0 0 0 0

Misses in library cache during parse: 15
Optimizer goal: RULE
Parsing user id: 19 (MTS24E)

Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT GOAL: RULE
0 SORT (AGGREGATE)
0 PARTITION RANGE (SINGLE) PARTITION:KEYKEY
0 TABLE ACCESS (BY LOCAL INDEX ROWID) OF 'NUM_CALLS'
PARTITION:KEYKEY
0 INDEX (RANGE SCAN) OF 'NUM_CALLS_UP' (NON-UNIQUE)
PARTITION:KEYKEY



Пример 2

Проблема большого количества чтений с диска.
Из файла трассировки следует, что из запрошенных 2157 + 48438 = 50595 блоков
- 7464 прочитано с дисков, что составляет 15% от всего количества.
Кроме того, сильно отличаются elapsed time и cpu time. Это означает,
что сессия простаивает, ожидая выполнения каких либо условий.
В нашем случае - это ожидание чтения блоков с диска.


insert into num_calls (N_BLK, UP ,SRV_A ,SRV_B ,IND_B,STRT ,PTT ,AIR, PTT_TOLL, ptt_toll2,srv_toll,srv_toll2 ,NUM ,DUR ,INCOMING ,OUTGOING ,NUM_A, DIR ,TA, CELL_ID,SERVICES ,STATUS,DSC ,BILLPAR, r_roamfile_seq, AIR_SUB,PTT_SUB, imei,rtype,r_mscid,r_calls_log,utc)
values (decode(:n_blk,:nullnumber,null,:n_blk),:app, decode(:srv_a, :nullnumber,null, :srv_a) ,decode(:srv_b,:nullnumber,null,:srv_b) ,decode(:zoneindex, :nullnumber,null,:zoneindex), to_date(:strt,'yyyymmddhh24miss'), decode(:ptt,:nullnumber,null, round(:ptt,10)) ,decode(:air,:nullnumber,null,round(:air,10)) ,decode(:ptt_toll,:nullnumber,null,round(:ptt_toll,10)) ,
decode(:ptt_toll2, :nullnumber,null, round(:ptt_toll2,10)) ,decode(:srv_toll, :nullnumber,null,:srv_toll) , decode(:srv_toll2, :nullnumber,null, :srv_toll2), :num_b,decode(:dur,:nullnumber,null,:dur) ,decode(:routei,:nullnumber,null, :routei) ,decode(:routeo, :nullnumber, null,:routeo) ,:num_a ,:dir,:ta, :cell_id,:services,'', :dsc,0, decode(:roamfile_seq, :nullnumber,null, :roamfile_seq), decode(:air_sub, :nullnumber,null,:air_sub),null,:imei,:rtype, decode(:r_mscid, :nullnumber,null,:r_mscid), :r_calls_log, decode(:utc,100000,null,:utc))


call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 0 0.00 0.00 0 0 0 0
Execute 95 13.43 341.97 7464 2157 48438 9500
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 95 13.43 341.97 7464 2157 48438 9500

Поиск причин низкой производительности SQL-предложений.
Анализ планов выполнения SQL-предложений.
Одной из причин замедления работы приложений может быть несоответствие
плана выполнения (Execution Plan) SQL-предложений тому плану, который был
предусмотрен разработчиком при написании программного кода.
В частности, следует обращать внимание на наличие выборок по таблицам в
режиме FULL SCAN, в котором перебираются последовательно все строки таблицы
без использования индекса.
Следует, однако, иметь в виду, что наличие FULL SCAN не является ошибкой
в случаях, когда бизнес-логика запроса действительно требует сканирования
всей таблицы, либо при малом количестве записей в таблице, когда использование
индекса нецелесообразно.
Еще одной из причин несоответствия планов выполнения является наличие
статистики по таблицам и индексам БД. При этом, при отсутствии подсказок
оптимизатор строит план выполнения запроса исходя из данных статистики,
а не в соответствии с правилами разбора SQL-предложений. Т.к. при работе с
приложениями CBOSS предусматривается использование Rule-based optimisation,
то наличие статистики также приводит к искажению планов выполнения.
Также имеет смысл анализировать соответствие плана разбора SQL-предложения
подсказкам оптимизатора, указанным в запросе. Например, если при выполнении
запроса не используются указанные в хинте индексы, то следует проверить
наличие и доступность этих индексов в базе.

Пример:

В данном примере происходит полное сканирование таблицы, содержащей несколько
десятков тысяч строк.

SELECT R_SERVICE
FROM
ENCOURAGEMENTS_TMP WHERE R_APP = :b1 AND COND_ID = :b2 AND ACT_ID = :b3
AND ((:b4 IS NULL AND :b5 BETWEEN FD AND TD ) OR (:b4 IS NOT NULL AND
:b7 IS NULL AND (:b4 < TD AND FD < :b5 )) OR (:b7 IS NOT NULL AND :b7 <
TD )) AND :b12 = SRV_CODE

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 0 0.00 0.00 0 0 0 0
Execute 30821 2.83 2.74 0 0 0 0
Fetch 30821 1404.64 1473.50 1604 5035350 123284 13016
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 61642 1407.47 1476.24 1604 5035350 123284 13016

Misses in library cache during parse: 0
Optimizer goal: RULE
Parsing user id: 18 (VOXTEL) (recursive depth: 4)

Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT GOAL: RULE
0 TABLE ACCESS (FULL) OF 'ENCOURAGEMENTS_TMP'

Анализ необработанных файлов трассировки

Если планируется производить анализ необработанного файла трассировки,
то трассировку сессии следует запускать из Server Manager, используя при
этом 12-й уровень отладки. Полученный таким образом файл будет содержать
кроме обычной статистической информации все переменные, передаваемые
SQL-предложениям и системные события, выполнение которых ожидалось сессией
в процессе ее работы. Кроме того, по необработанному файлу трассировки можно
определить последовательность операций, выполняемых трассируемой сессией.

Создание резервной БД Oracle


Два сервера OMEGA01 и OMEGA02

Создадим

на сервере omega01.localdomain  Primary DB
на сервере omega02.localdomain  Standby DB


На сервере  omega01.localdomain  создаем DB:

Global Database Name: TEST_OMEGA01
SID: TEST


*************************************************************************************************************************************
Во время создания базы должно быть сконфигурирована область FRA:
alter system set DB_RECOVERY_FILE_DEST = '+FRA' scope=spfile sid='*';
-- alter system set DB_RECOVERY_FILE_DEST = '/u01/app/oracle/fast_recovery_area' scope=both sid='*';
alter system set DB_RECOVERY_FILE_DEST_SIZE = 10G scope=spfile sid='*';
alter system set LOG_ARCHIVE_DEST_1 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST' scope=spfile sid='*';
*************************************************************************************************************************************


На сервере omega01.localdomain создаем следующую конфигурацию:


$ vi $ORACLE_HOME/network/admin/listener.ora

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = omega01.localdomain)(PORT = 1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = TEST_OMEGA01)
      (ORACLE_HOME   = /u01/app/oracle/product/11.2.0.4)
      (SID_NAME      = TEST)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = TEST_OMEGA01_DGMGRL)
      (ORACLE_HOME   = /u01/app/oracle/product/11.2.0.4)
      (SID_NAME      = TEST)
    )
  )

#################################
# standard parameters
#################################
ADR_BASE_LISTENER = /u01/app/oracle
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON
VALID_NODE_CHECKING_REGISTRATION_LISTENER=SUBNET
#################################
# extended parameters
#################################
TRACE_LEVEL_LISTENER       = OFF
STARTUP_WAIT_TIME_LISTENER = 0
CONNECT_TIMEOUT_LISTENER   = 120
INBOUND_CONNECT_TIMEOUT_LISTENER = 120
SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER=OFF



$ vi $ORACLE_HOME/network/admin/sqlnet.ora

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
SQLNET.EXPIRE_TIME = 10
ADR_BASE = /u01/app/oracle



$ vi $ORACLE_HOME/network/admin/tnsnames.ora

TEST_OMEGA01 =
  (DESCRIPTION =
    (ENABLE=BROKEN)
    (ADDRESS_LIST=
        (ADDRESS = (PROTOCOL = TCP)(HOST = omega01.localdomain)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = TEST_OMEGA01)
    )
  )

TEST_OMEGA02 =
  (DESCRIPTION =
    (ENABLE=BROKEN)
    (ADDRESS_LIST=
        (ADDRESS = (PROTOCOL = TCP)(HOST = omega02.localdomain)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = TEST_OMEGA02)
    )
  )


На сервере omega02.localdomain создаем следующую конфигурацию:


$ vi $ORACLE_HOME/network/admin/listener.ora

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = omega02.localdomain)(PORT = 1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = TEST_OMEGA02)
      (ORACLE_HOME   = /u01/app/oracle/product/11.2.0.4)
      (SID_NAME      = TEST)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = TEST_OMEGA02_DGMGRL)
      (ORACLE_HOME   = /u01/app/oracle/product/11.2.0.4)
      (SID_NAME      = TEST)
    )
  )

#################################
# standard parameters
#################################
ADR_BASE_LISTENER = /u01/app/oracle
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON
VALID_NODE_CHECKING_REGISTRATION_LISTENER=SUBNET
#################################
# extended parameters
#################################
TRACE_LEVEL_LISTENER       = OFF
STARTUP_WAIT_TIME_LISTENER = 0
CONNECT_TIMEOUT_LISTENER   = 120
INBOUND_CONNECT_TIMEOUT_LISTENER = 120
SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER=OFF



$ vi $ORACLE_HOME/network/admin/sqlnet.ora

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
SQLNET.EXPIRE_TIME = 10
ADR_BASE = /u01/app/oracle



$ vi $ORACLE_HOME/network/admin/tnsnames.ora

TEST_OMEGA01 =
  (DESCRIPTION =
    (ENABLE=BROKEN)
    (ADDRESS_LIST=
        (ADDRESS = (PROTOCOL = TCP)(HOST = omega01.localdomain)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = TEST_OMEGA01)
    )
  )

TEST_OMEGA02 =
  (DESCRIPTION =
    (ENABLE=BROKEN)
    (ADDRESS_LIST=
        (ADDRESS = (PROTOCOL = TCP)(HOST = omega02.localdomain)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = TEST_OMEGA02)
    )
  )



Подготовка параметров инициализации для Primary БД (TEST_OMEGA01):


alter system set DB_UNIQUE_NAME = 'TEST_OMEGA01' scope=spfile sid='*';

-- В случае использования ASM+OMF
alter system set DB_CREATE_FILE_DEST = "+DATA" scope=both sid='*';
alter system set DB_CREATE_ONLINE_LOG_DEST_1 = "+REDO1" scope=both sid='*';
alter system set DB_CREATE_ONLINE_LOG_DEST_2 = "+REDO2" scope=both sid='*';

-- Параметры
alter system set LOG_ARCHIVE_DEST_1 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST' scope=spfile sid='*';
alter system set LOG_ARCHIVE_DEST_2 = '' scope=both sid='*';
alter system reset LOG_ARCHIVE_DEST_2 scope=spfile sid='*';
alter system set FAL_SERVER = 'TEST_OMEGA02' scope=both sid='*';
alter system set FAL_CLIENT = 'TEST_OMEGA01' scope=both sid='*';
alter system set STANDBY_FILE_MANAGEMENT = 'AUTO' scope=both sid='*';
alter system set REMOTE_LOGIN_PASSWORDFILE = "EXCLUSIVE" scope=spfile sid='*';

alter system set DB_FILE_NAME_CONVERT  =
                       '+DATA/TEST_OMEGA02/', '+DATA/TEST_OMEGA01/',
                       '+REDO1/TEST_OMEGA02/','+REDO1/TEST_OMEGA01/',
                       '+REDO2/TEST_OMEGA02/','+REDO2/TEST_OMEGA01/' scope=spfile sid='*';

alter system set LOG_FILE_NAME_CONVERT =
                       '+DATA/TEST_OMEGA02/', '+DATA/TEST_OMEGA01/',
                       '+REDO1/TEST_OMEGA02/','+REDO1/TEST_OMEGA01/',
                       '+REDO2/TEST_OMEGA02/','+REDO2/TEST_OMEGA01/' scope=spfile sid='*';



******************************************************************************************************
Немного про параметры конвертации:

Если Primary и Standby находятся на ASM, то параметры для DB_FILE_NAME_CONVERT и LOG_FILE_NAME_CONVERT
на Primary можно установить примерно так:

alter system set DB_FILE_NAME_CONVERT  =
                       '+DATA/TEST_OMEGA02/', '+DATA/TEST_OMEGA01/',
                       '+REDO1/TEST_OMEGA02/','+REDO1/TEST_OMEGA01/',
                       '+REDO2/TEST_OMEGA02/','+REDO2/TEST_OMEGA01/' scope=spfile sid='*';

alter system set LOG_FILE_NAME_CONVERT =
                       '+DATA/TEST_OMEGA02/', '+DATA/TEST_OMEGA01/',
                       '+REDO1/TEST_OMEGA02/','+REDO1/TEST_OMEGA01/',
                       '+REDO2/TEST_OMEGA02/','+REDO2/TEST_OMEGA01/' scope=spfile sid='*';

на Standby в обратном порядке:

alter system set DB_FILE_NAME_CONVERT  =
                       '+DATA/TEST_OMEGA01/', '+DATA/TEST_OMEGA02/',
                       '+REDO1/TEST_OMEGA01/','+REDO1/TEST_OMEGA02/',
                       '+REDO2/TEST_OMEGA01/','+REDO2/TEST_OMEGA02/' scope=spfile sid='*';

alter system set LOG_FILE_NAME_CONVERT =
                       '+DATA/TEST_OMEGA01/', '+DATA/TEST_OMEGA02/',
                       '+REDO1/TEST_OMEGA01/','+REDO1/TEST_OMEGA02/',
                       '+REDO2/TEST_OMEGA01/','+REDO2/TEST_OMEGA02/' scope=spfile sid='*';


Но лучше уточнить, может TEST_OMEGA01/02  придётся задать в нижнем регистре test_omega01/02
Для брокера эти команды будут выглядеть примерно так:

-- On Primary
dgmgrl /
edit database 'TEST_OMEGA01' set property 'StandbyFileManagement'='AUTO';
edit database 'TEST_OMEGA01' set property 'ArchiveLagTarget'=1200;
edit database 'TEST_OMEGA01' set property 'DbFileNameConvert' = '+DATA/test_omega02/  , +DATA/test_omega01/ ,  +DATA, +DATA' ;
edit database 'TEST_OMEGA01' set property 'LogFileNameConvert'= '+REDO/test_omega02/  , +REDO/test_omega01/ ,  +REDO, +REDO' ;

-- On Standby
dgmgrl /
edit database 'TEST_OMEGA02' set property 'StandbyFileManagement'='AUTO';
edit database 'TEST_OMEGA02' set property 'ArchiveLagTarget'=1200;
edit database 'TEST_OMEGA02' set property 'DbFileNameConvert' = '+DATA/test_omega01/  , +DATA/test_omega02/ ,  +DATA, +DATA' ;
edit database 'TEST_OMEGA02' set property 'LogFileNameConvert'= '+REDO/test_omega01/  , +REDO/test_omega02/ ,  +REDO, +REDO' ;



Если StandbyDB TEST_OMEGA02 будет располагаться на файловой системе а Primary на ASM.
например так:

Primary                                                  Standby
----------------------------------------------      --------------
+DATA/TEST_OMEGA01/datafile/        /u02/oradata/TEST_OMEGA02/
+DATA/TEST_OMEGA01/tempfile/       /u02/oradata/TEST_OMEGA02/

+DATA/TEST_OMEGA01/onlinelog/     /u02/oradata/TEST_OMEGA02/


То параметры  DB_FILE_NAME_CONVERT и LOG_FILE_NAME_CONVERT необходимо установить только на Standby
например так:

alter system set DB_FILE_NAME_CONVERT  = '+DATA/test_omega01/datafile/' ,'/u02/oradata/TEST_OMEGA02/','+DATA/test_omega01/tempfile/','/u02/oradata/TEST_OMEGA02/' scope=spfile sid='*';
alter system set LOG_FILE_NAME_CONVERT = '+DATA/test_omega01/onlinelog/','/u02/oradata/TEST_OMEGA02/'

Или с помощью брокера:

EDIT DATABASE 'TEST_OMEGA02' SET PROPERTY 'DbFileNameConvert'  = '+DATA/test_omega01/datafile/  , /u02/oradata/TEST_OMEGA02/ , +DATA/test_omega01/tempfile/ , /u02/oradata/TEST_OMEGA02/';
EDIT DATABASE 'TEST_OMEGA02' SET PROPERTY 'LogFileNameConvert' = '+DATA/test_omega01/onlinelog/ , /u02/oradata/TEST_OMEGA02/';

На Primary параметры  DB_FILE_NAME_CONVERT и LOG_FILE_NAME_CONVERT в этом случае устанавливать не нужно.
**************************************************************************************************************************************************************************

Применим эти параметры:

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;




Подготовка файла паролей для резервной БД (TEST_OMEGA02):

Необходимо обеспечить наличие файла паролей перед запуском нового AUXILIARY экземпляра резервной БД.
В зависимости от режима клонирования необходимы выполнить следующее:

Active Database Duplication    

Создать новый файл паролей с паролем, совпадающим с основной БД.
Это будет временный файл паролей,
который будет перезаписан утилитой RMAN в время процесса клонирования.  

Пример:
cd $ORACLE_HOME/dbs 
orapwd file=orapw${ORACLE_SID}  


Backup-based Duplication

Взять существующий файл паролей с основной БД


Подготовка файла параметров для резервной БД

Если используется DUPLICATE без соединения TARGET,
вы не можете использовать SPFILE, иначе получите:

RMAN-05537: DUPLICATE without TARGET connection when auxiliary instance is started
with spfile cannot use SPFILE clause


1) Создать текстовую копию файла параметров на Primary БД

SQL> create pfile='/tmp/init$ORACLE_SID.ora' from spfile;

2) Скопировать полученный файл на сервер резервной БД в $ORACLE_HOME/dbs

3) Модифицировать (заменить) значение TEST_OMEGA01 на TEST_OMEGA02

cd $ORACLE_HOME/dbs
vi -c "%s/TEST_OMEGA01/TEST_OMEGA02/gi" -c "wq" init${ORACLE_SID}.ora

4) Преобразовать PFILE в SPFILE и запустить AUXILIARY экземпляр в режиме NOMOUNT

cd $ORACLE_HOME/dbs
sqlplus / as sysdba
SQL> startup nomount pfile= init${ORACLE_SID}.ora
SQL> create spfile from pfile;
SQL> shutdown immediate
SQL> STARTUP NOMOUNT


Подготовка параметров инициализации для Standby БД:

alter system set CONTROL_FILES='+DATA','+REDO1','+REDO2' scope=spfile sid='*';
alter system set DB_UNIQUE_NAME = 'TEST_OMEGA02' scope=spfile sid='*';

-- В случае использования ASM+OMF
alter system set DB_CREATE_FILE_DEST = "+DATA" scope=both sid='*';
alter system set DB_CREATE_ONLINE_LOG_DEST_1 = "+REDO1" scope=both sid='*';
alter system set DB_CREATE_ONLINE_LOG_DEST_2 = "+REDO2" scope=both sid='*';

-- Параметры
alter system set LOG_ARCHIVE_DEST_1 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST' scope=spfile sid='*';
alter system set LOG_ARCHIVE_DEST_2 = '' scope=both sid='*';
alter system reset LOG_ARCHIVE_DEST_2 scope=spfile sid='*';
alter system set FAL_SERVER = 'TEST_OMEGA01' scope=both sid='*';
alter system set FAL_CLIENT = 'TEST_OMEGA02' scope=both sid='*';
alter system set STANDBY_FILE_MANAGEMENT = 'AUTO' scope=both sid='*';
alter system set REMOTE_LOGIN_PASSWORDFILE = "EXCLUSIVE" scope=spfile sid='*';


Параметры конвертации возможно такие:

alter system set DB_FILE_NAME_CONVERT  =
                       '+DATA/TEST_OMEGA01/', '+DATA/TEST_OMEGA02/',
                       '+REDO1/TEST_OMEGA01/','+REDO1/TEST_OMEGA02/',
                       '+REDO2/TEST_OMEGA01/','+REDO2/TEST_OMEGA02/' scope=spfile sid='*';

alter system set LOG_FILE_NAME_CONVERT =
                       '+DATA/TEST_OMEGA01/', '+DATA/TEST_OMEGA02/',
                       '+REDO1/TEST_OMEGA01/','+REDO1/TEST_OMEGA02/',
                       '+REDO2/TEST_OMEGA01/','+REDO2/TEST_OMEGA02/' scope=spfile sid='*';


Применим эти параметры:

SHUTDOWN IMMEDIATE;
STARTUP NOMOUNT;



Создание резервной БД с помощью RMAN


На основной БД (Primary database) включить режим игнорирования NOLOGGING операций

SQL> alter database force logging;

SQL> select force_logging from v$database;

На основной БД (Primary database) добавить Standby Redo Log files по формуле N+1

SQL> alter database add standby logfile thread 1 SIZE X[G|M];

где X[G|M] – размер журнала на Primary database
N - количество групп оперативных журналов на Primary database


ALTER DATABASE ADD STANDBY LOGFILE SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE SIZE 52428800;


SQL> select group#,bytes/1024/1024 from v$standby_log;


На резервной БД (Standby database) запустить AUXILIARY экземпляр в режиме NOMOUNT.

SQL> STARTUP NOMOUNT



Active Database Duplication:

Копирование файлов с основной БД с помощью утилиты RMAN
Подключение к RMAN каталогу не требуется

$ORACLE_HOME/bin/rman target=sys/password@TEST_OMEGA01 \
                      auxiliary=sys/password@TEST_OMEGA02

RMAN> run {

   set archivelog destination to '+DATA';

   duplicate target database for standby from active database nofilenamecheck dorecover;

}



Backup-based Duplication:

Копирование файлов из резервной копии БД с помощью утилиты RMAN
Необходимо выполнить подключение к RMAN каталогу

$ORACLE_HOME/bin/rman catalog=login/password@RCAT \
                      target=sys/password@TEST_OMEGA01 \
                      auxiliary=/
RMAN> run {

   set archivelog destination to '+DATA';
   duplicate target database for standby nofilenamecheck dorecover;

}



**********************************************************************************************************
cd $ORACLE_HOME/dbs
sqlplus / as sysdba
SQL> startup nomount pfile= initTEST.ora
SQL> create spfile from pfile;
SQL> shutdown immediate
SQL> STARTUP NOMOUNT

startup nomount pfile=initTEST.ora

$ORACLE_HOME/bin/rman target=sys/welcome1@TEST_OMEGA01  auxiliary=sys/welcome1@TEST_OMEGA02

RMAN>

run {
set archivelog destination to '+DATA';
duplicate target database for standby from active database
spfile
parameter_value_convert 'TEST_OMEGA01','TEST_OMEGA02'
set db_unique_name='TEST_OMEGA02'
set db_file_name_convert='+DATA/TEST_OMEGA01/datafile/','/u02/oradata/TEST_OMEGA02/','+DATA/TEST_OMEGA01/tempfile/','/u02/oradata/TEST_OMEGA02/'
set log_file_name_convert='+DATA/TEST_OMEGA01/onlinelog/','/u02/oradata/TEST_OMEGA02/'
set db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
set control_files='/u02/oradata/TEST_OMEGA01/control01.ctl','/u01/app/oracle/fast_recovery_area/TEST_OMEGA02/control02.ctl'
nofilenamecheck dorecover;
}

*************************************************************************************************************



Настроить авто-удаление архивных логов на стороне Primary + Standby database

На стороне PRIMARY database
Необходимо выполнить подключение к RMAN каталогу

rman catalog=login/password@RCAT  target=/
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY BACKED UP 1 TIMES TO 'SBT_TAPE';

На стороне STANDBY database
Подключение к RMAN каталогу не требуется

rman nocatalog target=/
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;



Настройка FRA репозитария для хранения архивных и flashback логов

Выполнить на обоих БД

alter system set DB_RECOVERY_FILE_DEST = '+FRA' scope=spfile sid='*';
alter system set DB_RECOVERY_FILE_DEST_SIZE = 10G scope=spfile sid='*';
alter system set LOG_ARCHIVE_DEST_1 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST' scope=spfile sid='*';


Настройка Data Guard

Перед созданием DG конфигурации необходимо убиться что Data Guard Broker
запущен на каждом экземпляре БД входящей в будущую конфигурации:

SQL> alter system set dg_broker_start=TRUE scope=both sid='*';

На Primary узле выполнить следующее:

$ dgmgrl

DGMGRL> connect sys/******

DGMGRL> show configuration;
DGMGRL> disable configuration;
DGMGRL> remove configuration;

DGMGRL> create configuration 'TEST' as primary database is 'TEST_OMEGA01' connect identifier is TEST_OMEGA01;

DGMGRL> add database 'TEST_OMEGA02' as connect identifier is TEST_OMEGA02 maintained as physical;

DGMGRL> show configuration;
DGMGRL> enable configuration;


Установка режима защиты данных

MAXPERFORMANCE
Данный режим защиты устанавливается по умолчанию.

MAXAVAILABILITY
$ dgmgrl /
DGMGRL> EDIT DATABASE 'TEST_OMEGA01' SET PROPERTY 'LogXptMode'='SYNC';
DGMGRL> EDIT DATABASE 'TEST_OMEGA02' SET PROPERTY 'LogXptMode'='SYNC';
DGMGRL> EDIT CONFIGURATION SET PROTECTION MODE AS MAXAVAILABILITY;

MAXPROTECTION
$ dgmgrl /
DGMGRL> EDIT DATABASE 'TEST_OMEGA01' SET PROPERTY 'LogXptMode'='SYNC';
DGMGRL> EDIT DATABASE 'TEST_OMEGA02' SET PROPERTY 'LogXptMode'='SYNC';
DGMGRL> EDIT CONFIGURATION SET PROTECTION MODE AS MAXPROTECTION;


Проверка режима защиты данных в основной БД (Primary database)

SQL> SELECT PROTECTION_MODE FROM V$DATABASE;


Выполнение операции "Failover" с помощью Data Guard

Существует два режима активации резервной БД в случае исчезновения основной БД.

Операция "Complete Failover" с помощью Data Guard

Эта операция активации резервной БД вследствие недоступности или потери основной БД.
Перед данной операцией будут применены ВСЕ накопленные изменения на резервной БД
для недопущения потери данных.

Подключаемся к Standby:

$ dgmgrl

DGMGRL> connect sys/******@TEST_OMEGA02
DGMGRL> show configuration;

Configuration - DBNAME

  Protection Mode: MaxPerformance
  Databases:
    TEST_OMEGA01 - Primary database
    TEST_OMEGA02 - Physical standby database

-- Активировать резервную БД

DGMGRL> FAILOVER TO 'TEST_OMEGA02';


Операция "Immediate Failover" с помощью Data Guard

Эта операция активации резервной БД вследствие недоступности или потери основной БД.
Перед данной операцией НЕ будут применены накопленные изменения на резервной БД,
т.е. резервная БД будет активирована в том состоянии в котором она находилась на момент запуска команды.

Данный режим активации обычно используют если произошло следующее:

An ORA-752 error has occurred at the standby database
An ORA-600 [3020] error has occurred at the standby database and Oracle support has determined
that it was caused by a lost write at the primary database
A complete failover is not possible

Подключаемся к Standby:

$ dgmgrl

DGMGRL> connect sys/******@TEST_OMEGA02
DGMGRL> show configuration;

Configuration - DBNAME

  Protection Mode: MaxPerformance
  Databases:
    TEST_OMEGA01 - Primary database
    TEST_OMEGA02 - Physical standby database


-- Активировать резервную БД

DGMGRL> FAILOVER TO 'TEST_OMEGA02' IMMEDIATE;



Выполнение операции "Switchover" (смена ролей) с помощью Data Guard

Данная операция выполняет плановую смену ролей между серверами БД.
На основании документа техподдержки: Doc ID 1582837.1 + Doc ID 1305019.1

Запретить отложенный накат изменений на Standby БД, если он включен

Подключаемся к Standby:

$ . oraenv
$ dgmgrl
DGMGRL> connect sys/******@TEST_OMEGA02
DGMGRL> SHOW DATABASE 'TEST_OMEGA02' DELAYMINS;
DGMGRL> EDIT DATABASE 'TEST_OMEGA02' SET PROPERTY 'DELAYMINS'='0';


Запретить работу резервной БД в режиме Real Time Query (Active Data Guard Mode)

Согласно документации (требованиям) перед выполнением операции Switchover необходимо запретить
использование режима Real Time Query (Active Data Guard Mode) для резервной БД.

Проверка использования режима Real Time Query (Active Data Guard)

Подключаемся к Standby:

$ . oraenv
$ sqlplus / as sysdba

SQL> select database_role, open_mode from v$database;

DATABASE_ROLE   |OPEN_MODE
----------------|--------------------
PHYSICAL STANDBY|READ ONLY WITH APPLY - > Real Time Query is ON


Выполнить смену режима работы резервной БД – отменить режим Real Time Query (запретить ADG)

(!) Убедиться, что работы проводятся на сервере с ролью STANDBY
(!) Будет выполнена перезагрузка резервной БД

Подключаемся к Standby:

Вариант 1 – SQL*Plus
$ . oraenv
$ sqlplus / as sysdba
SQL> shutdown immediate;
SQL> startup nomount;
SQL> alter database mount standby database;  

Подключаемся к Standby:

Вариант 2 - DGMGRL
$ dgmgrl
DGMGRL> connect sys/******@TEST_OMEGA02
DGMGRL> EDIT DATABASE 'TEST_OMEGA02' SET STATE='OFFLINE';
DGMGRL> STARTUP MOUNT
DGMGRL> EDIT DATABASE 'TEST_OMEGA02' SET STATE='APPLY-ON';


Проверка отмены режима Real Time Query (Active Data Guard)

Подключаемся к Standby:

$ . oraenv
$ sqlplus / as sysdba

SQL> select database_role, open_mode from v$database;

DATABASE_ROLE   |OPEN_MODE
----------------|--------------------
PHYSICAL STANDBY|MOUNTED              - > Real Time Query is OFF



Выполнить операцию Switchover (Смена Ролей)

Обратите внимание, что при подключении к DGMGRL вы должны использовать
имя пользователя и пароль для SWITCHOVER.
Если вы подключаетесь к DGMGRL с использованием учетных данных хоста (dgmgrl / ),
то SWITCHOVER отработает, и новый Primary будет автоматически доступен,
но Standby (старую Primary), придется перезапустить вручную в режиме Physical standby.

Подключаемся к Primary:

$ dgmgrl

DGMGRL> connect sys/******@TEST_OMEGA01
DGMGRL> show configuration;

Configuration - DBNAME

  Protection Mode: MaxPerformance
  Databases:
    TEST_OMEGA01 - Primary database
    TEST_OMEGA02 - Physical standby database


-- Выполнить проверку готовности БД к смене роли | 12c only
DGMGRL> VALIDATE DATABASE 'TEST_OMEGA02';

-- Выполнить смену ролей между серверами БД

DGMGRL> SWITCHOVER TO 'TEST_OMEGA02';


Восстановить отложенный накат изменений на Standby БД, если он нужен
Сейчас Standby (TEST_OMEGA01)

Подключаемся к Standby:

$ . oraenv
$ dgmgrl
DGMGRL> connect sys/******@TEST_OMEGA01
DGMGRL> SHOW DATABASE 'TEST_OMEGA01' DELAYMINS;
DGMGRL> EDIT DATABASE 'TEST_OMEGA01' SET PROPERTY 'DELAYMINS'='';


Открытие резервной БД в режиме READ ONLY (Active Data Guard Mode)

Подключаемся к Standby:

$ dgmgrl

DGMGRL> connect sys/******@TEST_OMEGA01
DGMGRL> show configuration;

Configuration - DBNAME

  Protection Mode: MaxPerformance
  Databases:
    TEST_OMEGA02 - Primary database
    TEST_OMEGA01 - Physical standby database


-- Открыть резервную БД в режиме READ ONLY (Active Data Guard Mode)

DGMGRL> edit database 'TEST_OMEGA01' set state='APPLY-OFF';
DGMGRL> SQL "ALTER DATABASE OPEN READ ONLY";
DGMGRL> edit database 'TEST_OMEGA01' set state='APPLY-ON';


Мониторинг Data Guard конфигурации


Проверка статуса конфигурации

DGMGRL> SHOW CONFIGURATION;

Проверка статуса БД

DGMGRL> SHOW DATABASE 'TEST_OMEGA01';
DGMGRL> SHOW DATABASE 'TEST_OMEGA02';


Проверка несовпадающих параметров между экземпляром БД и репозиторием DG брокера

DGMGRL> SHOW DATABASE 'TEST_OMEGA01' INCONSISTENTPROPERTIES;
DGMGRL> SHOW DATABASE 'TEST_OMEGA02' INCONSISTENTPROPERTIES;


Проверка несовпадающих параметров между экземпляром БД и репозиторием DG брокера для службы Redo Transport

DGMGRL> SHOW DATABASE 'TEST_OMEGA01' INCONSISTENTLOGXPTPROPS;
DGMGRL> SHOW DATABASE 'TEST_OMEGA01' INCONSISTENTLOGXPTPROPS;


четверг, 19 февраля 2009 г.

Postinstall scripts (Запуск дополнительных скриптов)

Запустить остановленный после обновления экземпляр основной БД

su – oracle

--Setup New Environment for 12c
. oraenv
ORACLE_SID = [+ASM] ? TESTDB

sqlplus / as sysdba
SQL> STARTUP
SQL> exit

ВАРИАНТ 1
cd $ORACLE_HOME/rdbms/admin
$ sqlplus / as sysdba
SQL> @utlu121s.sql
SQL> @catuppst.sql
SQL> @utlrp.sql
SQL> @utluiobj.sql
SQL> exit

ВАРИАНТ 2
cd $ORACLE_HOME/rdbms/admin
$ORACLE_HOME/perl/bin/perl catcon.pl -n 1 -e -b utlu121s -d '''.''' utlu121s.sql
$ORACLE_HOME/perl/bin/perl catcon.pl -n 1 -e -b catuppst -d '''.''' catuppst.sql
$ORACLE_HOME/perl/bin/perl catcon.pl -n 1 -e -b utlrp    -d '''.''' utlrp.sql
$ORACLE_HOME/perl/bin/perl catcon.pl -n 1 -e -b utluiobj -d '''.''' utluiobj.sql


Обязательно проверить целостность системного словаря БД после обновления на предмет
раннего обнаружения ошибок и их устранение если таковые есть.


Note 556610.1  Script to Collect DB Upgrade/Migrate Diagnostic Information (dbupgdiag.sql)

cd < location of the script >
$ sqlplus / as sysdba
sql> alter session set nls_language='American';
sql> @dbupgdiag.sql
sql> exit


При использовании GI необходимо обновить зарегистрированный объект БД в репозитории GI
с указанием нового ORACLE_HOME=/u01/app/oracle/product/12.1.0.2


--Setup New Environment for 12c
. oraenv
ORACLE_SID = [+ASM] ? TESTDB

srvctl upgrade database -d TESTDB_OMEGA -o /u01/app/oracle/product/12.1.0.2



Post Upgrade Steps (Дальнейшие действия)

Загрузить PSU Modified SQL Files into the Database

--Setup New Environment for 12c
. oraenv
ORACLE_SID = [+ASM] ? TESTDB

sqlplus /nolog
SQL> CONNECT / AS SYSDBA
SQL> shutdown immediate
SQL> startup UPGRADE
SQL> quit

cd $ORACLE_HOME/OPatch
./datapatch –verbose

sqlplus /nolog
SQL> CONNECT / AS SYSDBA
SQL> shutdown
SQL> startup
SQL> @?/rdbms/admin/utlrp

Логи работы утилиты ./datapatch –verbose


Проверить наличие установленных PSU патчей в системном словаре БД

Проверка ВАРИАНТ 1

col action format a18
col action_time format a28
col version_id format a18
col description format a64
select action,
       version||'.'||bundle_id as version_id,
       description,
       status,
       ACTION_TIME,
       patch_id
from DBA_REGISTRY_SQLPATCH;

Проверка ВАРИАНТ 2

SQL> set serverout on
SQL> exec dbms_qopatch.get_sqlpatch_status;


Установка параметров инициализации экземпляра

В случае если обновление прошло удачно и откат БД не планируется,
необходимо внести изменения в параметры инициализации экземпляра основной и резервной БД
и выполнить рестарт каждого экземпляра.

--Setup New Environment for 12c
. oraenv
ORACLE_SID = [+ASM] ? TESTDB

$ sqlplus / as sysdba

-- Setup new compatible mode
--- !!! alter system set compatible = "12.1.0.2.0" scope=spfile sid='*';

-- Switch off new adaptive features for run in compatible mode 11gR2
alter system set optimizer_adaptive_features=FALSE scope=both sid='*';

Устранить известные критические ошибки для версии 12cR1 (12.1.0.2)
-- Bug in 12.1.0.2 - Note 2034610.1
alter system set "_optimizer_aggr_groupby_elim"        = FALSE       scope=spfile sid='*';
alter system set "_optimizer_reduce_groupby_key"       = FALSE       scope=spfile sid='*';
-- Bug 18304693 - Note 18304693.8
alter system set "_optimizer_cost_based_transformation"='EXHAUSTIVE' scope=spfile sid='*';
alter system set "_optimizer_reuse_cost_annotations"   = FALSE       scope=spfile sid='*';
-- Bug 22173980
alter system set "_rowsets_enabled"                    = FALSE       scope=spfile sid='*';
-- Bug 19894622
alter system set "_optimizer_unnest_scalar_sq"         = FALSE       scope=spfile sid='*';
-- Bug in 12.1.0.2 Bug 21056506
alter system set "_use_single_log_writer"              = TRUE        scope=spfile sid='*';
-- Bug in 12.1.0.2 Bug 22529728 - Note 22529728.8
alter system set "_optimizer_gather_stats_on_load"     = FALSE       scope=both   sid='*';

SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP
SQL> exit



Запуск Data Guard брокера
Запустить работу Data Guard брокера на основной и резервной БД

Setup new 12c Environment

--Setup New Environment for 12c
. oraenv
ORACLE_SID = [+ASM] ? TESTDB

# sqlplus / as sysdba
SQL> ALTER SYSTEM SET DG_BROKER_START=TRUE scope=both sid='*';

Разрешить конфигурацию Data Guard брокера на основной и резервной БД
Выполнять на узле с ролью PRIMARY

--Setup New Environment for 12c
. oraenv
ORACLE_SID = [+ASM] ? TESTDB

# dgmgrl

DGMGRL> connect sys/*******@PRIMARY_DATABASE

DGMGRL> SHOW CONFIGURATION;
DGMGRL> ENABLE CONFIGURATION;
DGMGRL> SHOW CONFIGURATION;

Configuration - TESTDB

  Protection Mode: MaxPerformance
  Members:
  TESTDB_OMEGA - Primary database
    TESTDB_STB_OMEGA  - Physical standby database (disabled)

Configuration Status:
SUCCESS

DGMGRL> ENABLE DATABASE 'TESTDB_STB_OMEGA';
DGMGRL> SHOW DATABASE 'TESTDB_STB_OMEGA';
DGMGRL> exit

На этом шаге основные процессы обновления боевой конфигурации БД на версию 12с завершены.