Настройка Сервера БД и Сервера Приложений


Необходимые дистрибутивы

Сервер БД
Oracle Database 10G
Дамп базы (схема BOX в случае нового клиента и схема клиента в случае тестового сервера)

Сервер приложений
Oracle Client (10)
SQL Navigator 5.4 (5.5)*
MS Office Excel 2003*
Free PDF (http://freepdf-xp.en.softonic.com/)
Foxit Reader (http://www.foxitsoftware.com/Secure_PDF_Reader/)
Дистрибутив CWMS3000
*отмеченные программные продукты не входят в комплект поставки, но желательны для правильной работы системы.

Настройка сервера БД

Установка Oracle 10g
Checking operating system version: must be 5.0, 5.1, 5.2 or 6.0.    Actual 6.1 Failed <<<<
открыть oraparam.ini и добавить нужную версию в разделе [Certified Versions] через запятую Windows=5.0,5.1,5.2,6.0,6.1 :

В визарде при появлении ошибки поставить галочку "User Verified"

Создание базы данных

Настройка Oracle Listener

Создание табличных пространств и пользователя

select name from v$datafile where rownum<2;

Далее:

create tablespace ACTIONS_01 logging datafile '<путь к файлу>/ACTIONS_01.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ACTIONS_02 logging datafile '<путь к файлу>/ACTIONS_02.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ACTIONS_03 logging datafile '<путь к файлу>/ACTIONS_03.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ACTIONS_04 logging datafile '<путь к файлу>/ACTIONS_04.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace BLOB_STORAGE logging datafile '<путь к файлу>/BLOB_STORAGE.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace INDX logging datafile '<путь к файлу>/INDX.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_INDX logging datafile '<путь к файлу>/ST_BAR_JOBS_INDX.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_01 logging datafile '<путь к файлу>/ST_BAR_JOBS_01.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_02 logging datafile '<путь к файлу>/ST_BAR_JOBS_02.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_03 logging datafile '<путь к файлу>/ST_BAR_JOBS_03.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_04 logging datafile '<путь к файлу>/ST_BAR_JOBS_04.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_05 logging datafile '<путь к файлу>/ST_BAR_JOBS_05.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_06 logging datafile '<путь к файлу>/ST_BAR_JOBS_06.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_07 logging datafile '<путь к файлу>/ST_BAR_JOBS_07.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_08 logging datafile '<путь к файлу>/ST_BAR_JOBS_08.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_09 logging datafile '<путь к файлу>/ST_BAR_JOBS_09.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_10 logging datafile '<путь к файлу>/ST_BAR_JOBS_10.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_11 logging datafile '<путь к файлу>/ST_BAR_JOBS_11.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_12 logging datafile '<путь к файлу>/ST_BAR_JOBS_12.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_13 logging datafile '<путь к файлу>/ST_BAR_JOBS_13.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_14 logging datafile '<путь к файлу>/ST_BAR_JOBS_14.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_15 logging datafile '<путь к файлу>/ST_BAR_JOBS_15.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_17 logging datafile '<путь к файлу>/ST_BAR_JOBS_17.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_22 logging datafile '<путь к файлу>/ST_BAR_JOBS_22.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_32 logging datafile '<путь к файлу>/ST_BAR_JOBS_32.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_33 logging datafile '<путь к файлу>/ST_BAR_JOBS_33.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace ST_BAR_JOBS_20 logging datafile '<путь к файлу>/ST_BAR_JOBS_20.DBF ' size 250M autoextend on  next 100M maxsize 16984M;

create tablespace STOCK logging datafile '<путь к файлу>/STOCK.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
create tablespace STOCKINDX logging datafile '<путь к файлу>/STOCKINDX.DBF ' size 250M autoextend on  next 100M maxsize 16984M;
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED PASSWORD_LIFE_TIME UNLIMITED;
CREATE USER *USERNAME*
IDENTIFIED BY *USERPASSWORD*
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
/
GRANT ALTER SESSION TO *USERNAME*
/
GRANT ALTER SYSTEM TO *USERNAME*
/
GRANT CREATE ANY TRIGGER TO *USERNAME*
/
GRANT CREATE LIBRARY TO *USERNAME*
/
GRANT CREATE PROCEDURE TO *USERNAME*
/
GRANT CREATE SEQUENCE TO *USERNAME*
/
GRANT CREATE SESSION TO *USERNAME*
/
GRANT CREATE SYNONYM TO *USERNAME*
/
GRANT CREATE TABLE TO *USERNAME*
/
GRANT CREATE TRIGGER TO *USERNAME*
/
GRANT CREATE TYPE TO *USERNAME*
/
GRANT CREATE VIEW TO *USERNAME*
/
GRANT CREATE ANY CONTEXT TO *USERNAME*
/

GRANT SELECT ON sys.dba_lock TO *USERNAME*
/
GRANT EXECUTE ON sys.dbms_alert TO *USERNAME*
/
GRANT EXECUTE ON sys.dbms_job TO *USERNAME*
/
GRANT EXECUTE ON sys.dbms_lock TO *USERNAME*
/
GRANT EXECUTE ON sys.dbms_pipe TO *USERNAME*
/
GRANT EXECUTE ON sys.dbms_session TO *USERNAME*
/
GRANT EXECUTE ON sys.dbms_sql TO *USERNAME*
/
GRANT EXECUTE ON sys.dbms_system TO *USERNAME*
/
GRANT EXECUTE ON sys.dbms_crypto TO *USERNAME*
/
GRANT EXECUTE ON sys.dbms_obfuscation_toolkit TO *USERNAME*
/
GRANT SELECT ON sys.v_$lock TO *USERNAME*
/
GRANT SELECT ON sys.v_$process TO *USERNAME*
/
GRANT SELECT ON sys.v_$session TO *USERNAME*
/
GRANT SELECT ON sys.v_$sql TO *USERNAME*
/
GRANT SELECT ON sys.v_$sqltext TO *USERNAME*
/
GRANT SELECT ON sys.v_$parameter TO *USERNAME*
/

CREATE VIEW x$_kglpn AS SELECT * FROM x$kglpn
/
GRANT SELECT ON x$_kglpn TO *USERNAME*
/
CREATE SYNONYM *USERNAME*.x$kglpn FOR SYS.x$_kglpn
/

CREATE VIEW x$_kglob AS SELECT * FROM x$kglob
/
GRANT SELECT ON x$_kglob TO *USERNAME*
/
CREATE SYNONYM *USERNAME*.x$kglob FOR SYS.x$_kglob
/

CREATE VIEW x$_ksuse AS SELECT * FROM x$ksuse
/
GRANT SELECT ON x$_ksuse TO *USERNAME*
/
CREATE SYNONYM *USERNAME*.x$ksuse FOR SYS.x$_ksuse
/

CREATE VIEW v$_session_wait AS SELECT * FROM v$session_wait
/
GRANT SELECT ON v$_session_wait TO *USERNAME*
/
CREATE SYNONYM *USERNAME*.v$session_wait FOR SYS.v$_session_wait
/

alter user *USERNAME* quota unlimited on USERS
/
alter user *USERNAME* quota unlimited on ACTIONS_01
/
alter user *USERNAME* quota unlimited on ACTIONS_02
/
alter user *USERNAME* quota unlimited on ACTIONS_03
/
alter user *USERNAME* quota unlimited on ACTIONS_04
/
alter user *USERNAME* quota unlimited on BLOB_STORAGE
/
alter user *USERNAME* quota unlimited on INDX
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_INDX
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_01
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_02
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_03
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_04
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_05
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_06
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_07
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_08
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_09
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_11
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_12
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_13
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_14
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_22
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_32
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_17
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_15
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_33
/
alter user *USERNAME* quota unlimited on ST_BAR_JOBS_10
/
alter user *USERNAME* quota unlimited on STOCK
/
alter user *USERNAME* quota unlimited on STOCKINDX
/
grant administer database trigger to *USERNAME*
/

После установки oracle и создания БД, делаем мультиплексирование control-файлов, на случай разрушения. Для этого:
1) Останавливаем БД. shutdown immediate
2) Клонируем control-файл (делаем из существующего 3 одинаковых с разными именами, из CONTROL01.CTL делаем CONTROL02.CTL и CONTROL03.CTL ).
3) Стартуем БД в режиме nomount. startup nomount/
4) Из-под sysdba выполняем скрипт:
alter system set control_files = 'ПУТЬ_К_ФАЙЛАМ_БД\CONTROL01.CTL','ПУТЬ_К_ФАЙЛАМ_БД\CONTROL02.CTL' ,'ПУТЬ_К_ФАЙЛАМ_БД\CONTROL03.CTL' scope=spfile;
5) Стартуем экземпляр. startup.
6) Дабы убедиться, что теперь задействованы три управляющих файла, из-под sysdba выполняем select * from V$CONTROLFILE, запрос должен вернуть три наших контролфайла.

