четверг, 21 апреля 2016 г.

вторник, 16 февраля 2016 г.

GAP

FROM primary server

. /etc/profile.d/oracle.sh
ssh STANTBY_SSH 'printf "%s\nexit" "select *  from V\$ARCHIVE_GAP;"|sqlplus / as sysdba' | grep -P "\s+\d+\s+\d+\s+\d+" | awk '{print  "restore archivelog from sequence "$2" until sequence "$3"
thread "$1";\nexit"}' | /opt/grid/bin/rman target /

четверг, 12 ноября 2015 г.

мониторинг с помощью sysstat

1)
vmstat -t 5 > /var/log/vmstat.log &
запуск данной команды позволит записывать в файл суммарные показатели с 5 секундным интервалом (можно установить любой)
пример выдачи
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0 447272 1474168 170052 623788    0    0     0     3    0    0  1  0 98  1  0       2015-11-06 00:09:01 MSK
 0  0 447272 1475648 170052 623792    0    0     0    26  254  144  1  1 96  2  0       2015-11-06 00:09:06 MSK
 0  0 447272 1475904 170052 623792    0    0     0     0   71   90  0  0 100  0  0      2015-11-06 00:09:11 MSK


2) требуется установить пакет для съема статистики
apt-get install sysstat

pidstat -d -r -u -h 5 > /var/log/pidstat.log &
запуск данной команды позволит записывать в файл статисческие показатели по активным процессам с 5 секундным интервалом (можно установить любой)
пример выдачи
Linux 2.6.32-431.el6.x86_64 ()  11/06/2015      _x86_64_        (4 CPU)

#      Time       PID    %usr %system  %guest    %CPU   CPU  minflt/s  majflt/s     VSZ    RSS   %MEM   kB_rd/s   kB_wr/s kB_ccwr/s  Command
 1446758785      2837    0.00    0.20    0.00    0.20     3     83.70      0.00  101108    924   0.02      0.00      0.00      0.00  pidstat
 1446758785     12971    0.00    0.20    0.00    0.20     2      0.00      0.00 2950672 107984   2.75      0.00      0.00      0.00  mysqld

#      Time       PID    %usr %system  %guest    %CPU   CPU  minflt/s  majflt/s     VSZ    RSS   %MEM   kB_rd/s   kB_wr/s kB_ccwr/s  Command
 1446758790        21    0.00    0.20    0.00    0.20     2      0.00      0.00       0      0   0.00      0.00      0.00      0.00  events/2
 1446758790      2837    0.20    0.40    0.00    0.60     3     85.20      0.00  101108    952   0.02      0.00      0.00      0.00  pidstat
 1446758790     20174    0.20    0.00    0.00    0.20     3      0.00      0.00 1240316 218264   5.56      0.00      0.00      0.00  ruby

#      Time       PID    %usr %system  %guest    %CPU   CPU  minflt/s  majflt/s     VSZ    RSS   %MEM   kB_rd/s   kB_wr/s kB_ccwr/s  Command
 1446758795         9    0.00    0.20    0.00    0.20     1      0.00      0.00       0      0   0.00      0.00      0.00      0.00  ksoftirqd/1
 1446758795       980    0.00    0.00    0.00    0.00     0      0.00      0.00  249856   5136   0.13      0.00      0.80      0.00  rsyslogd
 1446758795      2837    0.20    0.40    0.00    0.60     3     83.80      0.00  101108    952   0.02      0.00      0.00      0.00  pidstat
 1446758795     12971    0.00    0.20    0.00    0.20     2      0.00      0.00 2950672 107984   2.75      0.00      0.00      0.00  mysqld

iostat -d -k -t -x  -z 5 > /var/log/iostat.log &
запуск данной команды позволит записывать в файл суммарные показатели по нагрузке на дисковую подсистему с 5 секундным интервалом (можно установить любой)
пример выдачи
Linux 2.6.32-431.el6.x86_64 ()  11/06/2015      _x86_64_        (4 CPU)

11/06/2015 12:17:53 AM
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.03     1.58    0.02    1.23     1.00    10.40    18.31     0.07   55.78  31.92   3.98
scd0              0.00     0.00    0.00    0.00     0.00     0.00     8.00     0.00    1.30   1.30   0.00
dm-0              0.00     0.00    0.01    2.29     0.67     9.32     8.67     0.13   54.46  17.23   3.97
dm-1              0.00     0.00    0.04    0.04     0.14     0.16     8.00     0.04  574.35   0.66   0.00
dm-2              0.00     0.00    0.00    0.23     0.19     0.92     9.48     0.11  476.89   0.27   0.01

11/06/2015 12:17:58 AM
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util

11/06/2015 12:18:03 AM
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.20     0.00     0.80     8.00     0.00   20.00  20.00   0.40
dm-0              0.00     0.00    0.00    0.20     0.00     0.80     8.00     0.00   20.00  20.00   0.40

пятница, 28 августа 2015 г.

Создание копии базы

Самый быстрый путь создания копии базы (со структорой, да и с данными тоже)
воспользоваться dbca
и создать темплейт
а потом из этого темплейта создать новую базу

среда, 13 мая 2015 г.

мониторинг бэкапов

Команды RMAN, позволяющие следить за бэкапами

report need backup - список датафайлов требующих наличия резервной копии с заданным параметром redundancy

report unrecoverable; - список файлов которые невосстановимы в случае аварии (отсутсвуют бэкапы)

restore database preview; - проверка процедуры восстановления, показывает список бэкапов в какой очердности они будут накатываться

restore database validate; - проверка валидности бэкапов, на предмет битых блоков.

также проверки на валидность других  файлов необходимых для восстановления
  • RESTORE ARCHIVELOG FROM sequence xx UNTIL SEQUENCE yy THREAD nn VALIDATE;
  • RESTORE CONTROLFILE VALIDATE;
  • RESTORE SPFILE VALIDATE;

Восстановление с инкрементальными копиями

rman> restore database;
rman> recover database NOREDO;

среда, 18 февраля 2015 г.

Скрипт для бэкапа

#!/usr/bin/perl -w
$ENV{"ORACLE_BASE"}='/opt/oracle';
$ENV{"ORACLE_HOME"}='/opt/oracle/product/11.2';
$ENV{"PATH"}="$ENV{ORACLE_HOME}/bin:$ENV{ORACLE_HOME}/lib:$ENV{ORACLE_HOME}/lib32:$ENV{PATH}:.";
$ENV{"LD_LIBRARY_PATH"}="$ENV{'LD_LIBRARY_PATH'}:$ENV{ORACLE_HOME}/lib:$ENV{ORACLE_HOME}/lib32:/lib:/usr/lib";
$ENV{"CLASSPATH"}="$ENV{ORACLE_HOME}/JRE:$ENV{ORACLE_HOME}/jlib:$ENV{ORACLE_HOME}/rdbms/jlib";
my $RMANCMD='rman target /';
my $ARCH_RMAN = <<'EOF';
backup  archivelog all delete all input;
exit;
EOF

