ما هو TNS: المستمع في سياق Oracle؟
-
22-09-2019 - |
سؤال
سؤال ServerFault Borderline ، لكنني أحسب أنني سأحاول هنا أولاً منذ أن حظيت بوسائل الحظ في أسئلة Oracle في الماضي.
أحاول الاتصال بقاعدة بيانات Oracle من PHP ، وأتلقى الخطأ التالي.
ORA-12505: TNS:listener does not currently know of SID given in connect descriptor
هذا هو الخطأ الذي تقاريره PHP ، والخطأ الذي يظهر في مستمع Oracle.
مشكلتي الفورية هي إصلاح هذا الخطأ. السؤال الأكبر الذي أحب الإجابة عليه هو كيف يعمل نموذج Oracle Connection؟
هذا في بيئة تطوير تعمل على جهاز Windows المحلي الخاص بي ويعمل حتى الآن. لسوء الحظ ، تم تسليم البيئة لي (لم أقم بإعدادها) والأشخاص الذين فعلت إعدادها غير متوفرة لمساعدتي في تصحيحها.
إذا كنت أتلقى خطأً مشابهًا مع MySQL أو postgresql (نظامان أكثر دراية بهما) ، فسوف أتحقق من التأكد من أن عملية قاعدة البيانات قيد التشغيل ، ثم أحاول الاتصال يدويًا بقاعدة البيانات باستخدام اسم المستخدم/كلمة المرور/ سلسلة الاتصال. لسوء الحظ ، لست على دراية بأدوات Oracle على Windows (بخلاف SQL Developer) ولا أعرف ما هي TNS: المستمع أو SID في سياق Oracle (لدي أفكار غامضة ، لكن الأفكار الغامضة نادراً ما تساعد عندما أنت تصحيح شيء من هذا القبيل)
أي نصيحة عامة سيكون موضع تقدير.
تحديثات لكل تعليقات:
هناك عدد من المدخلات في ملف tnsnames.ora الخاص بي ، ويجري الإدخال ذي الصلة
OBS2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = steel-ae39650)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = OBS2)
)
)
هذا لا ينعكس في قائمة الحالات عندما أركض
LSNRCTL> services
لذلك أعتقد أن سؤالي التالي هو ، كيف أحاول بدء مثيل OBS2 يدويًا؟
المحلول
اسم TNS يشبه الاسم المستعار لمثيل الخدمة الخاص بك. تعمل خدمة مستمع TNS كنوع من خدمة البحث لك في هذا الصدد. سوف تفشل في رسالة الخطأ هذه إذا كانت الخدمة الفعلية التي تحاول الاتصال بها عبر اسم TNS غير صالحة.
يمكنك بعد ذلك الاختبار لمعرفة ما إذا كان مستمع TNS يرى الخدمة بشكل صحيح باستخدام أداة سطر الأوامر:
%>lsnrctl services
الذي يجب أن يخرج شيئًا مثل ما يلي:
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))
هل يمكنك نشر إدخال TNS ذي الصلة (في tnsnames.ora
ملف)؟ يقع في Orahome Client أو DB Admin Network. إذا كان لديك كل من العميل والخادم ، فتأكد من نسختين من tnsnames.ora
الملف له قيم صحيحة ، فقط لتكون آمنة.
إليك مثال على تعريف اسم TNS المناسب في tnsnames.ora
يسمى "mydb":
myDbAlias =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 12345)(QUEUESIZE = 100))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = myservice)
)
)
نصائح أخرى
أردت فقط أن أضيف إلى هذا ، حيث كان لدي مؤخرًا مشكلة اتصال مماثلة دفعتني إلى الصواب حتى اكتشفت ما كان يحدث.
أولاً ، الكلمات الرئيسية SID و Service_Name ليست هي نفسها تمامًا. كان هذا أول افتراض خاطئ لي. في العديد من البيئات ، يمكنك تبادل SID و Service_Name ، ولكن ليس دائمًا ، يعتمد ذلك.
ومع ذلك ، فإن خطأك يعطي المشكلة: أنت تحدد سيد في سلسلة اتصال بدلاً من اسم الخدمة أن tnsnames تستخدم بنجاح.
لذلك ، إذا كنت تحدد سلسلة الاتصال في الكود الخاص بك ، فحاول استخدام الكلمة الأساسية للخدمة في سلسلة الاتصال (*أو ، إذا كنت تستخدم Service_Name بالفعل ولا يمكنك الاتصال ، فحاول استخدام SID Keyword*).
إجابة مبسطة بشكل مفرط أعرفها ، ولكن من السهل المحاولة وقد تنقذ شخصًا ما بعض الصداع.
امل ان يساعد.
إجابة Mike Atlas شاملة إلى حد ما ، ولكن لاحظ أنه يمكنك الاتصال بـ 10G (أو لاحقًا) DBS التي لا تحتوي على tnsname المنشورة باستخدام [//] host_name [: port] [/service_name
HTH
جيم