Создание директории для мониторинга файлов трассировки

*под DBA выясняем где лежат файлы трассировки на сервере
SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Default Trace File'
/*'/u01/app/oracle/diag/rdbms/dkn/DKN/trace/'*/
*под DBA создаем директорию и даем гранты пользователю ТОЖЕ
create or replace directory TRACE_FILES as '/u01/app/oracle/diag/rdbms/dkn/DKN/trace/'
/
grant read,write on directory TRACE_FILES to sys; 
/
GRANT READ,write ON DIRECTORY TRACE_FILES TO DBA; 
/
grant read,write on directory TRACE_FILES to *USER_NAME*; 
/
declare
F1 UTL_FILE.FILE_TYPE; 
 vexists  boolean ; 
   vfile_length integer ;  
   vblocksize integer ; 
begin

-- F1 := UTL_FILE.FOPEN( 'TRACE_FILES', 'DKN_ora_59370.trc', 'w' ) ;
 --      UTL_FILE.PUTF(F1, 'Look, Im writing to a file!!!\n'); 
 --      UTL_FILE.FCLOSE(F1); 

 UTL_FILE.FGETATTR(
   'TRACE_FILES', 'DKN_ora_59370.trc' ,
   vexists    , 
   vfile_length , 
   vblocksize   );
  if vexists then  DBMS_OUTPUT.Put_Line('true '|| vfile_length||' '||vblocksize );
             else  DBMS_OUTPUT.Put_Line('false '|| vfile_length||' '||vblocksize ); end if;