my $INCR0_RMAN = <<'EOF';
sql 'alter system archive log current';
backup incremental level 0 database;
backup  archivelog all delete all input;
crosscheck archivelog all;
crosscheck backup;
delete noprompt obsolete ;
exit
EOF
my $INCR1_RMAN = <<'EOF';
sql 'alter system archive log current';
backup incremental level 1 database;
backup  archivelog all delete all input;
exit
EOF
my $CUM_RMAN = <<'EOF';
sql 'alter system archive log current';
backup incremental level 1 CUMULATIVE database;
backup  archivelog all delete all input;
exit
EOF
my @SID=`lsnrctl status | grep Instance | awk '{print \$2}' | sort | uniq`;
my $sql_rman=q(select 'CNT='||count(1) from V\$RMAN_STATUS WHERE STATUS like 'RUNNING%';);
my $sql_db=q(select 'NAME='||name from V\$DATABASE;);
my $sql_incr0=q(SELECT 'CNT='||COUNT(1)  FROM V\$BACKUP_SET WHERE INCREMENTAL_LEVEL = 0  AND completion_time>=TRUNC(SYSDATE, 'month'););
my $sql_incr00=q(SELECT 'CNT='||COUNT(1)  FROM V\$BACKUP_SET WHERE INCREMENTAL_LEVEL = 0 AND completion_time>=TRUNC(CURRENT_DATE););
my $sql_incr1=q(SELECT 'CNT='||COUNT(1)  FROM V\$BACKUP_SET WHERE INCREMENTAL_LEVEL = 1 AND completion_time>=TRUNC(CURRENT_DATE););
foreach my $sid (@SID)
{
    next if ($sid=~/ASM/);
    chomp($sid);
    $sid=~s/\"|\"|,//g;
    print $sid,"\n";
    ### check db name
    $ENV{ORACLE_SID}=$sid;
    `echo "$sql_db" | sqlplus / as sysdba`=~/NAME=(\w.+)/;
    print $1,"\n";
   
    ####check current backup job
    `echo "$sql_rman" | sqlplus / as sysdba`=~/CNT=(\d+)/;
    if ($1 > 0 ) {
exit;
    }
    ####check increment 0 backup exists
    `echo "$sql_incr0" | sqlplus / as sysdba`=~/CNT=(\d+)/;
    ### if incr0 is absent
    if ($1 == 0) {
       rman_job($INCR0_RMAN);
next;
    }
   
    ####check scheduler
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
    ###every sunday
    if ($wday == 0 && $hour>4 && $mday<=7) {
    ####check increment 0 backup today exists
    `echo "$sql_incr00" | sqlplus / as sysdba`=~/CNT=(\d+)/;
if ($1 == 0 ) {
       #increment 0
       rman_job($INCR0_RMAN);
   next;  
}
    }
    elsif ($wday == 0 && $hour>4){
    `echo "$sql_incr1" | sqlplus / as sysdba`=~/CNT=(\d+)/;
if ($1 == 0 ) {
       #increment 0
       rman_job($CUM_RMAN);
   next;  
}
    }
    elsif ($wday>0  && $hour>4 ){
    `echo "$sql_incr1" | sqlplus / as sysdba`=~/CNT=(\d+)/;
if ($1 == 0 ) {
       #increment 0
       rman_job($INCR1_RMAN);
   next;  
}
    }
   
    if ( ( $hour % 3 ) == 0){
rman_job($ARCH_RMAN);
    }
   
}
sub rman_job {
my $scr=shift;
   open(CMD,"| $RMANCMD");
   print CMD $scr;
   close CMD;
}

четверг, 13 ноября 2014 г.

Stream таблиц

создать пользователей STREAM_ADMIN на обоих базах

DECLARE
tables varchar2(4000);
BEGIN
tables := '"SHM1"."TABLE1",
"SHM1"."TABLE2"';
DBMS_STREAMS_ADM.MAINTAIN_TABLES(
table_names   => tables,
source_directory_object      =>      'DTPUMP',
destination_directory_object     =>      'DTPUMP',
source_database          =>      'src.domain',
destination_database         =>      target.domain',
perform_actions              =>      TRUE,
script_name                      =>      'streams_setup.sql',
script_directory_object          =>      'DTPUMP',
dump_file_name               =>      'streams_setup.dmp',
capture_queue_user           =>       '"STREAM_ADMIN"',
apply_queue_user             =>      '"STREAM_ADMIN"',
log_file                 =>      'streams_setup.log',
bi_directional               =>      false,
include_ddl                  =>      true);
END;
/


на исходной базе пронать инициализацию
BEGIN
for rec in (select distinct schema_name||'.'||object_name  as tbl from ALL_STREAMS_RULES)
loop
DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION (
  table_name   => rec.tbl
, supplemental_logging => 'all'
);
end loop;
END;
/

<scn>=select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER from dual


на таргетной тоже, scn взять с исходной

BEGIN
for rec in (select distinct schema_name||'.'||object_name  as tbl from ALL_STREAMS_RULES)
loop
DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN (
  source_object_name   => rec.tbl
, source_database_name => 'target.domain'
, instantiation_scn    => <scn>
);
end loop;
END;
/



создание STREAM ADMIN

CREATE TABLESPACE STREAM_TBS DATAFILE '+ASMDATA' 
  SIZE 1G REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

CREATE USER stream_admin IDENTIFIED BY <password>
   DEFAULT TABLESPACE stream_tbs
   QUOTA UNLIMITED ON stream_tbs;


GRANT CONNECT, RESOURCE, DBA TO stream_admin;

BEGIN
  DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE(
    grantee          => 'stream_admin',    
    grant_privileges => true);
END;
/


COMMIT
/

