24 октября 2014 г.

Как установить патч tzdata на Linux в 2014 (переход на зимнее время)

Как установить патч tzdata на Linux


RedHat

1) Скачиваем пакеты: https://www.dropbox.com/s/w0ilea47xh56l0c/rpms.zip?dl=0
2) Смотрим версию RedHat: cat /etc/redhat-release
3) Устанавливаем пакеты: rpm -Uvh *
4) Перестартовать ntp: service ntp restart
5) Проверяем текущую дату и часовой пояс: date

SuSe

1) Скачиваем пакеты: https://www.dropbox.com/s/3b80dmnytg5ttcw/tzdata_Suse.zip?dl=0
2) Устанавливаем пакеты: rpm -Uvh *
3) Перестартовать ntp: service ntp restart
4) Проверяем текущую дату и часовой пояс: date

Ubuntu

sudo sh -c "echo 'deb http://archive.ubuntu.com/ubuntu/ $(lsb_release -cs)-proposed restricted main multiverse universe' >> /etc/apt/sources.list"

sudo apt-get update

sudo apt-get install tzdata

sudo apt-get update && sudo apt-get upgrade

sudo /etc/init.d/ntp restart   (при необходимости sudo apt-get install ntp)

date

http://help.ubuntu.ru/wiki/%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D0%BE_ubuntu_server/%D1%81%D0%B5%D1%82%D1%8C/ntp

dpkg-reconfigure tzdata

Проверить установку

1) Проверить можно командой: rpm -q tzdata
вывод команды покажет установленную версию, версии равные или
старше 2014f - обновлены, т.е. f,g,h:  tzdata-2014{f|g|h}

2) также, можно проверить командой: cat /etc/localtime
последняя строка в выводе должна быть: "MSK-3"

17 октября 2014 г.

Переход на зимнее время Oracle баз данных в 2014 году

Что делать с базами данных для перехода на зимнее время в 2014 году

Непростое решение: что делать с базами данных для корректного перехода на зимнее время в 2014 году. Особенно если у тебя 150 баз в промышленной эксплуатации. Как ни странно, лучшее решение: ничего не делать :)

Сначала обратимся к первоисточникам:

в России с 2 часов 00 минут 26 октября 2014 года 11 часовых зон. Москвы во 2-й зоне:

" 2-я часовая зона (МСК, московское время, UTC+3): Республика Адыгея, Республика Дагестан, Республика Ингушетия,
 Кабардино-Балкарская Республика, Республика Калмыкия, Карачаево-Черкесская Республика, Республика Карелия, Республика Коми,
 Республика Крым, Республика Марий Эл, Республика Мордовия, Республика Северная Осетия — Алания, Республика Татарстан, Чеченская Республика,
 Чувашская Республика — Чувашия, Краснодарский край, Ставропольский край, Архангельская область, Астраханская область, Белгородская область,
 Брянская область, Владимирская область, Волгоградская область, Вологодская область, Воронежская область, Ивановская область,
 Калужская область, Кировская область, Костромская область, Курская область, Ленинградская область, Липецкая область, Московская область,
 Мурманская область, Нижегородская область, Новгородская область, Орловская область, Пензенская область, Псковская область, Ростовская область,
 Рязанская область, Саратовская область, Смоленская область, Тамбовская область, Тверская область, Тульская область, Ульяновская область,
 Ярославская область, города федерального значения Москва, Санкт-Петербург, Севастополь и Ненецкий автономный округ;"

Документация техподдержки Oracle

Есть подробное описание влияния этого перехода в документе: The Russian Government re-introduces DST in 2014 - Impact on Oracle RDBMS (Doc ID 1907147.1)

Если кратко, то:
есть некая база (база Олсона), хранящая часовые пояса и смещения времени для разных часовых поясов начиная с 1970 г (начало эпохи Unix). Эти данные также хранятся (и обновляются патчем) в базе данных Оракл. Когда происходит изменение смещения (например как в случае с предстоящим изменением на зимнее время в России), эти данные вендор СУБД обновляет из базы Олсона и выпускает в виде патча для БД (в нашем случае Oracle). Если этот патч не применить, то работа с датами и временем содержащим смещения DST приведет к неверным результатам для тех часовых поясов, смещения в которых поменялись.
Если приложения работают исключительно с локальным временем без указания таймзон, то патч на базу можно не ставить, достаточно только патча для ОС.

The "Date" datatype has no timezone information stored, "sysdate" (and "systimestamp") do not use any Oracle provided timezone information. None of these are using in any way Oracle DST patches or Oracle provided DST information. "Sysdate" is purely dependent on the operating system clock, hence it IS depending on the timezone information of this operating system and/or the operating system "TZ" variable settings when the database and listener where started (!!!).

Т.е. если используются для хранения дат и времени типы без таймзоны, то они никак не используют оракловый патч с таймзонами и DST.
Зато если в базе используется TimeStamp with Time Zone то придется ставить патч и тестировать. Вот этот патч: «Patch 19396455: DST-23: DST UPDATE SEPTEMBER 2014 - TZDATA2014F» К сожалению этот патч выпустили не на все версии Oracle, например для 11.2.0.2 уже нет патча.

В шедулере базы Oracle, к сожалению, используется TimeStamp with Time Zone, поэтому щедулер возможно собъёться на один час 26 октября, поэтому разработчикам нужно будет проверить свои задания и  выставить нужное смещение (а не именованную тайм зону). Надо это не забыть сделать 26 октября.

Также желательно обновить Java на все серверах, применить TZupdater tool с tzdata2014f

Текущее состояние

Смотрим как у нас Oracle работает с московской зоной на продуктовых серверах:

select from_tz(timestamp '2013-10-01 1:00:00','UTC') at time zone 'Europe/Moscow' tz from dual
 union all
 select from_tz(timestamp '2013-11-26 1:00:00','UTC') at time zone 'Europe/Moscow' tz from dual
 union all
 select from_tz(timestamp '2014-10-25 1:00:00','UTC') at time zone 'Europe/Moscow' tz from dual
 union all
 select from_tz(timestamp '2014-10-26 1:00:00','UTC') at time zone 'Europe/Moscow' tz from dual
 union all
 select from_tz(timestamp '2015-07-26 1:00:00','UTC') at time zone 'Europe/Moscow' tz from dual
 union all
 select from_tz(timestamp '2015-10-29 1:00:00','UTC') at time zone 'Europe/Moscow' tz from dual;
-----------------------------------
TZ
01/10/2013 5:00:00.000000000 +04:00
26/11/2013 4:00:00.000000000 +03:00
25/10/2014 5:00:00.000000000 +04:00
26/10/2014 4:00:00.000000000 +03:00
26/07/2015 5:00:00.000000000 +04:00
29/10/2015 4:00:00.000000000 +03:00
-----------------------------------

Вот и первый сюрприз: база в 2013, 2014, 2015 годах переводит время на зимнее и на летнее время. То есть она не знает, что в 2011 году мы в России отменили переход на зимнее время. Как же так ? Проверяем версию тайм-зоны:
SELECT version FROM v$timezone_file;
-----------------------------------
14
-----------------------------------

Так и есть, во всех установленных базах Oracle, версий 10, 11, 12 стоит версия таймзон (база Олсона) от 2010 года! У нас никто не ставил патч 7695070 от 2011 года. А Oracle не включил в свои дистрибутивы новую версию базы Олсона, как ни странно, весь остальной мир не меняет свои часовые пояса раз в 3 года, скучно живут. 
Получается что у нас Oracle неправильно работал с часовыми поясами в полях типа "*with Time Zone" последние 3 года, никто об этом не догадался, или никто такие поля не использует. 

Поэтому лучший вариант для нас: ничего не трогать. 26 октября базы сами перейдут на зимнее время, ничего менять не нужно, все будет работать правильно. К тому же большинство разработчиков использует простые типы полей, баз тайм зон, для них вообще ничего не меняется, в их случае база берет дату из операционной системы. То есть достаточно на OS установить патч.
Но следующей весной базы опять сами сменят даты на летнее время (смещение 4 часа от UTC), это может вызвать проблемы для тех кто использует время с тайм зонами!

