barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

четверг, 21 декабря 2017 г.

Узнать SID сессии по database link

Проблема

Есть БД "А" и БД "Б", в первой создан DATABASE LINK ко второй. Нужно запросом к БД "А" узнать идентификатор сессии (SID) между БД "А" и БД "Б".

Решение

Из всех опробованных вариантов заработал только этот:
select
   to_number(substr(dbms_session.unique_session_id@DBLINK_NAME,1,4),'XXXX') mysid
from dual;
, где DBLINK_NAME - имя DATABASE LINK'а.

четверг, 23 ноября 2017 г.

Oracle DB: определение размера MATERIALIZED VIEW

Следующий запрос возвращает размеры (в Мб) всех материализованных представлений в БД:
SELECT segment_name,sum((BYTES)/(1024*1024)) "Allocated(MB)"
FROM dba_extents
WHERE segment_name in (SELECT mview_name FROM dba_mviews)
GROUP BY segment_name ;
Спасибо http://javeedkaleem.blogspot.ru/2010/04/find-space-used-by-materialized-views.html.

понедельник, 13 ноября 2017 г.

ORA-02020: используется слишком много каналов связи БД

Проблема

Есть ADF-приложение, в нем некоторые Entity смотрят на вьюхи, которые, в свою очередь, смотрят на удаленные таблицы через DATABASE LINK. При работе с этими Entity падает ошибка:
ORA-02020: используется слишком много каналов связи БД

Решение