четверг, 9 октября 2014 г.

SMTP, отсылка писем

С учетом того, что smtp системы перешли на SSL/TLS
оракл необходимо поднастроить с учетом этого

1. создать wallet
  mkdir /opt/oracle/wallet
  mkstore -wrl "/opt/oracle/wallet" -create

2) посмотреть корневой сертификат вашего смтп сервера
openssl s_client -connect smtp.yandex.ru:587 -starttls smtp

CONNECTED(00000003)
depth=2 C = PL, O = Unizeto Sp. z o.o., CN = Certum CA
verify return:1
depth=1 C = PL, O = Unizeto Technologies S.A., OU = Certum Certification Authority, CN = Certum Level IV CA
verify return:1
depth=0 C = RU, O = Yandex LLC, OU = ITO, L = Moscow, ST = Russian Federation, CN = smtp.yandex.ru, emailAddress = pki@yandex-team.ru
verify return:1

закачать этот сертификат себе
и записать в wallet

orapki wallet add -wallet /opt/oracle/wallet/ewallet.p12 -trusted_cert -cert unizeto.crt


3) Не забыть настроить ACL для соотствующих портов

BEGIN
  DBMS_NETWORK_ACL_ADMIN.assign_acl (
    acl         => 'acl_smtp.xml',
    host        => 'smtp.yandex.ru', 
    lower_port  => 587,
    upper_port  => 587);
    COMMIT;
END;

просмотреть чего там в ACL настроено можно так
SELECT host, lower_port, upper_port, acl
FROM   dba_network_acls;

SELECT * FROM dba_network_acl_privileges;


4) ну и цепляемся к серверу

       l_reply := UTL_SMTP.OPEN_CONNECTION(
         host => common.GET_SETTING('MAILSERVER',MAILSERVER),
         port => common.GET_SETTING('MAILPORT',MAILPORT),
         c => l_mail_conn,
         wallet_path => 'file:/opt/oracle/wallet',
         wallet_password => 'wallet_pas',
         secure_connection_before_smtp => FALSE
         );
    IF l_reply.code != 220
      THEN
        raise_application_error(-20000, 'utl_smtp.open_connection: '||l_reply.code||' - '||l_reply.text);
      END IF;
  dbms_output.put_line('utl_smtp.ehlo');

  l_replies := utl_smtp.ehlo(l_mail_conn, 'pmga.ru');

  FOR ri IN 1..l_replies.COUNT
  LOOP
    dbms_output.put_line(l_replies(ri).code||' - '||l_replies(ri).text);
  END LOOP;
        
      l_reply := UTL_SMTP.STARTTLS(l_mail_conn);
  IF l_reply.code != 220
  THEN
    raise_application_error(-20000, 'utl_smtp.starttls: '||l_reply.code||' - '||l_reply.text);
  END IF;      


      l_reply := UTL_SMTP.AUTH(
      c => l_mail_conn,
      username => common.GET_SETTING('MAILLOGIN','pmgadmin'),
      password => common.GET_SETTING('MAILPASS','pwd13pmg'),
      schemes  => utl_smtp.all_schemes);

 IF l_reply.code != 235
  THEN
    raise_application_error(-20000, 'utl_smtp.auth: '||l_reply.code||' - '||l_reply.text);
  END IF;

А дальше стандартное общение

      UTL_SMTP.MAIL(l_mail_conn,  common.GET_SETTING('MAILLOGIN',SENDER_EMAIL));
      UTL_SMTP.RCPT(l_mail_conn, in_mailto);

      UTL_SMTP.OPEN_DATA(l_mail_conn); -- open data sheet
      UTL_SMTP.WRITE_DATA(l_mail_conn, l_data);

      UTL_SMTP.CLOSE_DATA(l_mail_conn);
      UTL_SMTP.QUIT(l_mail_conn);


вторник, 30 сентября 2014 г.

RAC , RMAN и netbackup

Исходные данные: 2 ноды RAC (ora-big1, ora-big2), сервер netbackup (vm-netbackup)

Задача: настроить корректную схему бэкапа - incr 0 (1/month), cumm (1/week), incr 1 (1/day)
Скрипты бэкапов:
::::::::::::::
/opt/oracle-shared/backup/arch_backup.rman
::::::::::::::
backup device type sbt archivelog all delete all input;