Вообще летнее и зимнее время - это вопрос философский, важно смещение от UTC. С 26 октября мы в России должны получать смещение 3 часа от UTC навечно (или пока правительству не надоест). Следующей весной непропатченные базы Oracle автоматом сменят смещение на 4 часа от UTC, что неправильно.

4) Если мы все таки решили исправить такое поведение баз Oracle. Краткая инструкция что нужно делать:
- Обновляем OPatch
- Обновляем базу минимум до версии 11.2.0.3
- Ставим патч 19396455: DST-23 (остановка базы не требуется)
- Обновляем базу данных, выполняем скрипт: Scripts to automatically update the RDBMS DST (timezone) version in an 11gR2 or 12cR1 database . (Doc ID 1585343.1) Эти скрипты автоматически перегрузят базу данных 2 раза! 
- Проверяем: 
 SELECT version FROM v$timezone_file;
----------
        23
----------
Видно что тайм зона теперь 23 версии.

SQL> select from_tz(timestamp '2013-10-01 1:00:00','UTC') at time zone 'Europe/Moscow' tz from dual
  2   union all
  3   select from_tz(timestamp '2013-11-26 1:00:00','UTC') at time zone 'Europe/Moscow' tz from dual
  4   union all
  5   select from_tz(timestamp '2014-10-25 1:00:00','UTC') at time zone 'Europe/Moscow' tz from dual
  6   union all
  7   select from_tz(timestamp '2014-10-26 1:00:00','UTC') at time zone 'Europe/Moscow' tz from dual
  8   union all
  9   select from_tz(timestamp '2015-07-26 1:00:00','UTC') at time zone 'Europe/Moscow' tz from dual
 10   union all
 11   select from_tz(timestamp '2015-10-29 1:00:00','UTC') at time zone 'Europe/Moscow' tz from dual;

TZ
---------------------------------------------------------------------------
01-OCT-13 05.00.00.000000000 AM EUROPE/MOSCOW
26-NOV-13 05.00.00.000000000 AM EUROPE/MOSCOW
25-OCT-14 05.00.00.000000000 AM EUROPE/MOSCOW
26-OCT-14 04.00.00.000000000 AM EUROPE/MOSCOW
26-JUL-15 04.00.00.000000000 AM EUROPE/MOSCOW
29-OCT-15 04.00.00.000000000 AM EUROPE/MOSCOW

Видно что смещение от UTC теперь 3 часа с 26 октября 2014 года постоянно.

5) Обновление JAVA машин. На серверах приложений с Weblogic, BI, Cloud Control обязательно.
Краткая инструкция по обновлению java :
- cd /u01/distr/tzupdater
- unzip tzupdater-1_4_8-2014h.zip 
- cd tzupdater-1.4.8-2014h/
- /u01/app/oracle/product/11203/dbhome_1/jdk/bin/java  -jar tzupdater.jar -u
- /u01/app/oracle/product/11203/dbhome_1/jdk/jre/bin/java  -jar tzupdater.jar -u
- Проверка:
/u01/app/oracle/product/11203/dbhome_1/jdk/bin/java  -jar tzupdater.jar -V
/u01/app/oracle/product/11203/dbhome_1/jdk/jre/bin/java  -jar tzupdater.jar -V
- Результат обеих команд должен содержать строку:
tzupdater version 1.4.8-b01
JRE time zone data version: tzdata2014h
Embedded time zone data version: tzdata2014h





17 апреля 2014 г.

