2010-01-25 147 views
8

Câu hỏi về Borderline ServerFault, nhưng tôi đã thử nghiệm ở đây trước tiên vì tôi đã có may mắn với các câu hỏi của Oracle trong quá khứ.TNS: người nghe trong ngữ cảnh của Oracle là gì?

Tôi đang cố gắng kết nối với cơ sở dữ liệu oracle từ PHP và tôi nhận được lỗi sau.

ORA-12505: TNS:listener does not currently know of SID given in connect descriptor 

Đây là lỗi mà PHP báo cáo và lỗi xuất hiện trong listener.log của Oracle.

Vấn đề trước mắt của tôi là khắc phục lỗi này. Câu hỏi lớn hơn tôi muốn trả lời là mô hình kết nối Oracle hoạt động như thế nào?

Đây là môi trường phát triển đang chạy trên máy cửa sổ cục bộ của tôi và đã hoạt động cho đến bây giờ. Thật không may, môi trường đã được trao cho tôi (tôi đã không thiết lập nó) và những người đã thiết lập nó không có sẵn để giúp tôi gỡ lỗi nó.

Nếu tôi gặp lỗi tương tự với MySQL hoặc PostgreSQL (hai hệ thống quen thuộc hơn), tôi sẽ kiểm tra để đảm bảo rằng quy trình cơ sở dữ liệu đang chạy và sau đó cố kết nối thủ công với cơ sở dữ liệu bằng chuỗi tên người dùng/mật khẩu/kết nối. Thật không may, tôi không quen thuộc với các công cụ Oracle trên windows (ngoài SQL Developer) và tôi không biết TNS: listener hoặc SID là gì trong ngữ cảnh của Oracle (tôi có ý tưởng mơ hồ, nhưng ý tưởng mơ hồ hiếm khi giúp ích khi bạn đang gỡ lỗi một cái gì đó như thế này)

Bất kỳ lời khuyên chung nào sẽ được đánh giá cao.

cập nhật mỗi Bình luận:

Có một số entires trong file tnsnames.ora của tôi, mục liên quan là

OBS2 = 
    (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = steel-ae39650)(PORT = 1521)) 
    (CONNECT_DATA = 
     (SERVER = DEDICATED) 
     (SERVICE_NAME = OBS2) 
    ) 
) 

này không được phản ánh trong danh sách các trường hợp khi tôi chạy

LSNRCTL> services 

Vì vậy, tôi nghĩ câu hỏi tiếp theo của tôi là, làm thế nào để tôi cố gắng khởi động bản sao OBS2 theo cách thủ công?

+1

Mục nhập TNS là một phần của chuỗi kết nối với Oracle. –

Trả lời

7

Tên TNS giống như một bí danh cho cá thể dịch vụ của bạn. Dịch vụ nghe TNS hoạt động như một loại dịch vụ tra cứu cho bạn trong lĩnh vực này. Nó sẽ thất bại với thông báo lỗi đó nếu dịch vụ thực tế bạn đang cố gắng kết nối với thông qua một tên TNS không hợp lệ.

Sau đó bạn có thể kiểm tra để xem nếu người nghe TNS thấy dịch vụ một cách chính xác bằng cách sử dụng công cụ dòng lệnh:

%>lsnrctl services 

nào nên đầu ra giống như sau:

Service "myservice" has 1 instance(s). 
    Instance "myinstance", status READY, has 1 handler(s) for this service... 
    Handler(s): 
     "D000" established:0 refused:0 current:0 max:1002 state:ready 
     DISPATCHER <machine: LOCALHOST, pid: 12345> 
     (ADDRESS=(PROTOCOL=tcp)(HOST=LOCALHOST)(PORT=6789)) 

Can bạn vui lòng đăng mục TNS có liên quan (trong tệp tnsnames.ora)? Nó nằm trong ORAHOME \ client hoặc db \ ADMIN \ NETWORK. Nếu bạn có cả máy khách và máy chủ, hãy đảm bảo cả hai bản sao của tệp tnsnames.ora đều có giá trị chính xác, chỉ để an toàn.

Dưới đây là một ví dụ về một TNS định nghĩa tên riêng trong tnsnames.ora gọi là 'mydb':

myDbAlias = 
    (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 12345)(QUEUESIZE = 100)) 
    (CONNECT_DATA = 
     (SERVER = DEDICATED) 
     (SERVICE_NAME = myservice) 
    ) 
) 
+1

Đã cập nhật câu hỏi với thông tin có liên quan. Có vẻ như mục nhập TNS liên quan không được phản ánh trong trình nghe. Có cách nào để tự khởi động một cá thể TNS? Cũng có thể có liên quan; Nếu tôi sử dụng dbca và cố gắng "Confgiure Database Options" cho cơ sở dữ liệu/lược đồ (đúng hạn?) Trong câu hỏi, tôi nhận được lỗi sau: ORA-02778: Tên cho thư mục log không hợp lệ. Tôi đã giải quyết vấn đề của mình bằng cách tạo một cơ sở dữ liệu mới và nhập một kết xuất gần đây, nhưng tôi vẫn muốn quan tâm đến bất kỳ kỹ thuật gỡ lỗi nào cho loại điều này. –

+0

Bạn đã nói rằng bạn đang sử dụng Windows, vì vậy bạn có thể xem liệu dịch vụ có đang chạy trong các dịch vụ Windows snap trong component hay không. Bắt đầu-> Công cụ quản trị-> Dịch vụ. Nhìn xem nếu OracleServiceOBS2 (tôi đoán tên đó, nó có thể khác nhau). Sau đó bắt đầu từ đó. Dịch vụ người nghe TNS của bạn cũng ở ngay đó, được đặt tên giống như OracleOraDb10g_home_1TNSListener. –

+1

Vì vậy, tôi nghĩ những gì gây nhầm lẫn cho tôi ở đây là làm thế nào có thể một cơ sở dữ liệu oracle lên, nhưng người khác không thể. Đó là, khi tôi liệt kê các dịch vụ tôi thấy các cơ sở dữ liệu khác (OBS3, OBS4, vv) đã được lên. Tất cả các cơ sở dữ liệu được kiểm soát bởi OracleServiceOBS2, hay mỗi cơ sở dữ liệu có được OracleServiceOBS2 của riêng nó? (xin lỗi nếu điều này là không có ý nghĩa, bu Tôi không biết những gì tôi không biết ở đây!) –

1

Mike Atlas' Câu trả lời là khá toàn diện, nhưng lưu ý rằng bạn có thể kết nối với 10g (hoặc mới hơn) DBS mà don 't có một tnsname xuất bản sử dụng [//] host_name [: port] [/ service_name]

HTH

C.

2

Chỉ muốn thêm t o này, như tôi gần đây đã có một vấn đề kết nối tương tự mà lái xe cho tôi hạt cho đến khi tôi tìm ra những gì đang xảy ra.

Trước tiên, từ khóa SID và SERVICE_NAME không giống hệt nhau. Đây là giả định sai lầm đầu tiên của tôi. Trong nhiều môi trường, bạn có thể trao đổi SID và SERVICE_NAME, nhưng không phải lúc nào, nó phụ thuộc.

Điều đó nói rằng, lỗi của bạn cho đi những vấn đề: bạn đang xác định SID trong một chuỗi kết nối thay vì SERVICE_NAME rằng TNSNAMES thành công sử dụng. Vì vậy, nếu bạn chỉ định chuỗi kết nối trong mã của mình, hãy thử sử dụng từ khóa SERVICE_NAME trong chuỗi kết nối (* hoặc nếu bạn đã sử dụng SERVICE_NAME và không thể kết nối, hãy thử sử dụng từ khóa SID *).

Câu trả lời quá đơn giản mà tôi biết, nhưng dễ dàng để thử và có thể cứu một số người đau đầu.

Hy vọng điều đó sẽ hữu ích.

+0

+1 sau tất cả những năm này vì UGH, Oracle. –

Các vấn đề liên quan