end;

Устранение несовместимостей кодировок

Региональные настройки Win

Язык системы по умолчанию
Для нерусскоязычных ОС проверить:

Прочие кодировки
Для решения проблемы с отображением шрифтов в CWMS3000 (системные сообщения, всплывающие подсказки) необходимо изменить значения параметров «1250» и «1252», которые находятся в ветке реестра HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Nls \ CodePage, с «c_1250.nls» на «c_1251.nls» и с «c_1252.nls» на «c_1251.nls» соответственно.

Для этого

После перезагрузки проблема с неправильным отображением шрифтов должна исчезнуть.

Кодировка Oracle-клиента

Важно изменить значение параметра NLS_Lang на том компе, откуда производится импорт. На машинах клиента тоже можно настроить параметр.

Импорт дампа БД (схемы дистрибуции BOX)

Скрипты после импорта

CREATE OR REPLACE CONTEXT CTX_LANG USING *USERNAME*.KK_LANG
/
CREATE OR REPLACE CONTEXT CTX_REP USING *USERNAME*.KK_REP
/
CREATE OR REPLACE CONTEXT ctx_st_barcode USING *USERNAME*.KK_ST_CTX
/
!!!! Важно заменить *ЮЗЕРНЕЙМ* на имя пользователя

begin dbms_job.submit(:job,'BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(ownname => ''ЮЗЕРНЕЙМ'',estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,method_opt => ''FOR ALL COLUMNS SIZE AUTO'',CASCADE => TRUE); commit; end;',trunc(sysdate,'DAY')+6,'trunc(sysdate,''DAY'')+6'); end;
/

begin dbms_job.submit(:job,'begin KK_ST_ALLOC.RunAllocPeriodicalProc; commit; end;',trunc(SYSDATE)+1,'trunc(SYSDATE)+1'); end;
/

begin dbms_job.submit(:job,'declare  
vJobN integer;
begin  

FOR J In (  
   select distinct c.auto_reserve_grp as grp
     from contragent c where 
       c.auto_reserve_grp is not null
  and sysdate between c.fd and c.td
  and not exists (select null from  
   user_jobs j where WHAT like ''/*AutoReserveGRP=''||c.auto_reserve_grp||''*/%'' )
  order by 1
) LOOP

 dbms_job.Submit(vJobN,''/*AutoReserveGRP=''||j.grp||''*/begin KK_ST_DOC_NEW.StDocOutAllToReserve(''|| j.grp ||''); commit; end;'' );
 kk_common.err_log(''AutoReserveGRP.StDocOutAllToReserve'',vJobN,''RUN JOB''); 
 commit; 
END LOOP;

end;',trunc(sysdate,'mi') + 5/1440,'trunc(sysdate,''mi'') + 5/1440'); end;
/

begin dbms_job.submit(:job,'begin kk_mail.ExternalMailSend; end;',SYSDATE + 5/1440,'SYSDATE + 5/1440'); end;
/

begin dbms_job.submit(:job,'declare
  vStr varchar2(2500);
  vNextExecute date;
  vMail integer;
  vMails list_const.val%type := kk_const.GetConstV(''NotifyJob.Error.Notify'',sysdate,0);
begin
  FOR J In (select rowid as rd,PL_SQL,NAME
             from notify_job
               where sysdate >= next_execute
               and sysdate between fd and td ) LOOP
      begin         
      vStr := j.PL_SQL;
      execute immediate replace(vStr,chr(13),'' '')
      using out vNextExecute;
      commit;
        EXCEPTION
          WHEN others THEN
          kk_common.err_log(''NOTIFY_JOB'',SQLCODE,substr(j.NAME||'' ''||SQLERRM,1,255));
          vMail := kk_mail2.ExternalMailPutInQueue(vMails,''ERROR.USER_JOBS.''||j.NAME,substr(j.NAME||'' ''||SQLERRM,1,2500));
          commit;
          select sysdate + 30/1440 into vNextExecute from dual;
      end;
    update notify_job
     set next_execute = vNextExecute
      where rowid = J.RD;  
    commit;
  END LOOP;
end;',sysdate + 2/1440,'sysdate + 2/1440'); end;
/

commit;
/

Создание триггера Audit_ddl

CREATE OR REPLACE TRIGGER audit_ddl
BEFORE
  DDL
ON DATABASE
declare
l_osuser  VARCHAR2(100);
l_program VARCHAR2(100);
sql_text ora_name_list_t;
stmt VARCHAR2(2000);
l_cnt pls_integer;
vLocator CLOB;
vEDITOR_IP varchar2(50);
vEDITOR_DSC varchar2(200);
vLastTD date;
begin

   IF (ora_dict_obj_owner = '*USERNAME*')
      THEN
     IF  ora_sysevent in ('ALTER','ANALYZE') and ora_dict_obj_type in ('FUNCTION','PACKAGE','PACKAGE BODY','TRIGGER')  
      or ora_dict_obj_type in ('TYPE') THEN
    NULL;
    ELSE

          select upper(osuser), upper(program) into l_osuser, l_program from v$session
            WHERE AUDSID=SYS_CONTEXT('USERENV','SESSIONID');

        if ora_dict_obj_type in ('PACKAGE','PACKAGE BODY') then  
         begin  
          select p.EDITOR_IP,p.EDITOR_DSC ,nvl(last_td,sysdate) into vEDITOR_IP
          ,vEDITOR_DSC , vLastTD
           from  *USERNAME*.CIS_PACKAGE p
            where upper(p.name) = upper(ora_dict_obj_name) ;

            if vEDITOR_IP is null or vLastTD + 2 < sysdate then

               update *USERNAME*.CIS_PACKAGE
                set EDITOR_IP = SYS_CONTEXT('userenv', 'IP_ADDRESS')
                 , EDITOR_DSC = l_program || '; l_osuser='||l_osuser||'; '|| to_char(sysdate,'dd.mm.yyyy hh24:mi:ss')
                 ,last_td = sysdate
                  where upper(name) = upper(ora_dict_obj_name) ;
            else
             if  nvl(vEDITOR_IP,'NULL') != nvl(SYS_CONTEXT('userenv', 'IP_ADDRESS'),',') then
              null;

             end if;

            end if; --if vEDITOR_IP is null then 

           EXCEPTION
              WHEN NO_DATA_FOUND THEN
             null; 

          end;

          end if; --if ora_dict_obj_type in ('PACKAGE','PACKAGE BODY') then   

           insert into *USERNAME*.CIS_ddl_changes (N, owner, name, type, osuser, program, FD, action, STATUS) values
           (*USERNAME*.sq_CIS_DDL_CHANGES.nextval, ora_dict_obj_owner, ora_dict_obj_name,
            ora_dict_obj_type, l_osuser, l_program, sysdate, ora_sysevent,0);

declare
LOCATOR1 clob; 
dest_offset    INTEGER := 1;
src_offset     INTEGER := 1;
amt            INTEGER ;
begin

DBMS_LOB.CREATETEMPORARY (LOCATOR1,TRUE,DBMS_LOB.SESSION); 

           l_cnt := ora_sql_txt(sql_text);
     for i in 1..l_cnt loop
     if (Length(sql_text(i)) <= 2000) and
         instr(sql_text(i), 'COMPILE BODY REUSE SETTINGS')>0 then
        null;
       else
     dbms_lob.WriteAppend(LOCATOR1, Length(sql_text(i)),sql_text(i));

     end if;
     end loop;

           INSERT INTO *USERNAME*.CIS_DDL_CHANGES_CLOB (CIS_DDL_CHANGES_N,TEXT) VALUES (*USERNAME*.sq_CIS_DDL_CHANGES.currval,EMPTY_CLOB())  
              RETURNING TEXT into vLocator ;     
     amt :=   DBMS_LOB.getlength(LOCATOR1);       
    dbms_lob.copy(vLocator,LOCATOR1,amt,dest_offset,src_offset);            

end;

   END IF;     --IF  ora_sysevent ='ALTER'
   END IF;   
end;
/

Выполнить под пользователем SYS "предотвращение повторного входа с терминала"

-- Start of DDL Script for Trigger TST.TRG_ON_LOGON
-- Generated 20.02.2015 14:59:44 from TST@TST

CREATE OR REPLACE TRIGGER trg_on_logon
 AFTER
  LOGON
 ON DATABASE
declare
vCnt integer;
begin
 if lower(SYS_CONTEXT('userenv', 'TERMINAL')) like lower('%mobile%') then

    select/*+ INDEX(a cis_logon_log_s)*/ 
    count(1) into vCnt
      from
   v$session s
    join V$process p on (s.pADDR = p.addr )
    join  cis_logon_log a on (  a.AUDSID = s.AUDSID  and a.SESSIONID = s.SID and a.SERIAL = s.SERIAL# )
  where a.ip =  SYS_CONTEXT('userenv', 'IP_ADDRESS')
  and s.status != 'KILLED';

 if vCnt > 0 then
   RAISE_application_error(-20000,'Нельзя запустить более двух сессий одновременно!');
 end if; -- if vCnt > 0 then 

 end if; -- if lower(SYS_CONTEXT('userenv', 'TERMINAL')) like lower('%mobile%') then 

end trg_on_logon;
/

-- End of DDL Script for Trigger TST.TRG_ON_LOGON

/

Для Oracle 11G рассылки почты в случае ошибки "отказ в доступе к сети в соответствии со списком контроля доступа (ACL)"

BEGIN
   DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
    acl          => 'smtp_mail.xml',
    description  => 'Permissions to access smtp_mail',
    principal    => '*USERNAME*', -- ИМЯ пользователя БД
    is_grant     => TRUE,
    privilege    => 'connect');
   COMMIT;
END;

create role role_smtp_mail;
/

BEGIN
   DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE (
    acl          => 'smtp_mail.xml',                
    principal    => 'ROLE_SMTP_MAIL',
    is_grant     => TRUE, 
    privilege    => 'connect',
    position     => null);
   COMMIT;
END;
/

grant  role_smtp_mail to *USERNAME*;
/

BEGIN
   DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (
    acl          => 'smtp_mail.xml',                
    host         => '192.168.4.2'); -- smtp сервер!!!!
   COMMIT;
END;
/
==Добавить другого пользователя в ACL лист (если пользователей БД, использующих отправку писем - несколько)==
BEGIN
  DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
    acl => 'smtp_mail.xml', 
    principal => '*USERNAME2*', --имя второго пользователя
    is_grant => TRUE, 
    privilege => 'connect');
END;
/

Настройка сервера приложений

Установка Oracle Client

Правка пакетов

ПЕРЕД ЗАПУСКОМ СЛУЖБЫ ИЛИ CWMS3000 обязательно изменить пакеты kk_rep,kk_lang:

kk_rep:
  procedure assign(name varchar2, value varchar2) is
      begin
        dbms_session.set_context('ctx_rep', name, value);
      END assign;

kk_lang:
   procedure assign(name varchar2, value varchar2) is
      begin
         dbms_session.set_context('ctx_lang', name, value);
      END assign;

Установка CWMS3000

Разворачивание StandBy сервера oracle штатными средствами data guard broker.

Необходимые условия для разворачивания

Подготовка резервного сервера

hint: Для удобства навигации между RDP-подключениями основного и резервного серверов, рекомендуется установить в качестве "обоев" рабочего стола резервного сервера ярко-красный фон.

Установка СУБД oracle и создание резервной БД.

Запускаем инсталлятор, выбираем метод установки - advanced, нажимаем "next"

тип установки - Enterprise, нажимаем "next"

В следующем окне - Name оставляем по умолчанию, Path должен быть идентичен пути установки БД на основном сервере

В пунктах, имеющих статус "error", проставляем галочки.

Статус должен поменять на " user verified", нажимаем "next"

В следующем окне выбираем "Create a Database", нажимаем "next".

В следующем окне выбираем Advanced, жмем "next".

В следующем окне оставляем значения по умолчанию, жмем "next".

В следующем окне проверяем правильность введённых параметров и нажимаем "Install"

После окончания установки автоматически откроется Database Configuration Assistant. В первом окне выбираем General Purpose, нажимаем "next".

В следующем окне вводим Global Database и SID. Они должны быть ИДЕНТИЧНЫ основной базе.

В следующем окне оставляем всё без изменения.

В следующем окне вводим пароль для системных учётных записей oracle. Он должен быть ИДЕНТИЧЕН паролю на основной базе. Нажимаем "next".

В следующем окне оставляем все данные без изменения, нажимаем "next".

В следующем окне снимаем галочку "Specify Flash Recovery Area", ставим галочку "Enable Archiving, нажимаем кнопку Edit Archive Mode Parameters

В открывшемся окне указываем ПОЛНЫЙ путь к папке с архивными логами. Путь должен быть идентичен пути к папке на основном сервере. Если папки для архивных логов на резервном сервере не существует - её необходимо создать. Имя папки и её местонахождение на локальном диске должны быть полностью идентичными имени и местонахождению на основном сервере. Нажимаем "ok" и "next".

В следующем окне снимаем галочку "Sample Schemas", нажимаем "next"

В следующем окне ставим флаги Custom и Manual.
Единицы измерения ВЕЗДЕ проставляем M Bytes. Рекомендуемые значения:
Shared Pool: 128 M Bytes
Buffer Cache: Указываем размер, исходя из оставшейся свободной оперативной памяти, за вычетом памяти, необходимой для корректной работы операционной системы. Для резервного сервера, имеющего 4 Гб оперативной памяти (как на скриншоте), оптимальным размером Buffer Cache будет 2 Гб, для сервера, имеющего, например, 32 Гб оперативной памяти, оптимальным будет 25 Гб.
Java Pool: 128 M Bytes
Large Pool: 512 M Bytes
PGA Size: 256 M Bytes

Далее на вкладке Character Sets устанавливаем флаг "Choose from the list of character sets", Утанавливаем параметры, согласно скриншоту. Нажимаем кнопку "next".

В следующем окне оставляем все значения по умолчанию и нажимаем next.

В следующем окне оставляем все значения по умолчанию и нажимаем Готово.

В процессе создания БД и применения настроек, может появиться ошибка старта БД. Не пугаемся, нажимаем ОК.

По завершению установки, нажимаем next, в следующем окне - exit.

Далее заходим в диспетчер служб, проверяем, чтобы службы oracle были созданы, и их состояние было как на скриншоте.

Запускаем командную строку, вводим команду sqlplus. Логин sys as sysdba, пароль - указанный при установке. Если все вышеописанные действия были проведены верно - мы увидим информацию о версии СУБД и строку ввода команд SQL.

Прописываем уникальное имя базы, по которому data guard broker будет её идентифицировать, для резервного сервера это bwms. Для этого вводим команду:
alter system set db_unique_name='bwms' scope=spfile;
Включаем data guard broker. Для этого вводим команду:
alter system st dg_broker_start=true scope=both;

Останавливаем БД. Для этого вводим команду
shutdown immediate

Удаляем все файлы из каталога БД

Останавливаем службу OracleOraDb10g_home1TNSListener
Редактируем файл E:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\tnsnames.ora согласно тексту ниже, указываем реальные ip-адреса

WMS =
 (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = ip-адрес основного сервера)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = WMS)
   )
 )