Установка «Oracle Enterprise Manager 12c» с базой Oracle DB 12c


  За последний год несколько раз устанавливал Oracle Enterprise Manager, всегда натыкался на какие-нибудь проблемы. По количеству ошибок эта программа у меня на 1-м месте, установить с 1-го раза практически невозможно.

  В очередной раз устанавливал Oracle Enterprise Manager для заказчиков. Скачал последнюю версию, с обнадёживающим названием: «Oracle Enterprise Manager Cloud Control 12c Release 3 Plug-in Update 1 (12.1.0.3) New!». В компании Oracle знают свою репутацию надежности своих программ, поэтому  заманивают клиентов магическими словами: «Release 3» (уже 3-я версия), «Update 1» (это не бета-версия), «12.1.0.3» (здесь 0.3 в конце, версии с 0.0 никто для реальной работы не будет скачивать).

  Для хранения репозитория я решил использовать базу Oracle 12c. В конце года заканчивается официальная поддержка базы версии 11.2, нужно будет переходить на версию 12. Я подумал, что хватит версии Oracle 12с простаивать на тестовых стендах, пора и в бою себя показать. 

  Создал новую PDB (подключаемую базу). Запустил установку OEM. С 5-й попытки установка завершилась успешно. Как обычно потребовались танцы с бубном. Самую большую проблему для меня вызвало аварийное завершение на шаге «OMS сonfiguration». Ключевые слова в логах:


INFO: oracle.sysman.top.oms:The plug-in OMS Configuration has failed its perform method

SEVERE: Failed executing oracle.sysman.omsca.util.RegisterPostRepSchemaMetadata unable to look up name "jdbc/mds/owsm" in JNDI context

oracle.sysman.top.oms:OMSCA-ERR:Post deploy operations failed. Check the trace file

install weblogic "PolicyManagerValidator" failed to preload on startup in Web application: "/wsm-pm".


  Поиск в интернете решения не нашел. Затрудняло анализ, то что программа установки после этой ошибки удаляла сконфигурированный инстанс weblogic-сервера вместе с логами. Пришлось несколько раз запускать установку, сохранять логи. После изучения проблемы была найдена причина: сессия в базе данных от weblogic-сервера аварийно завершалась с ошибкой ORA-7445:

Exception [type: SIGSEGV, SI_KERNEL(general_protection)] [ADDR:0x0] [PC:0x22BAA34, kzrtevw()+9988] [flags: 0x0, count: 1]
Errors in file /u01/app/oracle/diag/rdbms/emcdb/emcdb/trace/emcdb_ora_36611.trc  (incident=7581):
ORA-07445: core dump [kzrtevw()+9988] [SIGSEGV] [ADDR:0x0] [PC:0x22BAA34] [SI_KERNEL(general_protection)] []

Падение базы вызывал такой SQL запрос:

SELECT COUNT(*) FROM all_objects WHERE object_name = 'EM_UPG_DESUPPORTED_PLUGINS' AND object_type = 'TABLE'AND 0 = (SELECT COUNT(*) FROM gc_current_deployed_plugin WHERE plugin_id = 'oracle.sysman.db' AND destination_type = 'Repository');

На сайте техподдержки support.oracle.com нашел статью с описанием этой ошибки: Bug 4618715 - Dump inserting into a view with OLS policy on tables (Doc ID 4618715.8). Первый раз эта ошибка была обнаружена в 2005 году в версии базы oracle db 9, затем всплывала в версии 10, затем в 11. Каждый раз помечено, что баг исправлен. В моем случае этот баг всплыл в версии 12. Официального метода исправления ошибки от oracle нет. Я установил последний пакет с исправлениями: Patch 17552800 DATABASE PATCH SET UPDATE 12.1.0.1.2, в нем этот баг не исправился. Oracle Label security (OLS) у меня уже был отключен. 

  Я сделал несколько экспериментов и нашел такой workaround: нужно вручную отключить политики OLS у всех таблиц, участвующих в запросе. Т.е. смотрим проблемный SQL запрос, находим таблицы входящие в запрос, и отключаем у всех таблиц все политики. В нашем случае представление gc_current_deployed_plugin ссылается на 4 таблицы, у одной из них есть политики, отключаем так:

BEGIN
SYS.DBMS_RLS.DROP_POLICY('SYSMAN', 'EM_MANAGEABLE_ENTITIES', 'TARGET');
END;

