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