سؤال

سؤال 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

جيم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top