::::::::::::::
/opt/oracle-shared/backup/cumm_backup.rman
::::::::::::::
backup incremental level 1 CUMULATIVE database plus archivelog delete input;
delete noprompt backup of archivelog until time 'sysdate-1';
crosscheck backup;
#delete noprompt obsolete;

::::::::::::::
/opt/oracle-shared/backup/full_backup.rman
::::::::::::::
crosscheck archivelog all;
crosscheck backup;
backup incremental level 0 database plus archivelog delete input;
#delete noprompt obsolete ;

::::::::::::::
/opt/oracle-shared/backup/incr_backup.rman
::::::::::::::
backup incremental level 1 database plus archivelog delete input;
delete noprompt backup of archivelog until time 'sysdate-1';
crosscheck backup;
#delete noprompt obsolete ;

Проблема: по умолчанию ноды не видят бэкапы сделанные другой нодой. соответственно crosscheck уводит в expired бэкапа сделанные другой нодой, а delete nopromp obsolete затирает их


Решение:

в rman:
CONFIGURE DEVICE TYPE 'SBT_TAPE' PARALLELISM 2 BACKUP TYPE TO BACKUPSET;
CONFIGURE CHANNEL 1 DEVICE TYPE 'SBT_TAPE' PARMS  'ENV=(NB_ORA_POLICY=oraPOLICY,NB_ORA_SERV=vm-netbackup,NB_ORA_CLIENT=ora-big1)';
CONFIGURE CHANNEL 2 DEVICE TYPE 'SBT_TAPE' PARMS  'ENV=(NB_ORA_POLICY=oraPOLICY,NB_ORA_SERV=vm-netbackup,NB_ORA_CLIENT=ora-big2)';

на vm-netbackup
cd /usr/opnv/netbackup/db/altnames
echo "ora-big2" >> ora-big1
echo "ora-big1" >> ora-big2

пятница, 19 сентября 2014 г.

смена пароля у ASMSNMP

$ asmcmd
ASMCMD> lspwusr
Username sysdba sysoper sysasm
     SYS   TRUE    TRUE   TRUE
 ASMSNMP   TRUE   FALSE  FALSE
ASMCMD>  orapwusr --modify --password ASMSNMP
Enter password: **********
ASMCMD>

четверг, 18 сентября 2014 г.

enq: TM - contention

Ожидание enq: TM - contention проявляется при наличии неиндексированных внешних ключей


Поиск всех нединдексированных полей в схеме

SELECT * FROM (
SELECT c.table_name, cc.column_name, cc.position column_position
FROM   user_constraints c, user_cons_columns cc
WHERE  c.constraint_name = cc.constraint_name
AND    c.constraint_type = 'R'
MINUS
SELECT i.table_name, ic.column_name, ic.column_position
FROM   user_indexes i, user_ind_columns ic
WHERE  i.index_name = ic.index_name
)
ORDER BY table_name, column_position;

вторник, 9 сентября 2014 г.

Corrupted blocks


подробнее про всякие методики решения проблемы
http://www.oracle-base.com/articles/misc/detect-and-correct-corruption.php


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

Поиск объекта с битым блоком

SELECT SEGMENT_TYPE,OWNER||'.'||SEGMENT_NAME
   FROM DBA_EXTENTS
   WHERE FILE_ID = <file_id> AND <corrupted_block> BETWEEN BLOCK_ID
   AND BLOCK_ID+BLOCKS -1

далее решаем

если индекс - пересоздаем - все просто
если таблица - пробуем либо оттранкетить либо пересоздать



среда, 16 июля 2014 г.

Копирование архивлогов на стендбай

вытаскиваем  архивлоги из асм в файловую систему

for i in $(asmcmd ls +ASMREDO/NAUCRM/ARCHIVELOG/); do
mkdir /opt/oracle/arc/$i
 for j in $(asmcmd ls +ASMREDO/NAUCRM/ARCHIVELOG/$i); do

  asmcmd cp +ASMREDO/NAUCRM/ARCHIVELOG/$i/$j /opt/oracle/arc/$i
done
done


перекидываем по scp на стендбай
регистрируем оптом
rman target /
catalog start with '/opt/oracle/arc'; 
recover standby database until cancel;

понедельник, 9 июня 2014 г.

