2015-04-15 13 views
12

tôi tải sqlplus từ Oracle:lỗi sqlplus: ORA-12.504: TNS: listener đã không được trao SERVICE_NAME trong CONNECT_DATA

http://www.oracle.com/technetwork/topics/winx64soft-089540.html

cơ bản Lite và SQL * Plus

tôi sau đó bắn lên SQL * Plus:

c:\Program Files\Oracle\instantclient_12_1>sqlplus /nolog 

SQL*Plus: Release 12.1.0.2.0 Production on Wed Apr 15 15:25:36 2015 

Copyright (c) 1982, 2014, Oracle. All rights reserved. 

và cố gắng kết nối với một cơ sở dữ liệu:

connect user\[email protected] 

và nhận được thông báo lỗi:

ERROR: 
ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA 

tôi thiếu gì?

Tôi chạy các truy vấn được đề xuất bởi Jakub, tôi đã

SQL> select sys_context('USERENV','SERVICE_NAME') from dual; 

SYS_CONTEXT('USERENV','SERVICE_NAME') 
-------------------------------------------------------------------------------- 

SYS$USERS 

SQL> select sys_context('USERENV','SID') from dual; 

SYS_CONTEXT('USERENV','SID') 
-------------------------------------------------------------------------------- 

877 

SQL> 
+0

Bạn có mục nhập tns được nhập trong tệp tnsnames.Ora không? – anudeepks

+0

Tôi không có tệp tsnames.ora. Tôi đang cố kết nối bằng địa chỉ IP (nên đề cập đến điều đó, xin lỗi!) – gbritton

+0

Cơ sở dữ liệu có nằm trong máy của bạn (cửa sổ) hoặc trên máy chủ không? (có lẽ là linux, aix ....)? – anudeepks

Trả lời

9

Bạn đang thiếu tên dịch vụ:

SQL> connect username/[email protected]:port/SERVICENAME 

EDIT

Nếu bạn có thể kết nối với cơ sở dữ liệu từ máy tính khác thử chạy ở đó:

select sys_context('USERENV','SERVICE_NAME') from dual 

select sys_context('USERENV','SID') from dual 
+0

OK! Bây giờ, làm thế nào để tôi khám phá tên servicename cho một máy chủ oracle tại một địa chỉ IP đã cho? – gbritton

+0

Kiểm tra tệp listener.ora trên máy chủ cơ sở dữ liệu. http://docs.oracle.com/cd/E11882_01/network.112/e10835/listener.htm#NETRF008 –

+0

Tôi không có quyền đăng nhập vào máy chủ, chỉ cần một userid có thể đọc một số bảng tôi cần. Tuy nhiên, tôi có quyền truy cập vào máy chủ có thể đăng nhập bằng bí danh. do đó, kết nối user \ pass @ alias hoạt động OK. Tôi đoán không có cách nào để khám phá tên servic từ một kết nối mở. Bây giờ tôi tự hỏi nếu nó là đủ để sao chép tsnames.ora, listener.ora. sqlnet.ora tập tin vào máy của tôi. Nếu tôi làm thế, tôi sẽ đặt chúng ở đâu? – gbritton

0

Chỉ cần một quan sát nhỏ: bạn tiếp tục nhắc đến conn usr \ vượt qua, và đây là một lỗi đánh máy, phải không? Cos nó phải là conn usr/pass. Hoặc là nó khác nhau trên một hệ điều hành dựa trên Unix?

Hơn nữa, chỉ cần chắc chắn: nếu bạn sử dụng tnsnames, chuỗi đăng nhập của bạn sẽ khác so với khi bạn sử dụng phương pháp đăng nhập bạn đã bắt đầu chủ đề này.

tnsnames.ora phải ở $ ORACLE_HOME $ \ network \ admin. Đó là nhà của Oracle trên máy mà bạn đang cố gắng kết nối, vì vậy trong trường hợp máy tính của bạn. Nếu bạn có nhiều oracle_homes và chỉ muốn sử dụng một tnsnames.ora, bạn có thể đặt biến môi trường tns_admin (ví dụ: đặt TNS_ADMIN = c: \ oracle \ tns) và đặt tnsnames.ora vào thư mục đó.

Phương thức đăng nhập ban đầu của bạn (usr/[email protected]: port/servicename) phải luôn hoạt động. Cho đến nay tôi nghĩ rằng bạn có tất cả các thông tin, ngoại trừ số cổng, mà tôi chắc chắn DBA của bạn sẽ có thể cung cấp cho bạn. Nếu phương thức này vẫn không hoạt động, địa chỉ IP của máy chủ không có sẵn từ máy khách của bạn, hoặc nó là một vấn đề tường lửa (chặn một cổng nhất định), hoặc cái gì khác không (trực tiếp) liên quan đến Oracle hoặc SQL * Plus.

hth! Trân trọng, Remco

+0

Tôi không có oracle được cài đặt trên máy tính của tôi. Tôi chỉ có thực thi sqlplus. Không có gì khác. OTOH Tôi tin rằng tường lửa có thể đang bị cản trở. – gbritton

7

Tôi đã gặp sự cố tương tự chính xác trong các trường hợp giống hệt nhau. Tôi không có file tnsnames.ora, và tôi muốn sử dụng SQL * Plus với định dạng Easy Connection Identifier trong dòng lệnh. Tôi giải quyết vấn đề này như sau.

Các SQL*Plus® User's Guide and Reference đưa ra ví dụ:

sqlplus [email protected]\"sales-server:1521/sales.us.acme.com\"

Chú ý đến hai điểm quan trọng:

  1. Từ định danh kết nối được trích dẫn. Bạn có hai tùy chọn:
    1. Bạn có thể sử dụng lệnh SQL * Plus CONNECT và chỉ cần chuyển chuỗi được trích dẫn.
    2. Nếu bạn muốn chỉ định tham số kết nối trên dòng lệnh, bạn phải thêm dấu gạch chéo ngược làm khiên trước dấu ngoặc kép. Nó hướng dẫn các bash để vượt qua dấu ngoặc kép vào SQL * Plus.
  2. Tên dịch vụ phải được chỉ định trong biểu mẫu FQDN như được cấu hình bởi DBA của bạn.

Tôi đã tìm thấy những câu hỏi hay này để phát hiện tên dịch vụ qua kết nối hiện có: 1, 2. Hãy thử truy vấn này ví dụ:

SELECT value FROM V$SYSTEM_PARAMETER WHERE UPPER(name) = 'SERVICE_NAMES' 
Các vấn đề liên quan