BWMS =
 (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = ip-адрес резервного сервера)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = bwms)
   )
 )
wms_XPT = 
(DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = ip-адрес основного сервера)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = wms)
   )
  )
wms_DGB = 
(DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = ip-адрес основного сервера)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = wms)
   )
 )
wms_DGMGRL = 
(DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = ip-адрес основного сервера)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = wms)
   )
 )
)

Редактируем файл E:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\listener.ora
Значения, которые необходимо изменить выделены красным

Стартуем службу OracleOraDb10g_home1TNSListener

Подготовка основного сервера

На основном сервере запускаем sqlplus, логин sys as sysdba
Вводим команду
ALTER DATABASE FORCE LOGGING;

Создаём REDO логи, которые в последствии будет использовать резервный сервер. Для этого вводим команду, где указываем путь к папке с ораклом:
ALTER DATABASE ADD STANDBY LOGFILE GROUP 10 ('P:\oracle\product\10.2.0\oradata\VPI\log1c.rdo','P:\oracle\product\10.2.0\oradata\VPI\log2c.rdo','P:\oracle\product\10.2.0\oradata\VPI\log3c.rdo') SIZE 50M;
Прописываем уникальное имя базы, по которому data guard broker будет её идентифицировать, для основного сервера это wms. Для этого вводим команду:
alter system set db_unique_name='wms' scope=spfile;
Включаем data guard broker. Для этого вводим команду:
alter system st dg_broker_start=true scope=both;

Останавливаем службу OracleOraDb10g_home1TNSListener
Редактируем файл E:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\tnsnames.ora согласно тексту ниже, указываем реальные ip-адреса

WMS =
 (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = ip-адрес основного сервера)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = wms)
   )

 )
bwms = 
(DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = ip-адрес резервного сервера)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = bwms)
   )
 )
bwms_XPT = 
(DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = ip-адрес резервного сервера)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = bwms)
   )
 )
bwms_DGB = 
(DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = ip-адрес резервного сервера)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = bwms)
   )
 )
bwms_DGMGRL = 
(DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = ip-адрес резервного сервера)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = bwms)
   )
 )

)

Редактируем файл E:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\listener.ora
Значения, которые необходимо изменить выделены красным

Стартуем службу OracleOraDb10g_home1TNSListener
Принудительно создаём логи, чтобы в них записались последние транзакции. Для этого вводим команду:
alter system switch logfile; Для надежности - три раза, и СРАЗУ ЖЕ останавливаем базу командой:
shutdown immediate

Стартуем базу в режиме mount. Для этого вводим команду:
startup mount
Создаём контрол-файл для резервного сервера. Для этого вводим команду:
ALTER DATABASE CREATE STANDBY CONTROLFILE AS 'C:\boston.ctl'

Дважды клонируем полученный файл и переименовываем его.
В результате из файла boston.ctl' должно получиться 3 идентичных файла: CONTROL01.CTL, CONTROL02.CTL, CONTROL01.CTL.
Они нам пригодятся чуть позже.
Останавливаем БД. Для этого вводим команду:
shutdown immediate
Останавливаем службу OracleService
Копируем всё содержимое папки E:\oracle\product\10.2.0\oradata\Имя_Инстанса КРОМЕ ФАЙЛОВ С РАСШИРЕНИЕМ .CTL в аналогичную папку резервного сервера.

Далее в ту же папку РЕЗЕРВНОГО сервера копируем контрол-файлы, полученные в результате создания и клонирования файла boston.ctl (см. выше)
Запускаем службу OracleService
Подготовка основной БД закончена, можно продолжать работу в ней в штатном режиме.

Создание и настройка конфигурации data guard broker

Запускаем БД на РЕЗЕРВНОМ сервере. Для этого вводим команду:
startup
По результатам выполнения :

Далее нам необходимо проверить связь между серверами в рамках алиасов. Для этого на ОСНОВНОМ СЕРВЕРЕ открываем командную строку и вводим команду:
tnsping bwms
результатом команды должен быть отчет об успешном прохождении пинга.

точно таким же образом пингуем остальные алиасы из tnsnames.ora:

Создаём конфигурацию, добавляем в конфигурацию наши базы, устанавливаем свойства, благодаря которым при добавлении файлов в основную базу, они автоматически будут создаваться на резервной.
Для этого выполняем скрипт:
CREATE CONFIGURATION 'SID БД_BACKUP' AS
PRIMARY DATABASE IS 'wms'
CONNECT IDENTIFIER IS wms;
ADD DATABASE 'bwms' AS
CONNECT IDENTIFIER IS bwms
MAINTAINED AS PHYSICAL;
EDIT DATABASE 'bwms' SET PROPERTY 'StandbyFileManagement'='AUTO';
EDIT DATABASE 'wms' SET PROPERTY 'StandbyFileManagement'='AUTO';
Для того, чтобы убедиться в том, что конфигурация успешно создалась, вводим команду:
show configuration

Далее включаем конфигурацию, вводим команду:
enable configuration
После этого начнется процесс копирования логов с основного сервера на резервный и их применение. Процесс может занимать различное время, в зависимости от того, насколько основная база "убежала вперед" от резервной, после её включения (окончание П.2).
Проверяем валидность конфигурации командой:
show configuration
При успешной синхронизации серверов команда должна возвратить "SUCCESS"

Далее смотрим очередь на применение логов к резервной базе(она должна быть пустая), для этого вводим команду:
SHOW DATABASE 'bwms' 'RecvQEntries';
И очередь на передачу логов с основного сервера(должно быть одно значение):
SHOW DATABASE 'wms' 'SendQEntries'