הקדמה
לא מעט פעמים אני מגיע לאירגונים ונתקל בחוסר ידע לגבי ה- Listener ואיך הוא וה- Instance מתקשרים.
משום מה, גם DBA-ים מנוסים לא תמיד מבינים לגמרי את הנושא הזה, למרות שהוא לא מסובך. בעקבות סיבות אלו החלטתי לכתוב מאמר זה על מנת להסביר איך הדברים עובדים.
Registration? למה בכלל צריך את זה?
באורקל קיים רכיב שתפקידו לקבל בקשות התחברות מהרשת ולהעביר אותן הלאה ל- instance. זהו כמובן ה- listener שכולנו מכירים. כדי לעשות את תפקידו, ה- listener צריך להכיר את ה-instance-ים שאותם הוא משרת. המידע שחשוב ל-listener הוא ה-SID וה-ORACLE_HOME.
בעזרת מידע זה הוא יכול להפנות משתמשים אל ה-instance וליצור server process במידת הצורך. הרישום של ה-instance ב-listener נקרא registration.
במידה וה- listener לא מכיר את הפרטים על ה-instance, בעת נסיון התחברות נקבל שגיאה:
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
קיימות שתי דרכים לבצע את ה- registration, הדרך הישנה יותר (שעדיין אפשר להשתמש בה ויש לה אפילו יתרון אחד על הדרך השניה) היא ה- static registration. הדרך החדשה (חדשה יחסית, היא קיימת לפחות מ- Oracle 8i) נקראת dynamic registration.
Static registration
בשיטה זו אנחנו מגדירים בצורה ידנית ל-listener מי הם ה-instance-ים שאותם הוא מכיר. את הרישום הסטטי עושים בקובץ listener.ora שנמצא תחת ORACLE_HOME/network/admin.
לקובץ הזה שני חלקים, האחד מתחיל בשם ה-listener ובו מידע על הכתובות שלהן ה-listener מאזין, והשני מתחיל ב- SID_LIST_
דוגמא:
LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = 1521)) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (ORACLE_HOME = C:\oracle\product\10.2.0\db_1) (SID_NAME = db10) ) )
כאן אנו רואים שקיים listener אחד שמאזין על הכתובות שמשויכות לשרת server בפורט 1521.
ה-listener מכיר (בצורה סטטית) instance בשם db10 שה- ORACLE_HOME שלו הוא C:\oracle\product\10.2.0\db_1.
Dynamic registration
בשיטה זו, instance-ים שרצים על המכונה מבצעים את ה-registration לבד, ללא הגדרה בקובץ listener.ora. ה-process שמבצע את ה-Dynamic registration הוא PMON.
הוא פונה אל ה-listener ומעדכן אותו לגבי שם ה-instance, מה מיקום ה-ORACLE_HOME שלו והסטטוס שלו.
כברירת מחדל, PMON פונה ל-listener שנמצא על השרת המקומי (כלומר, השרת שמריץ את ה- instance) בפורט 1521 ונרשם אצלו.
במידה ואנחנו רוצים שה-instance יירשם דינאמית ב-listener עם פרטים אחרים (למשל פורט אחר), נצטרך לשנות את הפרמטר LOCAL_LISTENER ב- init.ora או spfile. ערך הפרמטר צריך להיות הפניה ל- listener באחת משתי הצורות:
– השם המלא, למשל:(ADDRESS=(PROTOCOL=TCP)(HOST=
hostname)(PORT=1530))
– הפניה לשם ב- tnsnames, למשל: listener_1530 כאשר יש כניסה ב- tnsnames.ora שנקראת listener_1530 ומפנה ל- listener הרצוי
את הפרמטר ניתן לשנות בצורה דינאמית על ידי alter system ו- PMON ימחק את הרישום מה- listener הישן ויירשם ב- listener החדש.
מתי צריך לשנות את ה- dynamic registration?
שני מקרים נפוצים הם:
- שינינו את הפורט של ה-listener כחלק מהקשחה או סיבה אחרת.
- אנחנו רוצים מספר listener-ים על השרת וצריך לקבוע איזה listener יחבר משתמשים לאיזה instance. ניתן להגדיר static registration כדי לפתור את זה, אבל כל ה- instance-ים יירשמו ב- listener שרץ על 1521 (במידה ויש כזה) אלא אם נשנה להם את ה- dynamic registration.
יתרונות וחסרונות של כל שיטה
בעיקרון, שתי השיטות פשוטות ליישום ועובדות מצוין. יחד עם זאת יש הבדלים:
- ב-dynamic registration, ה-PMON הוא זה שמבצע את הרישום. לכן, אם ה-instance למטה לא יתבצע רישום, מעבר לכך, כאשר ה-instance נמצא במצב Nomount, ה-listener יחסום גישות אליו ולא ניתן יהיה להתחבר מהרשת. אם אנחנו רוצים את היכולת להתחבר דרך ה-listener כאשר ה-instance למטה (כדי להעלות אותו) או כאשר הוא ב-Nomount, אנחנו צריכים להגדיר static registration ב- listener.ora.
- ב-dynamic registration, מכיוון ש-PMON מבצע את הרישום והוא עושה זאת בצורה קבועה, יש אפשרות להעביר עוד מידע ל-listener כגון עומס. זה לא רלוונטי ל-instance עצמאי, אבל ב- RAC זה מידע מאד חשוב שמאפשר ל-listener להפנות חיבורים לשרת שפחות עמוס. כמובן שב- static registration אין רישום על ידי PMON ולכן אין דרך להעביר את המידע הזה ל-listener.
- נושא ה- service-ים (שכאמור, נדבר עליו בעתיד), נתמך רק ב- dynamic registration.
סיכום
ישנן שתי שיטות לרשום instance-ים ב-listener, static registration ו- dynamic registration. ניתן לעבוד עם כל אחת מהשיטות בנפרד או לשלב בין השתיים.
חשוב לזכור שעל מנת לעבוד עם static registration יש לערוך את ה- listener.ora ולתחזק אותו, ועל מנת לעבוד עם dynamic registration יש לשנות את הפרמטר LOCAL_LISTENER. דבר נוסף הוא ה- default של dynamic registration – להירשם ב- listener על השרת המקומי שמאזין לפורט 1521.
לפרטים נוספים על Static Registration:
http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/listenercfg.htm#i454085
לפרטים נוספים על Dynamic Registration:
http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/listenercfg.htm#i490264
מקווה שנהניתם.
נתראה ברשומה הבאה !
לירון אמיצי.
ניתן ליצור קשר עם לירון דרך עמוד האודות שלו: אודות
Latest posts by לירון אמיצי (see all)
- ה-SQL Performance Analyzer ב-Real Application Testing - 18/12/2014
- עד כמה דינאמי יכול להיות SQL דינאמי? - 02/10/2014
- מבוא ל- Real Application Testing - 23/07/2014
2 תגובות ל- “Listener registration”
Another case where modifying LOCAL_LISTENER might be required is when the connection is made via a VIP, while the PMON is attempting to register with the physical IP.
Note: entering mixed Hebrew and English in the comments is a nightmare…
Hi Alex,
Thanks for you comment, indeed dynamic registration is very important in RAC environment. However, this post was meant to cover the idea of static and dynamic registration in standard environments and not RAC environments.
I might write a note on registration in RAC environments in the future.
Liron
השאר תגובה: