Проект

Общее

Профиль

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


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

Сервер БД
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"

  • В первом меню установщика выбирается пункт Advanced Installation
  • Окно ”Select Installation Type”. В подменю Product Languages (вызывается аналогичной кнопкой) выберите языки Английский и Русский. Выбирается пункт Enterprise Edition. Затем в основном окне выберите пункт Enterprise Edirion.
  • Окно ”Specify Home Details”. Здесь необходимо ввести имя OraHome (можно оставить имя по умолчанию). Убедитесь, что в папке, указанной в поле Path, достаточно места для установки туда Oracle и последующего размещения самой базы данных.
  • Окно ”Prerequisite Checks”. Необходимо убедиться что все проверки прошли успешно (статус Succeeded). Пункты, статус которых отличен от Succeeded, могут быть отмечены как User Verified.В случае возникновения такой ситуации желательно связаться со специалистом технической поддержки.
  • Окно ”Select Configuration Option”. Выберите Create a Database, если хотите создать БД в процессе установки программного обеспечения, или Install Software, если БД будет создана позднее. Описание процесса создания базы данных представлено ниже.
  • Окно Oracle Configuration Manager Registration.Нажмите Next
  • Нажмите Install. Установка Oracle 10g завершена.

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

  • В меню ‘Программы’ зайдите в ветку Oracle – OraHome -> Configuration and Migration Tools и выберите Database Configuration Assistant
  • Шаг 1. Выберите пункт Create a Database
  • Шаг 2. Выберите пункт General Purpose
  • Шаг 3. Введите имя инстанса
  • Шаг 4. Оставьте всё по умолчанию
  • Шаг 5. Введите пароль(-и) для пользователей SYS,SYSTEM,DBSNMP,SYSMAN
  • Шаг 6. Выберите File System
  • Шаг 7. Оставьте всё по умолчанию
  • Шаг 8. (Flash Recovery Area Size). Рекомендуемый размер – не менее 10000 мегбайт. Отметьте чекбокс Enable Archiving. Нажмите кнопку Edit Archive Log Parameters. D открывшемся окне в таблице Archive Log Destination укажите путь к папке, предназначенной для размещения архивных логов (например ‘C:\OraLogs’).
  • Шаг 9. Оставьте всё по умолчанию
  • Шаг 10. Вкладка Character Sets - Database Character Set – CL8MSWIN1251, National Character Set – AL16UTF16, Default Language – Русский, Default Date Format – Россия. Вкладка Sizing – всё по умолчанию. Вкладка Memory – введите какой процент оперативной памяти будет отведён под функционирование БД. Рекомендуемый объём оперативной памяти – не менее 2 гигабайт. Вкладка Connection Mode – выставите Dedicated Server Mode
  • Шаг 11. Оставьте всё по умолчанию.
  • Шаг 12. Нажмите готово.

Настройка Oracle Listener

  • В меню ‘Программы’ зайдите в ветку Oracle – OraHome -> Configuration and Migration Tools и выберите Net Configuration Assistant
  • Выберите Listener Configuration
  • Выберите Add
  • Далее оставьте всё по умолчнаию
  • В меню Would you like to configure another listener выберите No

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

  • Для выполнения этого пункта пнадобится SQL Plus (Oracle – OraHome -> Application Development) или Quest Software SQL Navigator, который должен быть установлен на сервере БД или на сервере приложений.
  • Соединившись с БД в качестве пользователя SYS as SYSDBA, необходимо создать табличные пространства при помощи скрипта CREATE_TABLASPACES, предварительно заменив в файле <путь к файлу> на путь к папке установки oracle (например C:\Oracle\), INSTANCE_NAME - на имя инстанса. Путь к файлам можно взять из результатов запроса:
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;
  • Начиная с версии 11gR2, в oracle в профиле default по умолчанию включено устаревание паролей пользователей. Чтобы отключить, из под пользователя sys, необходимо выполнить скрипт:
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED PASSWORD_LIFE_TIME UNLIMITED;
  • Находясь под SYS, создать пользователя, используя скрипт CREATE_USER предварительно заменив в файле USERNAME на иия пользователя, PASSWORD на пароль пользователя.
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

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

  • поддержку русского языка (кодировка 1251);
  • язык по умолчанию для программ, не поддерживающих UNICODE - русский (Панель управления → Региональные настройки):

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

Для этого

  • Запустите «Редактор реестра»: "Пуск"->"Выполнить", в открывшемся окне введите команду "regedit".
  • Постепенно открывая соответствующие папки в левой части «Редактора реестра», зайдите в ветку HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Nls \ CodePage. (Это значит, что нужно сначала открыть папку «HKEY_LOCAL_MACHINE», в ней открыть папку «SYSTEM», в ней - «CurrentControlSet» и т.д.)
  • Когда доберётесь до раздела «CodePage» и выделите его в левой части «Редактора реестра», в его правой части появится достаточно большой список параметров. Надо найти среди них параметры «1250» и «1252». Затем дважды щелкните на первом из них левой кнопкой мыши. Откроется окно «Изменение строкового параметра». Там, в окошке «Значение», «c_1250.nls» надо изменить на «c_1251.nls» и нажать кнопку «ОК» (см. рисунок). После этого аналогичным образом изменяем значение параметра "1252" с "c_1252.nls" на "c_1251.nls". Жмём кнопку «ОК» и перезагружаем компьютер.

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

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

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

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

  • В командной строке введите команду
    imp.EXE USERID = SYSTEM/<Пароль>@<SID базы> LOG=<файл лога>  FILE=<FILE.DAT  схема BOX> FROMUSER=BOX TOUSER=<Пользователь>
    pause
    

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

  • Соединившись с БД в качестве пользователя SYS as SYSDBA, выполните следующие команды:
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

  • Выполнить под пользователем SYS "Сохранение истории системных пакетов"
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

  • Окно ”Select Installation Type”. В подменю Product Languages (вызывается аналогичной кнопкой) выберите языки Английский и Русский. Выбирается пункт Enterprise Edition. Затем в основном окне выберите пункт Administrator.
  • Оставьте всё по умолчанию.
  • Аналогично пункту 1.d Настройки сервера БД
  • Нажмите Install
  • После установки поместите в папку с Oracle Client в подпапку /Network/Admin файл tnsnames.ora, заменив SID и HOST на имя инстанса и адрес сервера БД соответственно.

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

ПЕРЕД ЗАПУСКОМ СЛУЖБЫ ИЛИ 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

  • Скопируйте папку CWMS3000.
  • Запустите cwms3000.exe. В открывшемся диалоговом в верних трёх полях пропишите соответственно имя созданного пользователя, пароль, и имя инстанса.
  • Свяжитесь со специалистом технической поддержки для решения вопроса лицензии и настройки пользователя DPC.
  • Инструкция по настройке сервисов вынесена в отдельную страницу.
  • Для корректной работы сервиса печати понадобится установленный Microsoft Office Excel
  • Для проверки сервиса печати желательно установить FreePDF и Foxit Reader. Для установки FreePDF необходим Ghost Script, который присутствует в папке DSTR_APP(gs904w32.exe).

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

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

  • Идентичные по архитектуре и разрядности операционные системы на основном и резервном серверах.
  • Идентичные версии базы данных oracle.
  • Прямое сетевое соединение между основным и резервным серверами (без VPN и т.п.)
  • Права локального администратора на основном и резервном серверах.
  • Буквы и имена логических дисков должны совпадать.

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

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:
  • tnsping wms
  • tnsping bwms_XPT
  • tnsping bwms_DGB
  • tnsping bwms_DGMGRL
    Аналогичную операцию проводим на РЕЗЕРВНОМ СЕРВЕРЕ, пингуя поочередно все алиасы из tnsnames.ora:
  • tnsping bwms
  • tnsping wms
  • tnsping wms_XPT
  • tnsping wms_DGB
  • tnsping wms_DGMGRL
    Все пинги должны выдать результат "ОК".
    На ОСНОВНОМ СЕРВЕРЕ создаём конфигурацию data guard. Для этого открываем командную строку, вводим команду:
    dgmgrl
    далее вводим команду:
    connect
    авторизуемся с учетными данными пользователя sys

Создаём конфигурацию, добавляем в конфигурацию наши базы, устанавливаем свойства, благодаря которым при добавлении файлов в основную базу, они автоматически будут создаваться на резервной.
Для этого выполняем скрипт:
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'

Экспортировать в PDF HTML TXT