Database
 sql >> Baza danych >  >> RDS >> Database

Jak naprawić ORA-12505, TNS:listener nie zna obecnie identyfikatora SID podanego w deskryptorze połączenia

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak działa model usług PAAS?

  2. SQL AS:użycie, przykłady i najlepsze korzyści

  3. Jak sformatować datę w T-SQL

  4. Instrukcja SQL DROP TABLE i różne przypadki użycia

  5. Jak znaleźć maksymalną wartość kolumny numerycznej w SQL?