Сделать это нужно в середине инсталляции EM12, когда таблицы репозитория уже созданы, но установщик еще не дошел до шага конфигурации OMS сервера. В итоге успешно заканчиваем инстилляцию.


  К сожалению этот эксперимент показал, что версия oracle db 12c еще "сырая" и в продакшн ей выходить еще рано. Ждем 1-го сервис-пака.

28 марта 2014 г.

Настройка Kerberos авторизации для weblogic сервера

Настройка Kerberos авторизации для weblogic сервера

Это краткая инструкция, как можно настроить автоматическую Kerberos авторизацию для приложения, загруженного в сервер приложений weblogic.

В качестве клиента будет выступать терминальный сервер с операционной системой windows.

Возможен вариант настройки авторизации на стороне weblogic-сервера, но это усложняет процесс разработки и тестирования. Поэтому мы настроим промежуточный сервер, который будет выполнять авторизацию, и при успешной проверке проксировать запрос на weblogic сервер. Разработчики будут ходит на weblogic-сервер напрямую, минуя промежуточный сервер.

Настройка промежуточного сервера. 

В качестве службы для авторизации будем использовать Apache

- Устанавливаем веб-сервер и модуль для кербероса:
yum install httpd mod_auth_kerb

- Переходим в каталог настроек:
cd /etc/httpd/conf/

- Добавляем в конец файла httpd.conf следующие строки:
LoadModule auth_kerb_module modules/mod_auth_kerb.so

- Так же в этом файле выставляем FQDN имя сервера:
ServerName fr01.gibdd.mos.ru

- Настройка балансировки и проксирования:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/"
env=BALANCER_ROUTE_CHANGED
<Proxy balancer://wt>
  BalancerMember http://x.y.z.b:1521 route=gibdd01 retry=120
  BalancerMember http://x.y.z.b:1521 route=gibdd02 retry=120
  ProxySet stickysession=ROUTEID lbmethod=byrequests
</Proxy>

ProxyPass /web-app balancer://wt/web-app
ProxyPassReverse /web-app balancer://wt/web-app

-Добавляем URL, закрытый авторизацией по керберосу:
<Location /web-app>
  AuthType Kerberos
  AuthName "Kerberos Login"
  KrbMethodNegotiate On
  KrbMethodK5Passwd off
  KrbAuthRealms mos.ru
  Krb5KeyTab /etc/httpd/conf/fr01.keytab
  KrbServiceName HTTP/fr01.gibdd.mos.ru@GIBDD.MOS.RU
  KrbSaveCredentials on
  require valid-user
</Location>

- Имя сервера (fr01.gibdd.mos.ru) должно разрешаться в ДНС в прямой и в обратной зоне:
# host fr01.gibdd.mos.ru
fr01.gibdd.mos.ru has address 10.0.10.10
#host 10.0.10.10
10.0.10.10.in-addr.arpa domain name pointer fr01.gibdd.mos.ru.

- Кейтаб указанный в конфигурации (/etc/httpd/conf/fr01.keytab), должен быть создан
администраторами домена, в котором происходит авторизация.

- Обращение в закрытую керберосом зону, должно быть по имени, на которое
  выдан кейтаб, и которое настроено на сервере и в днс. В данном примере это fr01.gibdd.mos.ru

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

- Устанавливаем программу "MIT Kerberos"

- Получаем тикет с авторизацией по паролю: логин@GIBDD.MOS.RU

- Настраиваем Firefox, указываем в адресной строке "about:config", затем меняем параметры:
network.auth.use-sspi = false

network.automatic-ntlm-auth.trusted-uris;mosgorzdrav.local = GIBDD.MOS.RU

network.negotiate-auth.delegation-uris = GIBDD.MOS.RU

network.negotiate-auth.gsslib = c:\Program Files\MIT\Kerberos\bin\gssapi32.dll

network.negotiate-auth.trusted-uris = GIBDD.MOS.RU

network.negotiate-auth.using-native-gsslib = false

- Перезагружаем firefox

- Заходим по ссылке: http://fr01.gibdd.mos.ru/web-app