DBI – מקרה שקרה

פורומים אפיון ופיתוח פריוריטי DBI – מקרה שקרה

  • Post
    yoram
    משתתף
    שלום,

    בעבר העלתי כאן פוסט שמדבר על מפתחי פריוריטי שלא תמיד מבינים עד הסוף איך הדברים עובדים מאחורי הקלעים אך מספיק "אמיצים" כדי לבצע פעולות במערכות של לקוחות .

    אז הנה מקרה מאתמול שהחלטתי לשתף אותכם:

    מפתח פריוריטי שהתבקש לבצע DBI לטבלת PART(מק"טים) על מנת להוסיף שדה בולאני למסך כרטיס פריט.
    לכאורה פעולה פשוטה מאוד במערכת שבאמת כל מפתח מתחיל יודע לבצע .
    המפתח ביצע את ה – DBI אך לאחר דקות ארוכות הפרוצדורה שמוסיפה את העמודה לא הסתיימה גם לא לאחר כשעתיים .
    הפעולה בוצעה בשעות אחה"צ אך יש סניפים בחו"ל שעובדים וזה כבר היה זמן ממושך מדיי שהמערכת הייתה מושבתת.
    ככל הנראה הופעל לחץ על המפתח והוא החליט ל"הרוג" את הפרוצדורה של ה – DBI טרם הסתיימה .
    נכנס למחולל טבלאות ראה שהעמודה אכן התווספה , הכניס אותה למסך , ביצע הכנת מסכים מחדש ודיווח על גמר .

    המשמשים נכנסו למערכת המשיכו לעבוד ופתאום התחילו להבחין שהפריטים בקטלוג המוצרים מופיעים בצורה מוזרה וחלק מהמק"טים לא קיימים כלל!!!

    כאן כבר נכנסו ללחץ(מובן) .

    בנקודה הזאת קיבלתי פנייה בערב המאוחר על מנת לבדוק ולסייע .

    כמובן שמהשתלשלות העניינים הבנתי ש"הריגת" הפרוצדורה לפני הסיום שלה דפקה את טבלת PART .

    נדרשנו לשחזר את הטבלה בבסיס הנתונים מהגיבוי האחרון (גם לא בוצע גיבוי נקודתי לרשומות הטבלה רגע לפני ה – DBI) ולכן גם נאבדו מק"טים שהוקמו באותו היום .

    זהו , לאחר ששיחזרנו את הטבלה וביצענו עוד מספר פעולות הלקוח לאחר שהפסיד מספר שעות לא בוטל כתוצאה ממערכת מושבתת שב לעבוד במערכת .

    החלטתי לשתף אותכם על מנת שתשימו לב ותיקחו אחריות אם אתם מפתחים על מערכות של לקוחות שלכם .

    יום טוב לכולנו.

מוצגות 10 תגובות – 1 עד 10 (מתוך 10 סה״כ)
  • Replies
    snoof123
    משתתף
    היי יהורם,
    שאלה: מה אתה היית עושה במצב שבו אתה מנסה להוסיף עמודה לטבלה כמו PART ועברו שעתיים והתכנית לא סיימה.

    כיצד היית מטפל במקרה כזה? 🙂 (ברוח חיובית כמובן, אבל חסר לי בהודעה הזו הפיתרון של המפתח עם הניסיון).

    PriorityDev
    משתתף
    IL
    snoof123 כתב:

    היי יהורם,
    שאלה: מה אתה היית עושה במצב שבו אתה מנסה להוסיף עמודה לטבלה כמו PART ועברו שעתיים והתכנית לא סיימה.

    כיצד היית מטפל במקרה כזה? 🙂 (ברוח חיובית כמובן, אבל חסר לי בהודעה הזו הפיתרון של המפתח עם הניסיון).

    לא משנה אם ברוח החיובית או השלילית, לא אמורים להגיע לכזה מצב כי:
    1. מגבים את הטבלה בכל החברות לפני ה-DBI.
    2. מוציאים את כל המשתמשים מהמערכת (אפשר לפתח תוכנית כזאת).
    3. במקרה של טבלאות גדולות וחשובות כמו PART חושבים 10 פעמים לפני שמחליטים להוסיף שדה בטבלה עצמה (ואז עושים במשנה זהירות).
    אבל בדרך כלל מוסיפים טבלת המשך (כמובן שכאן צריך לפתח את כל הטריגרים הדרושים).

    4. ואם בכל זאת כזה דבר קרה – פונה ל-DBA שאני עובד איתו וסומך עליו, ובטח לא הורג כזה תהליך באמצע, בטח לא על טבלת PART וטבלאות חשובות אחרות.
    ואם הלקוח מאוד מתעקש, אפשר להחתים אותו על מסמך שמעביר אליו את האחריות.
    כמובן שלחברת יישום רצינית צריך להיות מסמך כזה מוכן המנוסך ע"י עו"ד.

    5. ואם בכל זאת נאלצתי להרוג את התהליך, לא מקמפלים והולכים הביתה, אלא בודקים מול לקוח תקינות נתונים.
    בדיקה מינימלית – מספר רשומות לפני ואחרי.
    ואז משחזרים את הנתונים ולא מחכים לצרחות מהלקוח.

    yoram
    משתתף
    היי,

    יש סט שלם של פעולות שניתן לעשות לפני שהורגים את התוכנית (שזה המקרה הגרוע ביותר והפתרון האחרון שבאחרונים!!!), לא ארחיב בזה אבל מספר נקודות שכן כדאי לדעת :

    1. כאשר מבצעים DBI שכזה מאחורי הקלעים הבסיס נתונים "מעתיק" הצידה את כל רשומות הטבלה , מבצע את השינוי בטבלה ומחזיר את הרשומות חזרה (זה בצורה מפושטת ).
    2. יש חשיבות לכמות הרשומות שיש בטבלה – ואכן במקרה הזה היו בטבלה ס"ג של 80K רשומות ולכן גם זה השפיע על הזמן הנדרש .
    3. כניסה לבסיס נתונים עצמו דרך ה – SQL MANAGMENT הראתה שהתהליך עדיין רץ ושיש DEADLOCK על הטבלה מאחר ומישהו באותו זמן גם ניסה לבצע גישה נוספת לטבלה במקביל (שחרור ה – DEADLOCK יכל לפתור כמעט בוודאות את הבעיה) .
    4. לוודא שכלל המשתמשים באמת מחוץ למערכת – ולא מבצעים פעולות שיכולות לשבש את ה – DBI .
    5. גיבוי נקודותי לטבלה ממש לפני ביצוע (לא מדובר בגיבוי השעתי/היומי) .

    אפשר להרחיב עוד הרבה בנושא אבל באמת זה אך ורק ממקום של לקיחת אחריות והבנה שגם אם עושים דברים "פשוטים" דרך המחוללים של הפריוריטי צריך לפעמים להבין קצת את המעבר למה שקורה מאחורה בבסיס נתונים למקרה ויש מקרים לא צפויים .

    yoram
    משתתף
    michaelm כתב:

    snoof123 כתב:
    [quote]היי יהורם,
    שאלה: מה אתה היית עושה במצב שבו אתה מנסה להוסיף עמודה לטבלה כמו PART ועברו שעתיים והתכנית לא סיימה.

    כיצד היית מטפל במקרה כזה? 🙂 (ברוח חיובית כמובן, אבל חסר לי בהודעה הזו הפיתרון של המפתח עם הניסיון).

    לא משנה אם ברוח החיובית או השלילית, לא אמורים להגיע לכזה מצב כי:
    1. מגבים את הטבלה בכל החברות לפני ה-DBI.
    2. מוציאים את כל המשתמשים מהמערכת (אפשר לפתח תוכנית כזאת).
    3. במקרה של טבלאות גדולות וחשובות כמו PART חושבים 10 פעמים לפני שמחליטים להוסיף שדה בטבלה עצמה (ואז עושים במשנה זהירות).
    אבל בדרך כלל מוסיפים טבלת המשך (כמובן שכאן צריך לפתח את כל הטריגרים הדרושים).

    4. ואם בכל זאת כזה דבר קרה – פונה ל-DBA שאני עובד איתו וסומך עליו, ובטח לא הורג כזה תהליך באמצע, בטח לא על טבלת PART וטבלאות חשובות אחרות.
    ואם הלקוח מאוד מתעקש, אפשר להחתים אותו על מסמך שמעביר אליו את האחריות.
    כמובן שלחברת יישום רצינית צריך להיות מסמך כזה מוכן המנוסך ע"י עו"ד.

    5. ואם בכל זאת נאלצתי להרוג את התהליך, לא מקמפלים והולכים הביתה, אלא בודקים מול לקוח תקינות נתונים.
    בדיקה מינימלית – מספר רשומות לפני ואחרי.
    ואז משחזרים את הנתונים ולא מחכים לצרחות מהלקוח.[/quote]

    חד משמעית!!!

    roni
    משתתף
    michaelm כתב:
    [
    2. מוציאים את כל המשתמשים מהמערכת (אפשר לפתח תוכנית כזאת).
    ——————————————————
    איך אפשר לפתח תוכנית כזו ?
    טבלת משתמשים פעילים לא מראה משתמשים בווב.
    ואם משתמש לא יצא באופן מסודר מהדפדפן לא נרשמת יציאה במסך המתאים
    תודה
    רוני
    PriorityDev
    משתתף
    IL
    roni1 כתב:

    איך אפשר לפתח תוכנית כזו ?
    טבלת משתמשים פעילים לא מראה משתמשים בווב.
    ואם משתמש לא יצא באופן מסודר מהדפדפן לא נרשמת יציאה במסך המתאים

    הניתוק הוא ברמת ה-DB וע"י DISABLE של גישת משתמשים ב-DB (בד"כ זה MSSQL אבל אפשר לעשות זאת גם ב-ORACLE).
    אפשר לבנות StoredProcerure ב-DB ולהפעיל אותה ישירות.
    או לכתוב תוכנית בפריוריטי שיוצרת קובץ עם קוד TSQL ומריצה אותו.
    לא חושב שב-Web זה שונה.

    yitzchok
    משתתף
    IL
    צריכים לא רק להוציא משתמשים אלא לדאוג שלא יוכלו לחזור ולהמשיך לעבוד.

    לכן תוכנה שמנתקת משתמשים בלבד לדעתי לא מספיק.

    איך מונעים שימוש יהיה תלוי בפרטי הסביבה והעדפות אישיות.

      [ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]
    PriorityDev
    משתתף
    IL
    yitzchok כתב:

    צריכים לא רק להוציא משתמשים אלא לדאוג שלא יוכלו לחזור ולהמשיך לעבוד.
    לכן תוכנה שמנתקת משתמשים בלבד לדעתי לא מספיק.

    כן, ברור, זה מה שהתכוונתי.

    איילת
    משתתף
    היי יורם,

    למיטב ידיעתי העניין הזה עם DBI ו-הבעיות שהוא עושה בעת הוספת עמודה לטבלה זה משהו שהחל מאזור גרסה 16 השתנה, וכבר אין את הסכנה שהפסקת הפעולה באמצע תדפוק את הטבלה. זאת גם הסיבה שעד גרסה 16 היה צריך לצאת ולהיכנס למערכת מחדש אחרי DBI, ומגרסה 16 כבר לא.
    האם זה נכון? האם זה קשור גם לסוג הDB של הלקוח (SQL, אורקל…)?

    אשמח להארות בנושא, גם כדי להדריך מתכנתים שאני בקשר איתם.

    snoof123
    משתתף
    היי,
    אני לא חושב שזה קשור לגירסאות, זו בעיה מסוג אחר.
    הסיבה שהDBI שלהם נתקע היא שמישהו אחר ניגש לטבלה במקביל ואז נוצרה תקיעה.
    מה שצריך לעשות זה לאתר את התהליכים שנוגעים בטבלה ולהרוג אותם במקום את התהליך של הDBI שהמפתח הרג בפועל במקרה שתואר למעלה.
מוצגות 10 תגובות – 1 עד 10 (מתוך 10 סה״כ)
  • יש להתחבר למערכת על מנת להגיב.