четверг, 29 мая 2014 г.

Использование типа Object

Пример организации циклического буфера FIFO

Создаем глобальный тип массива на 100 элементов

CREATE type t_last_sess_arr is varray(100) of number(32,0);

Создаем объектный тип с полями текущей позиции массива и самим массивом.
В объекте 3 метода

  1. конструктор, инициализирующий массив пустыми значениями 
  2. процедура которая сдвигает позицию и заменяет элемент массива в этой позиции
  3. функция, которая возвращает объект с обновленным элементом и сдвинутой позицией
CREATE OR REPLACE
TYPE t_last_sess   AS OBJECT (
         position       INT
        , last_sess    t_last_sess_arr
        , CONSTRUCTOR FUNCTION t_last_sess
                RETURN SELF AS RESULT
        , MEMBER PROCEDURE addBS (b_session_id NUMBER)
        , MEMBER FUNCTION updArr (b_session_id NUMBER) RETURN t_last_sess
   );
/

CREATE OR REPLACE
TYPE BODY t_last_sess AS
  CONSTRUCTOR FUNCTION t_last_sess
    RETURN SELF AS RESULT
  AS
  BEGIN
    SELF.position := 1;
    SELF.last_sess := t_last_sess_arr();
    SELF.last_sess.EXTEND(100);
    RETURN;
  END t_last_sess;
  MEMBER PROCEDURE addBS (b_session_id NUMBER)
  IS
  BEGIN
    SELF.last_sess(SELF.position) := b_session_id;
    IF SELF.position = 100 THEN
        SELF.position := 1;
    ELSE
        SELF.position := SELF.position +1;
    END IF;
    RETURN;
  END addBS;
  MEMBER FUNCTION updArr (b_session_id NUMBER) RETURN t_last_sess
  IS
    l_arr t_last_sess;
  BEGIN
    l_arr:= SELF;
    l_arr.addBS(b_session_id);
    RETURN l_arr;
  END updArr;
END;
/



Пример использования данного объектного типа

Буфер для сохранения последних 100 сессий по каждому отдельному типу
create table last_sessions (
type_id int primary key,
sess_arr t_last_sess)
organization index;

Инициализация буфера для типа сессий=1
INSERT INTO last_sessions VALUES(1, t_last_sess());

Обновление буфера
update last_sessions t set t.sess_arr=t.sess_arr.updArr(<ИД сессии>) where bill_type_id=1;

среда, 14 мая 2014 г.

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

Определяем сессию для трассировки - SID, SERIAL# и инстанс в случае RAC

Трассировка по шаредам складывается в трейс файлы диспетчеров  и шаред серверов
Чтобы не собирать старую историю можно удалить(перенести) все трейс файлы из USER_DUMP_DEST

Включаем трассировку
exec dbms_monitor.SESSION_TRACE_ENABLE(SID, SERIAL#, TRUE, TRUE);

Выключаем трассировку
exec dbms_monitor.SESSION_TRACE_DISABLE(SID);

собираем данные из кучи файлов
trcsess output=trace.log session=SID.SERIAL# *

прогоняем tkprof
tkprof trace.log

Изучаем и анализируем результат

пятница, 11 апреля 2014 г.

добавления файла в стэндбай

В случае когда добавляются файлы в основную базу. На стэндбае они не появляются и автоматическая накатка архивлогов останавливается. Если руками попробовать восстановить мы получим следующую ошибку:
ORA-00283: recovery session canceled due to errors
ORA-01111: name for data file 6 is unknown - rename to correct file
ORA-01110: data file 6: '/opt/oracle/product/11gR2/db/dbs/UNNAMED00006'
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01111: name for data file 6 is unknown - rename to correct file
ORA-01110: data file 6: '/opt/oracle/product/11gR2/db/dbs/UNNAMED00006'


На standby базе данных

1.select name from v$datafile;
2. видим что то типа /opt/oracle/product/11gR2/db/dbs/UNNAMED00006
3. выполняем команду

alter database create datafile '/opt/oracle/product/11gR2/db/dbs/UNNAMED00006' as '+DATA' (или ваша нужная локация)

4.проверяем select name from v$datafile;
5. запускаем ручной рековер recover standby database until cancel;
6. переводим в авторежим alter database recover managed standby database ;