06-03-2005, 11:30
|
מנהל פורומי "תכנות ובניית אתרים" ו"חומרה ורשתות"
|
|
חבר מתאריך: 25.10.01
הודעות: 42,776
|
|
אולי בכל זאת הבעייה הייתה ברשת :-)
לגבי הודעת השגיאה - אסביר מהו UNIX Socket
ככלל, כל התקשורת במערכות מבוססות יוניקס, פועלת על גבי "socket"-ים. socket הינו מונח כללי המהווה אמצעי תקשורת (ולא משנה באיזו צורה) בין שתי תוכנות או תהליכים. ישנם ה socketים המוכרים, אותם אלה שאנחנו משתמשים בהם כשאנחנו גולשים באינטרנט לדוגמא, או מעבירים קבצים ברשת המקומית, וישנו socket נוסף, שהוא בעצם pipe דו-כיווני, במערכת יוניקס. אם אתה יודע C, אפשר להגיד ש UNIX Socket הוא מעין קובץ שמישהו אחד פותח לקריאה, ומישהו אחר פותח לכתיבה, וכל מה שהאחד כותב, מגיע לזה שקורא. אם שניהם פותחים לקריאה ולכתיבה - ניתן לבצע תקשורת דו כיוונית דרך ה Socket, ללא שימוש ברשת כלל (גם אם לא מוגדר אף IP על המחשב...). לכן ה Socket משמש לתקשורת בין אפליקציות בדרך כלל, כיוון שהוא מהיר מאוד - למעשה - מהיר יותר מכל דבר אחר. אם יש לך אפליקציה שרצה מול מסד נתונים, על אותו המחשב, הכי טוב לבצע את התקשורת דרך Socket, בגלל שאין לו הגבלות מיוחדות כמו שיש ל TCP/IP לדוגמא.
כדי לראות את כל ה Socket-ים שנמצאים כעת במצב האזנה, תוכל להשתמש בפקודה הבאה: כדי לראות את כל ה Socket-ים שמתבצעת דרכם תקשורת כרגע, תוכל להשתמש בפקודה הבאה:
כדי לראות מי משתמש ב Socket מסויים, אפשר להשתמש בכלי lsof (כלי שמציג לך איזה קבצים פתוחים כרגע במערכת, ועל ידי מי, כאשר כל Socket הוא גם "קובץ", אפילו שהוא לא (בגלל שיש לו FD - File Descriptor), ככה שאפשר לראות בדיוק איזה תוכנה מריצה כרגע איזה חיבור לאיזה שרת, וכו' , פשוט תריץ lsof ללא פרמטרים ותבין) על מיקום הקובץ. לדוגמא:
קוד:
# lsof /var/run/mysqld/mysqld.sock
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
mysqld 3153 mysql 4u unix 0xcf2c4940 6481 /var/run/mysqld/mysqld.sock
mysqld 3154 mysql 4u unix 0xcf2c4940 6481 /var/run/mysqld/mysqld.sock
mysqld 3155 mysql 4u unix 0xcf2c4940 6481 /var/run/mysqld/mysqld.sock
mysqld 3156 mysql 4u unix 0xcf2c4940 6481 /var/run/mysqld/mysqld.sock
ועכשיו שהבנו את זה (כך אני מקווה :-)), ניגש להודעה עצמה:
ההודעה אומרת שלקוח ה SQL שאיתו אתה מנסה להתחבר, לא הצליח ליצור קשר עם שרת MySQL דרך קובץ הסוקט שמצויין בהודעת השגיאה. ממה הדבר יכול לנבוע? מכל מיני דברים...
1. ש MySQL כלל לא משתמשת ב Socket, כי ככה הוגדר בקובץ ההגדרות שלה
2. ש MySQL משתמשת ב Socket, אבל מיקום קובץ ה Socket שבו היא משתמשת נמצא במקום אחר במערכת הקבצים, ועל כן כשאתה מנסה לגשת ל Socket אחר שאף תוכנה לא מאזינה לו, אף אחד גם לא יענה
3. שאתה בכלל מנסה להתחבר ממחשב אחר, ואז UNIX Socket הוא דבר לא רלוונטי (כיוון שזהו דבר מקומי בלבד) - ואז זה אומר שפשוט יש בעייה בהגדרה של הלקוח שמתחבר אל השרת, שמנסה להשתמש ב Socket במקום ב IPort שבהם השרת מאזין. כיוון ש Socket אינו באמת קובץ, אלא רק "ממשק" שאליו התוכנה מתחברת, אין לו גודל, כי הוא עצמו אינו מכיל מידע.
פתרונות:
1. לגבי 1 ו 2, צריך לוודא ש MySQL אכן מאזינה ב Socket, ולבדוק מהו ה Socket שבו היא מאזינה. תוכל לעשות זאת על ידי הרצת mysqld --help | grep socket. אם היא לא מאזינה כלל, צריך לוודא בהגדרות שהיא תאזין. אם היא מאזינה במקום אחר, יש לך שתי אפשרויות: או לשנות את הלקוח שלך (עשוי להיות בעייתי אם יש לך הרבה מראי מקומות אל הקישור) או למחוק את ה socket השגוי ולהשתמש ב ln -s כדי לבצע קישור סימבולי אל המיקום האמיתי של הקובץ.
2. לגבי 3 - להגדיר הגדרה נכונה של השרת שאליו מתחברים
מקווה שלא פספסתי שום דבר...
|