Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Гетерогенный сервис с MSSQL  [new]
DenisBelyaev
Member

Откуда:
Сообщений: 8
Уважаемые коллеги прошу помощи!

Настраиваю тут вторую неделю (уже как) гетерогенный сервис к БД MSSQL... Были разные косяки и проблемы, но в основном все победил. Тестировал настроенный unixODBC через tsql и isql, connect проходит успешно, удаленная БД отдает данные. Далее настраиваю гетерогенный сервис, листнер, tnsnames. проверяю tnsping. Вроде бы все хорошо (хотя пингует сам себя). Создаю DB Link, успешно. А вот далее начинаются непонятные грабли. А именно при попытке сформировать SQL запрос в удаленную БД получаю такую ошибку:

ORA-28500: соединение ORACLE с посторонней системой выдало сообщение:
[unixODBC][FreeTDS][SQL Server]Cannot open server "MSSQL" requested by the login. The login failed. {42000,NativeErr = 40532}[unixODBC][FreeTDS][SQL Server]Unable to connect to data source {08001}
ORA-02063: предшествующий 2 lines из DBL
28500. 00000 - "connection from ORACLE to a non-Oracle system returned this message:"
*Cause: The cause is explained in the forwarded message.
*Action: See the non-Oracle system's documentation of the forwarded
message.
Error at Line: 1 Column: 23

Пароль проверял, все корректно, единственное в пароле есть символ "*" и поэтому весь пароль приходится брать в кавычки при создании DB Link...

P.S. DB Link создается с любым паролем, пробовал, проверка видимо происходит на уровне запроса.
14 фев 17, 22:58    [20212167]     Ответить | Цитировать Сообщить модератору
 Re: Гетерогенный сервис с MSSQL  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 881
Проблема, возможно, в настройках, не в пароле.
Давайте listener, tnsnames, конфигурацию HS.
15 фев 17, 07:19    [20212400]     Ответить | Цитировать Сообщить модератору
 Re: Гетерогенный сервис с MSSQL  [new]
landy
Member

Откуда:
Сообщений: 1149
Чтобы отсечь * - создайте dblink с пользователем MS SQL
у которого простой пароль - например 123
15 фев 17, 08:00    [20212436]     Ответить | Цитировать Сообщить модератору
 Re: Гетерогенный сервис с MSSQL  [new]
DenisBelyaev
Member

Откуда:
Сообщений: 8
listner.ora
-----------
# listener.ora Network Configuration File: /u01/app/oracle/product/12.1.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

GENERATED BY ORACLE CONFIGURATION TOOLS. = Generated by Oracle configuration tools.

LISTENER_CRM =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = localhost)
(PORT = 1521)
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CRM)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/db_1)
)
(SID_DESC =
(SID_NAME = MSSQL)
(PROGRAM = dg4odbc)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/db_1)
)
)


tnsnames.ora
---------------
MSSQL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)
)
)
(CONNECT_DATA =(SID = MSSQL)
)
(HS = OK)
)

initMSSQL.ora
----------------
HS_FDS_CONNECT_INFO=MSSQL
HS_FDS_SHAREABLE_NAME=/usr/local/lib/libodbc.so
#HS_FDS_TRACE_LEVEL = DEBUG
#HS_FDS_TRACE_FILE_NAME = /home/oracle/odbc_trace.log
#HS_NLS_NCHAR=UCS2
#set ODBCINI=/home/oracle/.odbc.ini

тест через isql:
-----------------
[root@localhost admin]# isql -v MSSQL <USERNAME> <PASSWORD>
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
15 фев 17, 10:49    [20213060]     Ответить | Цитировать Сообщить модератору
 Re: Гетерогенный сервис с MSSQL  [new]
tru55
Member

Откуда: СПб
Сообщений: 19656
LISTENER_CRM =
....

SID_LIST_LISTENER =


Как ты думаешь, эти 2 секции относятся к одному listener, или к разным?
15 фев 17, 11:13    [20213163]     Ответить | Цитировать Сообщить модератору
 Re: Гетерогенный сервис с MSSQL  [new]
DenisBelyaev
Member

Откуда:
Сообщений: 8
tru55,

я в администрировании не очень силен... Если не сложно, подскажите как правильно?
15 фев 17, 11:29    [20213235]     Ответить | Цитировать Сообщить модератору
 Re: Гетерогенный сервис с MSSQL  [new]
tru55
Member

Откуда: СПб
Сообщений: 19656
Ecли listener один, то проще использовать его дефолтное имя, т.е. listener.

Соответственно

LISTENER =

...

SID_LIST_LISTENER =


PS
В SID_LIST_LISTENER слово LISTENER - это имя, а не служебное слово.
15 фев 17, 12:48    [20213637]     Ответить | Цитировать Сообщить модератору
 Re: Гетерогенный сервис с MSSQL  [new]
DenisBelyaev
Member

Откуда:
Сообщений: 8
Переименовал listener...
Сменил пароль на более простой, без звездочки...

Ничего не помогает, все так же ошибка в логине...
15 фев 17, 21:50    [20215603]     Ответить | Цитировать Сообщить модератору
 Re: Гетерогенный сервис с MSSQL  [new]
Vadim Lejnin
Member

Откуда:
Сообщений: 5790
DenisBelyaev,

1) Скорее всего, dg4odbc не видит нужных библиотек
initMSSQL.ora
...
HS_FDS_SHAREABLE_NAME=/usr/local/lib/libodbc.so
...


Нужно добавить

listener.ora
...
(SID_DESC =
(SID_NAME = MSSQL)
(PROGRAM = dg4odbc)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/db_1)
(ENV="LD_LIBRARY_PATH=/usr/local/lib:/u01/app/oracle/product/12.1.0/db_1/lib:/u01/app/oracle/product/12.1.0/db_1/dg4odbc/driver/lib")
...
)


2) Какая разрядность драйверов odbc?
что говорят команды:
$ ldd /usr/local/lib/libodbc.so
$ file /usr/local/lib/libodbc.so
$ lsnrctl status
$ tnsping MSSQL
$ rpm -qa | grep -i odbc


p.s. Научитесь пользоваться тэгами
15 фев 17, 22:43    [20215710]     Ответить | Цитировать Сообщить модератору
 Re: Гетерогенный сервис с MSSQL  [new]
landy
Member

Откуда:
Сообщений: 1149
У вас unixODBC из пакета поставлен или сами собирали?
Если из пакета - то бинарики скорее всего не в /usr/local
16 фев 17, 06:36    [20216165]     Ответить | Цитировать Сообщить модератору
 Re: Гетерогенный сервис с MSSQL  [new]
DenisBelyaev
Member

Откуда:
Сообщений: 8
Vadim Lejnin,

Вот вывод команд:
$ ldd /usr/local/lib/libodbc.so
linux-vdso.so.1 => (0x00007fff93fa4000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f0750cb7000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f0750a9a000)
libc.so.6 => /lib64/libc.so.6 (0x00007f07506d9000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0751142000)


