Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Cách khắc phục ORA-12505, TNS:người nghe hiện không biết về SID được cung cấp trong bộ mô tả kết nối

Để giải quyết đúng cách lỗi này và kết nối với cơ sở dữ liệu Oracle thích hợp, chúng tôi sẽ cần giải thích một chút về cách Oracle hoạt động và do đó, điều gì đang gây ra sự cố này ngay từ đầu.

SID so với SERVICE_NAMES

Điều quan trọng là phải hiểu sự khác biệt (nhỏ) giữa những gì Oracle định nghĩa là SID so với SERVICE_NAME , vì chúng tôi sẽ sử dụng thông tin này để tạo một chuỗi kết nối thích hợp sau này.

Trong Oracle, mã định danh hệ thống (hoặc SID ) là số nhận dạng cục bộ có độ dài tối đa tám ký tự được sử dụng để xác định một cơ sở dữ liệu cụ thể và phân biệt nó với các cơ sở dữ liệu khác trên hệ thống.

Thường là SID là từ tiền tố hoặc DB_UNIQUE_NAME đứng trước DB_DOMAIN . Ví dụ:SID của bookstore của chúng tôi cơ sở dữ liệu, như được thấy trong global database name đầy đủ của bookstore.company.com .

SERVICE_NAMES mặt khác, đại diện cho các tên mà các cá thể cơ sở dữ liệu có thể được kết nối với. SERVICE_NAME thường sẽ tuân theo định dạng của SID theo sau là miền cơ sở dữ liệu, như sau:DB_UNIQUE_NAME.DB_DOMAIN

Trình nghe TNS

Khi một khách hàng đang cố gắng kết nối với cơ sở dữ liệu Oracle, thay vì kết nối với cơ sở dữ liệu trực tiếp , có một dịch vụ môi giới can thiệp và xử lý yêu cầu kết nối cho khách hàng.

Ứng dụng môi giới này được gọi là listener và nó thực hiện nhiệm vụ lắng nghe cho các yêu cầu của khách hàng đến. Khi nhận được yêu cầu, listener xử lý và chuyển tiếp yêu cầu đó đến máy chủ cơ sở dữ liệu Oracle thích hợp bằng cách sử dụng service handler , chỉ hoạt động như kết nối giữa listener và máy chủ cơ sở dữ liệu.

Tên và Cấu hình TNS

Khi kết nối với cơ sở dữ liệu Oracle, thông thường máy chủ cơ sở dữ liệu của bạn sẽ có tnsnames.ora , là tệp cấu hình thông báo cho máy chủ về NET_SERVICE_NAMES là các kết nối cơ sở dữ liệu hợp lệ. Theo mặc định, tệp này được đặt tại ORACLE_HOME/network/admin .

Ví dụ:một NET_SERVICE_NAME bộ mô tả trong tnsnames.ora có thể được định dạng như thế này:

myDatabaseNetService =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
    (CONNECT_DATA =
      (SERVICE_NAME = bookstore.company.com)
    )
  )

Điều này sẽ xác định một NET_SERVICE_NAME sử dụng SERVICE_NAME chúng ta đã thảo luận trước đó (bookstore.company.com ) và kết nối với localhost thông qua cổng 1521 .

Chuỗi kết nối

Với một chút kiến ​​thức hơn về cách Oracle thực sự kết nối với cơ sở dữ liệu, bây giờ chúng ta có thể xem cách connection strings được định dạng.

Kết nối qua TNS Name / NET_SERVICE_NAME

Khi kết nối qua NET_SERVICE_NAME như được chỉ định trong tnsnames.ora của bạn tệp cấu hình, bạn phải sử dụng username , password , rồi nối NET_SERVICE_NAME với @ biểu tượng, như vậy:

username/password@NET_SERVICE_NAME

Do đó, đối với NET_SERVICE_NAME trước đây của chúng tôi bộ mô tả ở trên, NET_SERVICE_NAME thực tế chúng tôi đã xác định là myDatabaseNetService , vì vậy chuỗi kết nối của chúng tôi có thể trông giống như sau:

john/Hunter2@myDatabaseNetService

Kết nối qua SERVICE_NAME

Khi kết nối qua SERVICE_NAME , bạn cũng sẽ cần thêm hostport , cùng với / ký hiệu đứng trước SERVICE_NAME chính nó:

username/password@host:port/SERVICE_NAME

Kết nối qua SID

Cuối cùng, nếu kết nối mà không có NET_SERVICE_NAME được định cấu hình hoặc thậm chí SERVICE_NAME , bạn có thể làm như vậy trực tiếp thông qua SID bằng cách sử dụng : thay vì / ký hiệu như với SERVICE_NAME chuỗi kết nối:

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. Toán tử so sánh là gì?

  2. Tầm quan trọng của việc chọn kích thước máy ảo Azure thích hợp

  3. Cơ sở dữ liệu chuỗi thời gian là gì?

  4. Cách tạo dạng xem trong SQL

  5. Toán tử chuỗi “+” có đơn giản như vậy không?