Aby poprawnie rozwiązać ten błąd i połączyć się z odpowiednią bazą danych Oracle, musimy wyjaśnić nieco, jak zachowuje się Oracle, a zatem przede wszystkim, co jest przyczyną tego problemu.
SID a SERVICE_NAMES
Ważne jest, aby zrozumieć (niewielką) różnicę między tym, co Oracle definiuje jako SID
w porównaniu z SERVICE_NAME
, ponieważ wykorzystamy te informacje, aby później utworzyć odpowiednie parametry połączenia.
W Oracle identyfikator systemu (lub SID
) to lokalny identyfikator o długości do ośmiu znaków, który służy do identyfikacji konkretnej bazy danych i odróżnienia jej od innych baz danych w systemie.
Często SID
jest słowem prefiksu lub DB_UNIQUE_NAME
który poprzedza DB_DOMAIN
. Na przykład SID
naszej bookstore
baza danych, jak widać w pełnej global database name
z bookstore.company.com
.
SERVICE_NAMES
, z drugiej strony reprezentują nazwy, za pomocą których można łączyć się z instancjami bazy danych. SERVICE_NAME
będzie zwykle zgodny z formatem SID
po której następuje domena bazy danych, na przykład:DB_UNIQUE_NAME.DB_DOMAIN
Odbiornik TNS
Gdy klient próbuje połączyć się z bazą danych Oracle, zamiast połączyć się z bazą danych bezpośrednio , istnieje usługa brokera, która interweniuje i obsługuje żądanie połączenia dla klienta.
Ta aplikacja brokera jest znana jako listener
i wykonuje zadanie słuchania dla przychodzących żądań klientów. Po otrzymaniu żądania listener
przetwarza i przekazuje to żądanie do odpowiedniego serwera bazy danych Oracle za pomocą service handler
, który działa tylko jako połączenie między listener
i serwer bazy danych.
Nazwy i konfiguracja TNS
Podczas łączenia się z bazą danych Oracle, zazwyczaj serwer bazy danych będzie miał tnsnames.ora
, czyli plik konfiguracyjny informujący serwer o NET_SERVICE_NAMES
które są prawidłowymi połączeniami z bazą danych. Domyślnie ten plik znajduje się w ORACLE_HOME/network/admin
.
Na przykład NET_SERVICE_NAME
deskryptor w tnsnames.ora
może być sformatowany w następujący sposób:
myDatabaseNetService =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
(CONNECT_DATA =
(SERVICE_NAME = bookstore.company.com)
)
)
Spowoduje to zdefiniowanie usługi NET_SERVICE_NAME
za pomocą SERVICE_NAME
omówiliśmy wcześniej (bookstore.company.com
) i łączenie się z localhost
przez port 1521
.
Ciąg połączenia
Mając nieco większą wiedzę na temat tego, jak Oracle faktycznie łączy się z bazami danych, możemy teraz przyjrzeć się, jak connection strings
są sformatowane.
Połącz przez nazwę TNS/NET_SERVICE_NAME
Podczas łączenia przez NET_SERVICE_NAME
jak określono w twoim tnsnames.ora
plik konfiguracyjny, musisz użyć username
, password
, a następnie dołącz NET_SERVICE_NAME
z @
symbol, jak na przykład:
username/password@NET_SERVICE_NAME
Dlatego w przypadku naszej poprzedniej usługi NET_SERVICE_NAME
deskryptor powyżej, rzeczywisty NET_SERVICE_NAME
zdefiniowaliśmy jako myDatabaseNetService
, więc nasze parametry połączenia mogą wyglądać mniej więcej tak:
john/Hunter2@myDatabaseNetService
Połącz przez SERVICE_NAME
Podczas łączenia przez SERVICE_NAME
, musisz również dodać host
i port
, wraz z /
symbol poprzedzający SERVICE_NAME
sam:
username/password@host:port/SERVICE_NAME
Połącz przez SID
Wreszcie, jeśli łączysz się bez skonfigurowanej usługi NET_SERVICE_NAME
a nawet SERVICE_NAME
, możesz to zrobić bezpośrednio przez SID
za pomocą :
symbol zamiast /
symbol jak w przypadku SERVICE_NAME
ciąg połączenia:
username/password@host:port:SID