$ file /usr/local/lib/libodbc.so
/usr/local/lib/libodbc.so: symbolic link to `libodbc.so.2.0.0'


$ lsnrctl status

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 16-FEB-2017 22:37:38

Copyright (c) 1991, 2014, Oracle. All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Start Date 09-FEB-2017 09:55:44
Uptime 7 days 12 hr. 41 min. 54 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/12.1.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/localhost/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=localhost)(PORT=5500))(Security=(my_wallet_directory=/u01/app/oracle/admin/CRM/xdb_wallet))(Presentation=HTTP)(Session=RAW))
Services Summary...
Service "CRM" has 2 instance(s).
Instance "CRM", status UNKNOWN, has 1 handler(s) for this service...
Instance "CRM", status READY, has 1 handler(s) for this service...
Service "CRMXDB" has 1 instance(s).
Instance "CRM", status READY, has 1 handler(s) for this service...
Service "MSSQL" has 1 instance(s).
Instance "MSSQL", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully


$ tnsping MSSQL

TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 16-FEB-2017 22:38:36

Copyright (c) 1997, 2014, Oracle. All rights reserved.

Used parameter files:
/u01/app/oracle/product/12.1.0/db_1/network/admin/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))) (CONNECT_DATA =(SID = MSSQL)) (HS = OK))
OK (10 msec)



$ rpm -qa | grep -i odbc
unixODBC-2.3.1-11.el7.x86_64
unixODBC-devel-2.3.1-11.el7.x86_64
16 фев 17, 22:43    [20219637]     Ответить | Цитировать Сообщить модератору
 Re: Гетерогенный сервис с MSSQL  [new]
DenisBelyaev
Member

Откуда:
Сообщений: 8
Vadim Lejnin,

видимость библиотек проверил, в настройках сменил имя драйвера, получил другую ошибку:

ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
ORA-02063: preceding line from DBL


И еще вопрос: часто в описаниях встречаю путь "/u01/app/oracle/product/12.1.0/db_1/dg4odbc", но у меня на сервере нет такой папки, я уже думаю, может я чего то не понимаю и что то упустил? Но есть папка /u01/app/oracle/product/12.1.0/db_1/hs и там я делал настройки для HS сервиса. И исполняемы файл dg4odbc имеется на сервере в папке bin...
16 фев 17, 23:01    [20219665]     Ответить | Цитировать Сообщить модератору
 Re: Гетерогенный сервис с MSSQL  [new]
DenisBelyaev
Member

Откуда:
Сообщений: 8
landy,

сам собирал, скачивал, дальше make, make + install
16 фев 17, 23:02    [20219666]     Ответить | Цитировать Сообщить модератору
 Re: Гетерогенный сервис с MSSQL  [new]
landy
Member

Откуда:
Сообщений: 1149
По моему в odbc.ini для MS SQL соединения обязательно нужно прописать
UID= логин в БД
PWD= пароль

Но могу путать(у нас там еще куча других БД)

Кроме того, для MS SQL устанавливается еще и FreeTDS
17 фев 17, 12:01    [20220668]     Ответить | Цитировать Сообщить модератору
 Re: Гетерогенный сервис с MSSQL  [new]
DenisBelyaev
Member

Откуда:
Сообщений: 8
landy,

добавление UID и PWD ничего не дает. isql как работал, так и работает, при этом если убрать из запрос логин и пароль и дать просто isql -v MSSQL, то получаю ошибку:

[S1000][unixODBC][FreeTDS][SQL Server]Unable to connect to data source
[01000][unixODBC][FreeTDS][SQL Server]Adaptive Server connection failed
[ISQL]ERROR: Could not SQLConnect

C логином и паролем в запросе isql отрабатывает, freeTDS настроен. собственно проблема не на уровне ODBC, я об этом писал, проблема где то в Oracle.
17 фев 17, 12:10    [20220731]     Ответить | Цитировать Сообщить модератору
 Re: Гетерогенный сервис с MSSQL  [new]
landy
Member

Откуда:
Сообщений: 1149
Вот заметки на полях для других
-----------------------

Доступ к гетерогенным БД осуществляется через ODBC. Чтобы добавить сервис для создания DBLink на какой-либо БД Oracle
требуется создать сначала источник данных(DSN) на сервере.

Пример конфигурирования DSN для MSSQL сервера.

Чтобы добавить DSN - заходим на хост с правами root(по ssh). На хосте уже установлены и сконфигурированы
UnixODBC и FreeTDS(для MSSQL). Переходим в каталог /usr/local/etc и правим файл freetds.conf,
добавляем описание сервера MSSQL (ip, port ). Выглядит это так:

[mssqlserver] <--- алиас сервера для DSN
host = <ip или dns имя>
port = 1433
tds version = 8.0
client charset = UTF-8


Установленные драйвера для БД можно посмотреть в /etc/odbcinst.ini , а DSN описываются в /etc/odbc.ini.
Чтобы добавить DSN для MSSQL следующего вида:

[sccm] <----- DSN - должно быть уникальным, проверить в /etc/odbc.ini
Driver=FreeTDS <--- имя драйвера, см /etc/odbcinst.ini
Description=mssql
TDS_Version = 8.0
Trace=No
ServerName=mssqlserver <---алиас сервера, см freetds.conf
Port=1433
Database= <DB>
UID= логин в БД
PWD= пароль


DSN добавлен - можно проверить работоспособность:

$> isql -v sccm логин пароль


Подключились, проверили выборку из какой-нибудь таблицы - все DSN настроен и проверен.
Переходим к созданию гетерогенного сервиса.

Создание сервиса

У нас есть рабочий DSN, теперь можем создать сервис, который смогут использовать другие сервера БД Oracle.
Сервис добавляется в listener.ora, который транслирует вызовы в HS. Логинимся пользователем oracle,
добавляем сервис(например SCCM):


SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=sccm) <--- имя сервиса, регистровозависимое, регистр тот же, что и в $ORACLE_HOME/hs/admin/init<сервис>.ora
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/xe)
(PROGRAM=dg4odbc) <--- используем ODBC гетерогенный доступ
(ENVS=LD_LIBRARY_PATH=/usr/local/lib:/usr/lib64:/u01/app/oracle/product/11.2.0/xe)
)
(SID_DESC=
(SID_NAME=fp)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/xe)
(PROGRAM=dg4odbc)
(ENVS=LD_LIBRARY_PATH=/usr/local/lib:/usr/lib64:/u01/app/oracle/product/11.2.0/xe)
)
)


Перезапускаем листенер и проверяем, что сервис запущен и слушает входящие соединения

$ lsnrctl reload

$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 24-APR-2015 11:14:34

Copyright (c) 1991, 2011, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.2.0 - Production
Start Date 17-APR-2015 15:07:38
Uptime 6 days 20 hr. 6 min. 55 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Default Service XE
Listener Parameter File /u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/serverdb/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_XE)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=serverdb)(PORT=1521)))
Services Summary...
Service "fp" has 1 instance(s).
Instance "fp", status UNKNOWN, has 1 handler(s) for this service...
Service "sccm" has 1 instance(s).
Instance "sccm", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

$

Создаем сам гетерогенный сервис(под пользователем oracle)

$ cd $ORACLE_HOME/hs/admin

Создаем файл init<имясервиса>.ora ( в нашем примере initsccm.ora - регистр sccm тот же, что в listener.ora) со
следующим содержимым:

#
# HS init parameters
#
HS_FDS_CONNECT_INFO = sccm <--- имя сервиса
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so
HS_FDS_SQLLEN_INTERPRETATION=64
HS_FDS_TRACE_LEVEL = off

HS_NLS_NCHAR=UCS2 <--- кодировка для MS SQL, чтобы у клиентов правильно отображалась кириллица
HS_LANGUAGE = AMERICAN_AMERICA.CL8MSWIN1251

set ODBCINI=/etc/odbc.ini


Теперь можно локально проверить, работает ли гетерогенный сервис. Логинимся пользователем oracle.
Добавляем в локальный $ORACLE_HOME/network/admin/tnsnames.ora сервис SCCM:

SCCM =
(DESCRIPTION =
(ADDRESS_LIST=
(ADDRESS = (PROTOCOL = TCP)(HOST = serverdb)(PORT = 1521))
)
(CONNECT_DATA =
(SID = SCCM)
)
(HS = OK)
)

Проверяем доступность:

$ tnsping SCCM

TNS Ping Utility for Linux: Version 11.2.0.2.0 - Production on 24-APR-2015 11:30:14

Copyright (c) 1997, 2011, Oracle. All rights reserved.

Used parameter files:


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = serverdb)(PORT = 1521))) (CONNECT_DATA = (SID = SCCM)) (HS = OK))
OK (100 msec)

Создаем тестовый DBLink и проверяем работоспособность

$ sqlplus / as sysdba

$SQL> create database link TST connect to <логин ODBC> identified by <пароль ODBC> using 'SCCM';

$SQL> select count(*) from sysusers@TST;

$SQL> drop database link TST;

-------
Ну вот как-то так
17 фев 17, 12:17    [20220769]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить