Oracle-club: FAQ - SQL*Net


Новости | FAQ | Ссылки | Темы | Утилиты | Documentation | Семинары
Настройка SQL*Net

SQLNET v1 настраивается через следующие переменные :
REMOTE - удаленная БД например REMOTE=T:123.45.67.89:ORCL
LOCAL - локальная БД    например LOCAL=ORCL
SQLNET DBNAME alias - псевдоним некоторой БД
Имея установленную переменную REMOTE в строке коннекта
можно просто указывать тип протокола : Т, X

Наличие переменных LOCAL, REMOTE указывает на 
преимущественное использование SQLNET v1.

Имена сервисов SQLNET v2, указанные в в tnsnames.ora
доступны при настройке через конструкции
SQLNET DBNAME alias 
и при отсутствии установленных LOCAL, REMOTE

В oracle.ini(win3.1) или 
в Registry(win95/NT) в разделе HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
создаются параметры типа
SQLNET DBNAME alias 
Прописываются туда строки и для SQLNET v1 и для SQLNET v2
Для этого необходимо чтобы был установлен SQLNet v1

Пример : 
SQLNET DBNAME tr  значение : "T:123.45.67.89:ORCL" - SQLNet v1
SQLNET DBNAME dtra  значение : "INTRA_tcp_DTRA" - SQLNet v2
tr и dtra можете заменить на удобные вам абревиатуры

а в tnsnames.ora записано так
INTRA_tcp_DTRA.world = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      etc ...

Ошибки SQLNET v1 ORA-6105 : не прописано имя узла в файле настроек "hosts" (его расположение прописано в параметре TCP_HOSTS_FILES) ORA-6107 : не хватает строки "orasrv 1525/tcp" в файле настроек "services" (его расположение прописано в параметре TCP_SERVICES_FILES) ORA-6108 : не запущена БД на сервере или несоответствие протоколов клиента и сервера ORA-6136 : несоответствие имен БД на сервере и в строке коннекта
SQL*Net and Proxy - ? Через стандартный прокси не удастся из-за динамического назначения TCP портов. Можно делать прокси, который при sql*net коннекте находит номер порта в теле пакета, назначенный листенером для связи и динамически разрешал этот порт для звязи. Дорогие файерволы с поддержкой sql net делают так же. (из конференции) Это несовсем правда. Можно запускать SQL*Net V2 через прокси, при условии, что Listener находится не в Prespawned || Multithreaded конфигурации. Я проверял и это работает. То есть : у меня была БД в "приватном" адресном пространстве, и было необходимо поиметь к ней доступ снаружи. Для этого брался редиректор из FWTK ( уже не припомню, кто его выпускает) и, соответственно, вешался на какой-либо порт на машине, которая была доступна из Инета, а соединения , приходящие на этот порт прокидывались на машинку с БД. И все отлично работало. Единственное ограничение - сервер должен быть не prespawned и ( не уверен, ибо не пробовал) не multithreaded. Michael L. Levitin (Mlevitin@ptrsrv.spb.ru)

Вопрос:

Есть Oracle8 под NetWare и Oracle Web Server 2.1 (под Oracle 7.2 и выще, как они пишут). Хочу их соединить. Создал новый Database Connection Descriptor. До БД достучался, но сервис Net8 он конечно не признает. Есть ли выход из этой ситуации?

Ответ:

Ваше проблема в том, что SQL*NET2 use: %ORACLE_HOME%\NETWORK\ADMIN NET8 use: %ORACLE_HOME%\NET8\ADMIN т.е. Вам необходимо просто синхронизировать tnsnames.ora в этих директориях, либо прописать в регистре переменную TNS_ADMIN=%Directory for place sqlnet files%

Вопрос:

Как организовать DOS клиента к Oracle 7.3, 8.05?

Ответ:

Через SQL Net v2 lite for DOS Но он через него можно открывать только одну сессию. Работает этот SQL Net через TCP-клиента для DOS. В autoexec.bat прописываешь SET CONFIG=d:\...\config.ora SET ORA_CONFIG=%CONFIG% sqltcpf.exe ------------------------------------------- config.ora (пример) NLS_LANG=AMERICAN_AMERICA.RU8PC866 TCP_HOSTS_FILE=d:\...\HOSTS TCP_SERVICES_FILE=d:\...\SERVICES ----------------------------------------- В services прописываешь tnslsnr 1521/tcp ----------------------------------------- Строка коннекта t:srvorac:sid:V2 (вообще работает и без V2). ----------------------------------------- У меня на этом клиенте работают 25 юзеров. Жалоб со стороны клиентов пока не было. Ограничения: см. выше. С уважением, Андрей Демченко (andrey@papir.kiev.ua)

Дискуссия в relcom.comp.dbms.oracle - сентябрь 1999

Затравка:

Alex Vin (vin-mail@nexcom.ru) Что такое IPC(Interprocess Communication)? 1"используется для соединения с приложениями на том же узле" 2"для определения нужного приемника" Зачем они нужны? Если их отрубить, все равно работает (через что?).

Дискуссия:

Mich (Mich@tomcat.ru) Это протокол межпроцессного взаимодействия . Если серьезно, то это в двух словах не описывается, но есть огромное количество литературы в Инете по этому поводу. Оракл использует его для связи между подчиненным процессом и ядром. По крайней мере, когда у меня были большие проблемы с SQL*Net и пришлось пристально изучать логи в режиме SUPPORT: когда происходит коннект к листенеру ( dedicated mode ), листенер рождает подчиненный процесс, работающий c клиентом по TCP или какому-то другому сетевому протоколу, а с БД работает через IPC порт. ПОд Unix он, обычно, создается в каталоге /tmp/.oracle с именем, которое эквивалентно значению параметра KEY= в определении листенера. IPC может работать только в пределах одного хоста. Они нужны для связи листенера с нужным экземпляром БД. Их может быть несколько на одном хосте. >Если их отрубить, все равно работает (через что?). Потому что они используются неявно ( кажется ) Это средства межзадачной коммуникации, наиболее рациональный способ обмена для процессов в пределах однойго хоста, ввиду меньших затрат на ресурсы системы, и скорострельность обмена, более высокие показатели безопасности. Традиционно известны несколько вариантов, каждый из которых весьма OS-специфический: 1) Shared Memory 2) PIPEs (Local) 3) MailBoxes 4) Messages При этом задействуются Semaphores Oracle использует , как минимум, 3 механизма - shared memory, semaphores and pipes Просто semaphores относятся к IPC. Их ядро использует само. Видимо, для регулирования доступа к shared memory, в которой живет SGA Посколку речь идет обмене данными за рамками остаются event flags, mutexes, spinlocks и прочая. Посему рекомендую оставить и в первую голову юзать IPC, в случае если сетевая поддержка в заднице (например), есть шанс все таки добраться до сервера. Listener с экземпляром в любом случае через IPC sockets работает. Ruslan R. Laishev (Laishev@SMTP.DeltaTel.RU) Оракл использует гораздо больше элементов IPC, в данном случае речь может идти только об IPC предусматривающими обмен данными. Семафор хоть и относиться к IPC все же несет другую смысловую нагрузку, в противном случае Locks также могут быть отнесены к IPC :^) (в прочем и относятся). Mark (malakanov@sapience.ca) Семафоры? Что то не втречал ни в listener.ora ни в tnsnames. Откуда инфа? И вообще как через семафоры можно обмениваться данными(массивными)? Они-ж вроде как флажки. Или я ошибаюсь? Интересно просто. Mich (Mich@tomcat.ru) Их там и нет и быть не может. $ipcs -s IPC status from /dev/kmem as of Thu Sep 30 09:47:19 1999 T ID KEY MODE OWNER GROUP Semaphores: s 0 0x2f180002 --ra-ra-ra- root sys s 1 0x411c031b --ra-ra-ra- root root s 2 0x4e0c0002 --ra-ra-ra- root root s 3 0x41200603 --ra-ra-ra- root root s 4 0x01090522 --ra-r--r-- root root s 16605 0x00000000 --ra-ra---- oracle dba s 13286 0x00000000 --ra-ra---- oracle dba s 7 0x00280269 --ra-ra-ra- root root 2 предпоследние строчки :-) можно еще: ipcs -a на Unix. Однако, есть и были всегда :-) Как сейчас помню - если инстанс приходилось валить 9-м сигналом, потом с помощью ipcrm нужно было зачищать семафоры и разделяемую память. На VMS может быть и нет - там, кажется, механизм mailbox-ов используется. Vadim Lejnin (lejnin@fors.ru) > Mark (malakanov@sapience.ca) wrote: > : Семафоры? Что то не втречал ни в listener.ora ни в tnsnames. > : Откуда инфа? И вообще как через семафоры можно обмениваться > : данными(массивными)? Нет! > > Использует использует. Для SCO, например, даже в руководстве по инсталяции > было сказано добавить стоко-то, и что интересно нихрена ни ставился если > не добавляли. Непосредственно семафоры, действительно только флажки, но они используются для синхронизации процессов... В unix например используются следующие способы межпроцессного взаимодействия: - синхронизация по общей памяти ( IPC ) - синхронизация по семафорам (флажкам) - синхронизация по сигналам - синхронизация по вводу - выводу ( внутри конечно те-же сигналы) - post-wait driver ( расширение системы ) Кстати, лучшей альтернативой для семафоров, служит post-wait driver Это расширение системы, устанавливает что-то вроде програмного прерывания в системе, То-есть после освобождения ресурса, система сама вызывает поставленную в очередь следующую процедуру... Oracle умеет его использовать Кстати использование post-wait driver может дать рост производительности до 15-25%, но не все UNIX имеют данное расширение. С связано это с тем, что стандартно семафоры, реализованы, как структуры на диске... Кроме, того при применении post-wait не надо использовать system ограниченный ресурс - количество семафоров в системе Для просмотра IPC ресурсов вы можете использовать команду $ ipcs -mb IPC status from /dev/kmem as of Tue Oct 5 20:19:23 1999 T ID KEY MODE OWNER GROUP SEGSZ Shared Memory: m 0 0x2f180002 --rw------- root sys 1286144 m 1 0x411c02f9 --rw-rw-rw- root root 348 m 2 0x4e0c0002 --rw-rw-rw- root root 31008 m 3 0x41200600 --rw-rw-rw- root root 8192 m 1604 0xd79982fc --rw-r----- oracle dba 19472384 m 2605 0x5fe5770e --rw-r----- oracle dba 21139456 m 806 0x00280267 --rw-r--r-- root root 1048576 $ ipcs -sb IPC status from /dev/kmem as of Tue Oct 5 20:20:04 1999 T ID KEY MODE OWNER GROUP NSEMS Semaphores: s 0 0x2f180002 --ra-ra-ra- root sys 6 s 1 0x411c02f9 --ra-ra-ra- root root 1 s 2 0x4e0c0002 --ra-ra-ra- root root 2 s 3 0x41200600 --ra-ra-ra- root root 2 s 4 0x00446f6e --ra-r--r-- root root 1 s 5 0x00446f6d --ra-r--r-- root root 1 s 134 0x01090522 --ra-r--r-- root sys 1 s 1543 0x00000000 --ra-r----- oracle dba 50 s 2824 0x00000000 --ra-r----- oracle dba 50 s 137 0x00280269 --ra-ra-ra- root root 14 $ Кроме того загляните в директорию: /tmp/.oracle Ruslan R. Laishev (Laishev@SMTP.DeltaTel.RU) > В unix например используются следующие способы межпроцессного > взаимодействия: > - синхронизация по общей памяти ( IPC ) Синхронизация по общей памяти - что-то новенькое, до сих пор синхронизировали доступ к оной. > - синхронизация по семафорам (флажкам) Флаги и семафоры семантически разные элементы. > - синхронизация по сигналам Сигнал - есть абстракиция, расширяющая семантику семафора до значения. > - синхронизация по вводу - выводу ( внутри конечно те-же сигналы) К синхронизации и к IPC никакого отношения, терминологический ляп. > - post-wait driver ( расширение системы ) То же самое. Vadim Lejnin (lejnin@fors.ru) >> - синхронизация по общей памяти ( IPC ) > Синхронизация по общей памяти - что-то новенькое, до сих пор > синхронизировали доступ к оной. Пардон, конечно неправильно выбрал термины, не синхронизация, а взаимодействие между процессами... Ruslan R. Laishev (Laishev@SMTP.DeltaTel.RU) > Пардон, конечно неправильно выбрал термины, не синхронизация, а > взаимодействие между процессами... Я бы сказал обмен данными используя соотвествующие механизмы IPC. Mark (malakanov@sapience.ca) А что такое BEQUETH протокол? - Os-specific, или MailBox, или shared memory, или named pipes. (Mich@tomcat.ru) Он как раз на IPC и построен. Доступ к экземпляру в пределах одного хоста OKukartsev@hotmail.com Т.е. только в пределах одного хоста я могу пользовать BEQ и IPC Причем BEQ работает через IPC, IPC может работать и без listener Посмотрел внимательнее, получилось: BEQ работает без listener ,используя IPC listener используя IPC соединяется с instance listener может использовать IPC и для соединения с клиентом (на том же хосте) Олег Иванчук (ion@utg.gazprom.ru) Bequeath, в отличие от IPC, к-ый стандарт для UNIX, чисто оракловый протокол локального обмена. Для Bequeath, опять же в отличие, не нужен listener - клиент работает с сервером "напрямую". В документации (Oracle Networking Products User's Guide for Windows NT/95) так: Connecting to a Local Windows NT Server without a Listener SQL*Net for Windows NT version 2.3 includes a new feature called the Bequeath Protocol Adapter. The Bequeath Protocol Adapter: does not use a listener (therefore, no server configuration is required) is used for local connections where a Windows NT client application (such as SQL*Plus) communicates with a Windows NT server running on the same machine. Теперь у меня вопрос, если кто знает, по причине скверного его освещения в документации: Как формируются для протокола BEQ в tnsnames.ora параметры PROGRAM, ARGV0 и ARGS ? Хотя с последним, похоже вариантов нет - ARGS = '(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))'. Особо интересует в варианте для NT, тк BEQ сильно зависит от платформы. Кстати, похоже, listener вяжется с oracle также по протоколу beq, но с недокументированными параметрами (естественно, используя IPC на нижнем уровне). И еще вопросик для унихсистов , тк IPC растет оттуда. Насколько произвольно можно задавать параметр KEY для протокола IPC в SQLNET - достаточно ли, чтобы он был одинаков в listener.ora и tnsnames.ora или есть более жесткие ограничения ? Дмитрий Блинов (Dmitri_Blinov@drb.com.ru) IPC это общее название технологии взаимодействия процессов в понятии OS между собой. Процесы при этом могут быть вообще на разных машинах. Данная технология вообще говоря не привязана к конкретной аппаратной платформе и операционной системе. Примерами ее могут быть Shared Memory ( Unix, Win95 ), Semaphores ( Unix, Win* ), RPC (*), и т.д. BEQUETH протокол является разработкой Oracle, и служит для взаимодействия процессов Oracle ( только ), базируется на технологии IPC, точно также, как любой протокол более высокого уровня базируется на протоколе более низкого уровня. > Однако, не выходит у меня по IPC на др. > машину законнектиться.... :-((( > Или это не можно так? Это потому что IPC - "ОБЩЕЕ НАЗВАНИЕ ТЕХНОЛОГИИ" и не более. Между различными вариантами этой технологии мало чего общего, как с точки зрения API так и с точки зрения функциональностей. Реализация Shared Memory не позволяет взаимодействовать двум процессам на разных машинах, Berkley Sockets - позволяет. BEQ может уметь работать через SM (IPC) и не уметь через Socks(IPC). Для удаленного соединения нужна ответная часть (Listener), и соответствующие сетевые протоколы, с которыми и так могут работать существующие PA. Tim Kutergin (tim@inforis.ru) Ну вы тут и путаницу развели ;))) Тут явно путают два термина: 1). IPC как средство OS (в Unix туда входят shared memory, semaphores, message queues, pipes, sockets). ВНУТРИ Oracle интенсивно используется shared memory (собственно SGA) и semaphores для управления доступа к ней, но к взаимодействию клиента с сервером это отношения не имеет. 2). IPC как название протокола SQL*NET. Он работает в Unix, как я понял, на основе Unix domain sockets, имена которых находятся в /tmp/.oracle. Насчет протокола BEQ. По сути, клиентская програма делает fork() и exec() для $ORACLE_HOME/bin/oracle, который подсоединяется к SGA (не зря он setuid на oracle) и общается с вызвавшей его программой через обычный pipe в Unix. В таком виде ему, естественно, не нужны не listener, не SQL*NET вообще. К моему удивлению, его, похоже, можно описать в tnsnames.ora, хотя я и не понимаю, зачем это нужно. Олег Иванчук (ion@utg.gazprom.ru) Tim Kutergin wrote: Насчет путаницы c термином IPC согласен. >Насчет протокола BEQ. По сути, клиентская програма делает fork() и exec() Все сложнее. >для $ORACLE_HOME/bin/oracle, который подсоединяется к SGA (не зря он >setuid на oracle) и общается с вызвавшей его программой через обычный pipe >в Unix. В таком виде ему, естественно, не >нужны не listener, не SQL*NET вообще. К моему удивлению, его, похоже, >можно описать в tnsnames.ora, хотя я и не понимаю, зачем это нужно. Нормально адаптер для протокола BEQ содержится в SQL*Net на сервере по умолчанию и без SQL*Net клиенту с сервером связаться не удастся. Благородный дон может привести реальный пример клиента, работающего с Oracle БЕЗ SQL*Net (Net8) ? Tim Kutergin (tim@inforis.ru) > >Насчет протокола BEQ. По сути, клиентская програма делает fork() и exec() > Все сложнее. Естественно, по этому pipe работает какой-то протокол, но он реализуется самим Oracle. > > Благородный дон может привести реальный пример клиента, работающего с Oracle БЕЗ SQL*Net (Net8) ? Естественно. Я могу запустить сервер Oracle и запустить клиентскую программу типа sqlplus или OCI или ProC не запуская никаких листенеров и не конфигурируя SQL*NET. Главное чтобы ORACLE_HOME указывал куда надо ;). Хотя, как я теперь понял, описание такого протокола в tnsnames.ora приведет просто к тому, что клиентская программа будет знать откуда запускать oracle. А ты не задумывался, для чего на $ORACLE_HOME/bin/oracle стоит set-uid на oracle, если листенер собственно под этим uid и работает и работает, и в каких случаях этот самый setuid можно убрать ? Вот именно, если не используешь BEQ. Конечно, формально BEQ можно считать частью SQL*NET, но реально он может работать без листенера и настройки sql*net. Кстати, у меня дома есть personal oracle под win95 вообще без sql*net - и ничего, использую Dev2k. Олег Иванчук (ion@utg.gazprom.ru) >А ты не задумывался, для чего на $ORACLE_HOME/bin/oracle стоит set-uid на >oracle, если листенер собственно под этим uid и работает и работает, и в >каких случаях этот самый setuid можно убрать ? Вот именно, если не >используешь BEQ. Как я понимаю, это специфика UNIX. Я с ним не работаю. Ты мог бы вкратце объяснить, что такое setuid или где посмотреть про это? Tim Kutergin (tim@inforis.ru) SetUid - бит в правах доступа к файлу, числовое значение 4000, выглядит в ls как rws--x--x, например. ^ вместо x Точнее будет 4711----------------------------------^^^^ (Dmitry E. Loginov lde@mpsb.moris.ru) Смысл в следующем. Обычно программа работает под правами запустившего ее пользователя. Однако при наличии этого бита она работает под ПРАВАМИ ВЛАДЕЛЬЦА ФАЙЛА, в данном случае oracle. При этом системный вызов getuid() возвращает uid запустившего пользователя, а geteuid() - uid oracle (это применяется для аутентификации на уровне OS). В oracle setuid применяется собственно для BEQ, как я и описывал. Это дает возможность серверному процессу Oracle, запущенному клиентской библиотекой получить доступ к SGA и файлам данных. При этом не применяется каких либо сетевых средств. Я, правда, не пытался собирать сервер вообще без TCP/IP, но надо сказать, что в списке адаптеров SQL*NET в инсталляторе BEQ не фигурирует. Кстати, я дома гоняю Personal Oracle на машине, где сеть вообще не сконфигурирована. Похоже, в Windows BEQ также реализован как какой-то IPC протокол и в инсталляторе также не показывается.

Новости | FAQ | Ссылки | Темы | Утилиты | Documentation | Семинары