Срабатывает ограничение OPEN_LINKS (ограничение на число link-ов в рамках одной сессии, см. https://docs.oracle.com/cd/B19306_01/server.102/b14237/initparams139.htm#REFRN10138) или OPEN_LINKS_PER_INSTANCE (тоже самое, но не на уровне сессии, а глобально, актуально при использовании SHARED-линков и распределенных транзакций, см. https://docs.oracle.com/cd/B19306_01/server.102/b14237/initparams140.htm#REFRN10139). Оба по-умолчанию равны 4. Посмотреть текущие значения можно SQL-запросом:
show parameter OPEN_LINKS
Необходимо поменять значения командами:
ALTER SYSTEM SET OPEN_LINKS=255 SCOPE=SPFILE;
ALTER SYSTEM SET OPEN_LINKS_PER_INSTANCE=255 SCOPE=SPFILE; 
(для применения потребуется рестартануть БД)

воскресенье, 12 ноября 2017 г.

ORA-24777: использование непереносимых ссылок на базы данных недопустимо

Проблема

Есть ADF-приложение, работающее на weblogic. Приложение использует Data source, предоставляемый weblogic'ом, для соединения с БД. Некоторые Entity приложения смотрят на вьюхи, которые, в свою очередь, смотрят на удаленные таблицы через DATABASE LINK.
При попытке приложения обратиться к данным в удаленной БД падает ошибка:
ORA-24777: использование непереносимых ссылок на базы данных недопустимо
Решение

Data source на weblogic использует JDBC-драйвер "oracle.jdbc.xa.client.OracleXADataSource, либо обычный (non-XA) драйвер oracle.jdbc.OracleDriver, но в настройках датасорса стоит галочка "Supports Global Transactions" (которая, кстати, установлена там по-умолчанию). При этом DATABASE LINK создан не как SHARED.
Соответственно, варианта 2:
  1. Использовать oracle.jdbc.OracleDriver со снятой галочкой "Supports Global Transactions", если распределенные транзакции по факту приложению не нужны
  2. Пересоздать DATABASE LINK с использованием SHARED-опции (подробнее см. https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5005.htm#i2061693).  Например:
CREATE SHARED PUBLIC DATABASE LINK MY_DBLINK
CONNECT TO "USR1" IDENTIFIED BY "PSWRD1"
AUTHENTICATED BY "USR1" IDENTIFIED BY "PSWRD1"
USING 'MYRMTORCL';

пятница, 20 октября 2017 г.

JDeveloper не запускает приложение на встроенном weblogic

Проблема

Есть JDeveloper 12c, и все было ок - приложение собиралось и запускалось на встроенном weblogic. Но в один прекрасный день этому пришел конец: weblogic стартует, а вот приложение на него не деплоится. И никаких ошибок, просто не деплоится - и всё. В левом нижнем углу окна JDev висит "Starting IntegratedWebLogicServer", хотя по логу запуска видно, что weblogic уже запустился, да и его console доступна в браузере. 
Перезагрузка машины, пересоздание default-ного домена weblogic - ничего не помогало.

Решение

Так и не понял, что это было, но если грохнуть C:\Users\<username>\AppData\Roaming\JDeveloper  - то все приходит в норму. Да, JDev теряет все пользовательские настройки, зато деплой начинает работать.

пятница, 29 сентября 2017 г.

Запуск Tomcat 8 из Netbeans 8.2 и Netbeans 10.0: ошибка "Не удается найти указанный файл"

Проблема

Установил Netbeans 8.2 вместе с Tomcat 8, пробую запустить Tomcat из Netbeans. В выводе старта томката получаю ошибку:
Using CATALINA_BASE:   "C:\Users\aspirinspb\AppData\Roaming\NetBeans\8.2\apache-tomcat-8.0.27.0_base"
Using CATALINA_HOME:   "C:\tomcat-8.0.27"
Using CATALINA_TMPDIR: "C:\Users\aspirinspb\AppData\Roaming\NetBeans\8.2\apache-tomcat-8.0.27.0_base\temp"
Using JRE_HOME:        "C:\Program Files\Java\jdk1.7.0_80"
Using CLASSPATH:       "C:\tomcat-8.0.27\bin\bootstrap.jar;C:\tomcat-8.0.27\bin\tomcat-juli.jar"
Не удается найти указанный файл
(на самом деле вместо  "Не удается найти указанный файл" были кракозябры, это уже расшифрованная фраза, спасибо https://2cyr.com/decode/?lang=ru).
Та же проблема наблюдается на Netbeans 10.0 с тем же Tomcat 8.

Причина

Причина в настройках прокси-сервиса, установленных в IE. Дело в том, что в Netbeans по-умолчанию установлена настройка "Использовать системные настройки прокси". А в них у меня задано исключение из проксируемых адресов по маске: "*.domain.ru;172.26.*". В итоге Netbeans формирует следующий параметр для старта томката:
-Dhttp.nonProxyHosts=*.domain.ru^|172.26.*^|<local> 
Что и вызывает невнятную ошибку  "Не удается найти указанный файл". Пока просто отключил использование прокси в настройках Netbeans.

вторник, 26 сентября 2017 г.

Oracle Database11g Express Edition: "ORA-12505, TNS:listener does not currently know of SID given in connect descriptor"

Установил я Oracle Database11g Express Edition Release 2 на Win 10 x64. Проблемы начались еще при скачивании дистрибутива. Сайт Oracle ругался на Unauthorized Request "In order to download products from Oracle Technology Network you must agree to the OTN license terms", хотя я, естественно, условия лицензии принял. Пришлось качать с rutracker. Наконец поставив, пытаюсь подключиться через JDeveloper по jdbc:oracle:thin:@localhost:1521:XE. Получаю:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
Тоже самое через cmd с помощью:
sqlplus sys/******@XE as sysdba
Вроде бы службы запущены, "Start Database" в меню Пуск я нажимал. Перезапуск служб не помог (хотя вроде бы стартовал в правильном порядке - сначала OracleXETNSListener, потом - OracleServiceXE).
Помогло следующее. Приконнектился с помощью:
sqlplus sys/111111 as sysdba
Выполнил:
alter system set local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' scope = both;
alter system register;
exit;
После чего:
lsnrctl stat 
Вуаля, можно коннектится.

пятница, 15 сентября 2017 г.

Oracle BI Publisher: невозможно войти после некорректной настройки LDAP-авторизации

Проблема

Некорректно настроил LDAP-авторизацию в Oracle BI Publisher (Администрирование -> Конфигурация защиты -> Авторизация). Из-за этого после рестарта не могу авторизоваться в publisher ни под одним пользователем (даже под администратором, чтобы скорректировать настройки авторизации).

Решение

Открываем файл $DOMAIN_HOME/bidata/components/bipublisher/repository/Admin/Configuration/xmlp-server-config.xml, меняем значение свойства SECURITY_MODEL на XDO (соответствует опции модели защиты "Защита BI Publisher"). Рестартуем BI, входим под дефолтными Administrator/Administrator.

Oracle BI Publisher: ошибка старта "[Security:090302]Authentication Failed: User specified user denied" после смены пароля пользователя weblogic

Проблема
Был рабочий Oracle BI Publisher. Сменил пароль пользователя weblogic через console weblogic-сервера, пытаюсь рестартаную сервер - AdminServer стартует нормально, а вот bi_server не стартует, в логах ошибка:
[Security:090302]Authentication Failed: User specified user denied
Перепробовал множество разных вариантов, даже сменил пароль weblogic обратно на старый - ничего не помогало, все та же ошибка в логах.

Решение 
Необходимо выполнить следующие шаги:
  1. Идем в $DOMAIN_HOME/bin
  2. Выполняем
    . ./setDomainEnv.sh
    (точка в начале обязательна)
  3. Останавливаем сервер
    $DOMAIN_HOME/bitools/bin/stop.sh
  4. Идем в $DOMAIN_HOME/security, выполняем
    mv DefaultAuthenticatorInit.ldift DefaultAuthenticatorInit.ldift.old
  5. Сбрасываем логин/пароль администратора weblogic-сервера
    java weblogic.security.utils.AdminAccount weblogic <new_password> .
    (точка в конце обязательна)
  6. Выполняем
    mv $DOMAIN_HOME/servers/AdminServer/data/ldap $DOMAIN_HOME/servers/AdminServer/data/ldap.old
  7. Идем в $DOMAIN_HOME/servers/AdminServer/security, создаем там boot.properties (или редактируем существующий), прописываем:
    password=<username>
    username=weblogic
  8. Стартуем сервер
    $DOMAIN_HOME/bitools/bin/start.sh

среда, 13 сентября 2017 г.

hg: "SSL: UNSUPPORTED_PROTOCOL"

Проблема

При попытке выполнить clone через hg с некоторого https-URL получаю ошибку:
(could not negotiate a common security protocol (tls1.1+) with my.host.com; the likely cause is Mercurial is configured to be more secure than the server can support)
(consider contacting the operator of this server and ask them to support modern TLS protocol versions; or, set hostsecurity.my.host.com:minimumprotocol=tls1.0 to allow use of legacy, less secure protocols when communicating with this server)
(see https://mercurial-scm.org/wiki/SecureConnections for more info)
abort: error: [SSL: UNSUPPORTED_PROTOCOL] unsupported protocol (_ssl.c:661)
Решение

Подсказка решения есть в тексте самой ошибки, но она не совсем корректная. Открываем %USERHOME%/mercurial.ini, добавляем туда:
[hostsecurity]
my.host.com:minimumprotocol=tls1.0
Актуально для hg  4.3.1.

пятница, 4 августа 2017 г.

Citrix + RDP: передача Alt+Tab на удаленную машину

В настройках RDP-соединения можно установить передачу комбинаций клавиш (таких, как Alt+Tab) на удаленную машину, но вот при использовании RDP через Citrix эта настройка почему-то не работает - Alt+Tab все равно переключает окна на локальной машине.
Выход - установка ключей реестра
HKEY_LOCAL_MACHINE \SOFTWARE\Citrix\ICAClient\Engine\Lockdown Profiles\All Regions\Lockdown\Virtual Channels\Keyboard\TransparentKeyPassthrough 
или
HKEY_CURRENT_USER\SOFTWARE\Citrix\ICAClient\Engine\Lockdown Profiles\All Regions\Lockdown\Virtual Channels\Keyboard\TransparentKeyPassthrough 
в значение "Remote".

вторник, 11 июля 2017 г.

access-лог во встроенном Weblogic 12c

Проблема

Есть JDeveloper 12.1.3 и идущий вместе с ним в комплекте Weblogic. Пытаюсь настроить на нем access-логирование, но почему-то вообще ничего не вижу в access-логе несмотря на активное обращение к задеплоенному на weblogic приложению.

Причина

Weblogic почему-то не пишет в access-лог обращения, если они идут к localhost / 127.0.0.1. Если попытаться обратиться к задеплоенному приложению по внешнему IP рабочей машины, лог пишется.

вторник, 27 июня 2017 г.

ktpass: ошибка "Password set failed! 0x00000020"

Проблема

Пытаюсь связать kerberos-принципала с пользователем утилитой ktpass:
ktpass -princ HTTP/MYSERVER@DOMAIN.LOCAL -mapuser MYSERVER$@DOMAIN.LOCAL -crypto ALL -ptype KRB5_NT_SRV_HST +rndpass -out C:\TMP\MYSERVER.keytab
Получаю ошибку:
Reset MYSERVER$'s password [y/n]?  y
Password set failed! 0x00000020Aborted.
Причина

В DN объекта MYSERVER$ есть кириллица.

Решение

Перенести MYSERVER$ таким образом, чтобы в его DN не было кириллицы.

вторник, 13 июня 2017 г.

Установка плагинов на старые версии Java VisualVM

Проблема

Есть некая старая версия Java VisualVM, к примеру, поставляемая с JDK 6 или JDK 7. При попытке установить на нее плагин через Tools -> Plugins (к примеру, Visual GC плагин для мониторинга GC) получаем ошибку скачивания некоторого файла с домена java.net.

Решение

Домен java.net закрыт, плагины для VisualVM теперь хостятся на visualvm.github.io. На странице https://visualvm.github.io/pluginscenters.html можно найти подходящий центр плагинов, который нужно прописать в Tools -> Plugins -> Settings вместо прописанного там центра.


вторник, 18 апреля 2017 г.

pgAdmin III и Avast!

С определенного момента антивирус Avast! стал мешать запуску pgAdmin III (1.20.0). Процесс pgAdmin вроде бы появляется в диспетчере, но самого приложения не видно. Выход - добавить папку C:\Program Files\PostgreSQL\9.4\* в исключения экрана файловой системы Avast (Настройки -> Активная защита -> Экран файловой системы -> Настройки -> Исключения).

среда, 15 февраля 2017 г.

PostgreSQL: Дамп функций из определённой схемы БД

Определения функций из определенной схемы БД PostgreSQL выгружаются следующим запросом:
SELECT pg_get_functiondef(f.oid)
FROM pg_catalog.pg_proc f
INNER JOIN pg_catalog.pg_namespace n ON (f.pronamespace = n.oid)
WHERE n.nspname = 'myschema';
Осталось только записать вывод этого запроса в файл с разделителем строк ";" - и вуаля, sql-дамп всех функций готов к накату на другие БД. 

вторник, 14 февраля 2017 г.

Ожидание заданного в миллисекундах интервала в bat-файле

Вариантов реализации ожидания заданного в миллисекундах интервала в bat-файле много, один из них:
ping -n 1 -w <интервал в мс> 10.10.254.254 >nul
Здесь важно, что 10.10.254.254 - гарантированно несуществующий ip.
А если нужно ждать рандомное число мс в заданном диапазоне:
set /a randms=500+1000*%random%/32768
ping -n 1 -w %randms% 10.10.254.254 >nul 
Здесь делается рандомная задержка от 500 до 1000 мс.

вторник, 7 февраля 2017 г.

WSO2 ESB, ActiveMQ и игнорирование AMQ_SCHEDULED_DELAY

Проблема

Есть прокси-сервис на WSO2 ESB 4.9.0, слушающий некоторую очередь на ActiviMQ 5.13.1. В некоторых ветках своей логики прокси-сервис помещает полученное из очереди сообщение обратно очередь, устанавливая при этом AMQ_SCHEDULED_DELAY для обеспечения задержки перед повторной обработкой сообщения. Проблема заключается в том, что ActiveMQ принимает во внимание установленный AMQ_SCHEDULED_DELAY только при первом цикле такого повторного размещения. В последующих циклах AMQ_SCHEDULED_DELAY игнорируется, и сообщение поступает в обработку моментально.

Решение

Можно лишь предполагать, чем вызвано такое поведение (или лезть в исходники ActiveMQ, чего делать не очень хочется). Вероятно, т.к. сообщение повторно размещается с тем же Message ID, ActiveMQ как-то запоминает, что таймер AMQ_SCHEDULED_DELAY для этого Message ID уже устанавливался, и не устанавливает его повторно. В качестве workaround'а подходит очистка транспортных заголовков перед повторным размещением сообщения в очередь:
<property action="remove" name="TRANSPORT_HEADERS" scope="axis2"/>