Невозможно создать ссылку на базу данных на удаленную БД в Oracle-DB
В нашей компании есть CRM-система, которая использует базу данных Oracle 11g. Он разработан сторонним поставщиком.
У нас нет доступа к серверу, на котором работает система CRM. Но, тем не менее, у нас есть рабочие данные для входа в систему администратора баз данных, доступные нам (пользователю SYS). Это состоит из:
- IP сервера: 172.1.2.3
- порт: 1521
- SID: abc
- пользователь: sys
- пароль: *
Мы можем использовать это для доступа к БД с помощью Oracle SQL Developer 3.1 (Соединения >> Свойства)
Теперь части данных должны быть скопированы из базы данных CRM в другую базу данных Oracle, которая находится на другом сервере.
Насколько я понимаю, мне нужно создать ссылку на базу данных в моей целевой базе данных. Я попробовал что-то вроде этого:
CREATE PUBLIC DATABASE LINK xxx CONNECT TO sys IDENTIFIED BY ***** USING 'MYTNSENTRY'
Мой tnsnames.ora выглядит следующим образом:
MYTNSENTRY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.1.2.3)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = abc)
)
)
.... и мой listener.ora выглядит так:
MYLISTENER=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=172.1.2.3)(PORT=1521))
))
SID_LIST_MYLISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=MYTNSENTRY)
(ORACLE_HOME=C:\somepath) # path to Oracle home of target DB
(PROGRAM=extproc)))
Является ли PROGRAM=extproc правильным выбором? Есть пара других программ на выбор. Я даже не мог запустить слушателя с помощью lsnrctl, потому что он не мог "проверить пользователя" или что-то в этом роде. По иронии судьбы, настройка слушателя и ссылка на базу данных на сервер MS SQL работают без сбоев.
Теперь, несмотря на отсутствие некоторой важной информации о системе БД CRM, все еще можно подключиться к БД в SQL Developer. Разве нельзя также установить соединение между двумя БД Oracle? Пожалуйста, помогите мне с настройкой и созданием ссылки на базу данных.
----- РЕДАКТИРОВАТЬ: --------
Намек Алекса Пула помог мне заставить его работать. я использовал
show parameters service_names;
чтобы получить полное название сервиса. Он имеет форму abc.def, где def является доменом. Таким образом, я добавил доменное имя к псевдониму TNS в tnsnames.ora:
MYTNSENTRY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.1.2.3)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = abc.def)
)
)
Соединение можно проверить с помощью команды tnsping MYTNSENTRY в командной строке целевого сервера БД. Tnsnames.ora является локальным. Однако я удалил все изменения в "local" listener.ora, так как слушатель действительно находится на сервере CRM.
Команда SQL в основном не изменилась, но теперь соединение работает:
CREATE PUBLIC DATABASE LINK xxx CONNECT TO some_user IDENTIFIED BY ***** USING 'MYTNSENTRY'
2 ответа
Вы сказали, что SID
является abc
, но в вашем tnsnames.ora
у тебя есть SERVICE_NAME
в CONNECT_DATA
раздел. Они не всегда одно и то же - посмотрите этот вопрос или эту запись Ask Tom. Вы на самом деле не сказали, какую ошибку вы получаете, а просто изменили ее на SID =
может иметь значение.
listener.ora
и действительно слушатель находится на сервере, на котором размещена база данных CRM, а не на том, на котором размещена ваша "целевая" база данных. Как вы можете подключиться из SQL Developer, который, по-видимому, уже настроен. tnsnames.ora
должен быть местным.
Но если вы знаете service_name
для базы данных CRM вы можете пропустить это и использовать синтаксис EZCONNECT, чтобы определить все в ссылке:
CREATE PUBLIC DATABASE LINK xxx
CONNECT TO non-sys IDENTIFIED BY *****
USING '//172.1.2.3:1521/service_name';
Проверьте свою конфигурацию SQL Developer, чтобы увидеть, использует ли она уже имя службы, а не SID, и если нет, то вам нужно ее обнаружить. Если бы у вас был доступ к серверу CRM, вы могли бы использовать lsnrctl
чтобы найти имена сервисов, которые зарегистрированы, но, как вам кажется, вам нужно будет подключиться к базе данных и запустить show parameters service_names
или же select value from v$parameter where name = 'service_names';
,
Вам нужно больше привилегий для создания общедоступной ссылки, чем частной, и общедоступная потенциально менее безопасна, так как она предоставляет вашу базу данных CRM любому, кому вы принадлежите. Так что я сделаю его общедоступным только в случае необходимости, и в любом случае подключусь к учетной записи только для чтения, если вы сможете ее создать.
Также обратите внимание, что если ваша целевая база данных имеет global_names
установлен в true
имя ссылки на базу данных должно соответствовать имени удаленной службы.
Мало того, что вы НЕ должны подключаться как SYS без необходимости, вы НЕ МОЖЕТЕ подключаться как SYS через ссылку на базу данных.