четверг, 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;