none
תופעה מוזרה בהכנת רשומה ל sql server 2012 בעזרת c# - סבב ב' RRS feed

  • שאלה

  • שלום לכולם,

    בהמשך לבעיה שהיתה לי לפני כחודש

    (ראו כאן) http://social.technet.microsoft.com/Forums/he-IL/sqlhe/thread/d359968c-fd2b-40b8-b192-b0ecc36a4f36

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

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

    מתחזקת בי ההשערה כי זה קשור לשדרוג ל SQL SERVER 2012 כי ב-SQL SERVER 2008 עבדו עם אותן הטבלה שכעת בה מופיעה הבעיה, אותן פרוצדורות ואותה אפליקציה למשך יותר משנה ומעולם לא היה דבר כזה.

    על מנת שנתקדם, אילו פרטים תרצו שאעלה לכאן?

    שוב אזכיר כי איני איש DB אלה מתכנת ולכן הידע שלי בכל הנושא מוגבל (מלבד כתיבת שאילתות ועבודה מול ה-VISUAL STUDIO) ולכן אם צריך להביא מידע שמצריך קצת יותר ידע אשמח אם תתנו לי הכוונה

    מאיפה לקחת אותו.

    נ.ב, מישהו תיאר כאן בעיה זהה לחלוטין במסד נתונים מבוסס ORACLE

    http://www.oraclesolved.com/general/Q_25470653-Sequence-jump-by-1-000-one-time.jsp

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

    תודה ושבת שלום

    אופיר

    יום שישי 08 יוני 2012 13:20

תשובות

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

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

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

    כרגע אין מה להוסיף לשרשור הקודם. יותר מדי אפשרויות יש...

    * הערה: בגרסאות SQL לפני 2012 לא היה בכלל Sequence.
    באורקל אין בכלל IDENTITY אלא רק Sequence לזכרוני
    בגרסה 2012 נכנסה היכולת לעבוד עם Sequence בנוסף ליכולת לעבוד עם IDENTITY
    לכן לא הייתי פונה לפורום של אורקל בנושא של IDENTITY

    * הערה: אין לך טעם לבצע רישום לאתר כי הוא דורש מספר כרטיס אשראי גם לרישום ל20 יום חינם (בדקתי כרגע)

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

    * הערה: האם אתה מנסה לעבוד עם Sequence במקרה וכתבת IDENTITY בטעות?
    Sequence הוא אלמנט כללי ולא מחובר לטבלה מסויימת בהכרח ולכן הוא הרבה יותר גמיש לטוב (היכולת לעבוד בלי תלות בטבלה) ולרע (יכול להיות מושפע מהרבה יותר גורמים)


    signature

    • סומן כתשובה על-ידי ofir_bl יום שישי 08 יוני 2012 18:19
    יום שישי 08 יוני 2012 18:11
    מנחה דיון
  • טוב, מיהרתי לשמוח. הצרה חזרה. שוב יש לי את הבעיה הזו.

    נראה שבכל זאת זה באג,

    מסתבר שהקפיצה נעשית ב-sql server 2012 כאשר מתבצע restart  ל-service שלו, אני רואה עוד דיווחים באינטרנט לגבי זה

    דיון שמצאתי לגבי זה נמצא בלינק הבא ומסביר את הגודל של הקפיצות:

    https://connect.microsoft.com/SQLServer/feedback/details/739013/alwayson-failover-results-in-reseed-of-identity

    מצאתי פתרון שהוצע ולהלן הוא:

    Enable "scan for startup procs configuration.
    In Master add one or more stored procs as required to reseed each table based on the code here.

    create proc FixIdent_DBName_Table
    as
    begin
    declare @MAX int
    select @MAX = max(Identity_Col) from DBName.dbo.Table
    DBCC CHECKIDENT([DBName.dbo.Table],RESEED,@MAX)
    end

    sp_procoption @ProcName = 'FixIdent_DBName_Table' 
        , @OptionName = 'startup' 
        , @OptionValue = 'true' 

    After the restart the seed will be reset correctly.

    Leo Miller
    Senior DBA Consultent
    SQL Services Limited
    New Zealand

    אנסה זאת ואעדכן

    פתרון מעצבן אבל זה מה שיש כרגע...


    • נערך על-ידי ofir_bl יום חמישי 21 יוני 2012 18:12
    • סומן כתשובה על-ידי pituachMVP, Editor יום חמישי 21 יוני 2012 18:45
    יום חמישי 21 יוני 2012 17:57

כל התגובות

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

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

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

    כרגע אין מה להוסיף לשרשור הקודם. יותר מדי אפשרויות יש...

    * הערה: בגרסאות SQL לפני 2012 לא היה בכלל Sequence.
    באורקל אין בכלל IDENTITY אלא רק Sequence לזכרוני
    בגרסה 2012 נכנסה היכולת לעבוד עם Sequence בנוסף ליכולת לעבוד עם IDENTITY
    לכן לא הייתי פונה לפורום של אורקל בנושא של IDENTITY

    * הערה: אין לך טעם לבצע רישום לאתר כי הוא דורש מספר כרטיס אשראי גם לרישום ל20 יום חינם (בדקתי כרגע)

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

    * הערה: האם אתה מנסה לעבוד עם Sequence במקרה וכתבת IDENTITY בטעות?
    Sequence הוא אלמנט כללי ולא מחובר לטבלה מסויימת בהכרח ולכן הוא הרבה יותר גמיש לטוב (היכולת לעבוד בלי תלות בטבלה) ולרע (יכול להיות מושפע מהרבה יותר גורמים)


    signature

    • סומן כתשובה על-ידי ofir_bl יום שישי 08 יוני 2012 18:19
    יום שישי 08 יוני 2012 18:11
    מנחה דיון
  • אני עובד עם Identity ולא עם sequence.

    אעבור על האשכול הקודם שוב, אעשה כל מה שהציעו לי ואעדכן כאן אם הבעיה תחזור (בתקווה שזה לא יקרה).

    שוב תודה,

    אופיר

    יום שישי 08 יוני 2012 18:19
  • עדכון אחרון!!! (טפו טפו)

    לפי הנראה הבעיה נפתרה,

    רציתי לעדכן כאן בהמשך ההתקדמות תוך תמצית קצרה של הבעיה (למי שאין כוח לקרוא את הפוסט הקודם)

    חקרתי את כלל הטבלאות ב-2 מסדי נתונים אשר עבדו אצלנו במשך הרבה מאוד זמן ללא כל בעיה על SQL SERVER 2008.

    לאחר השדרוג ל-2012 שמתי לב שבטבלה אחת לפעמים יש דילוגים של 1000 יח' בשדה ה-IDENTITY (זו הבעיה שהצפתי בפוסט הקודם).

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

    חיפשתי מה משותף לכל הטבלאות האלה וראיתי שבכולן יש פרוצדורות INSERT אשר עובדת עם @@IDENTITY.

    כפי שהומלץ לי בפוסט הקודם שיניתי את כל הפרוצדורות ל-SCOP_IDENTITY() ובינתיים נראה שהבעיה נפתרה. הדילוגים היו חוזרים כל מספר 

    קטן של רשומות (5-10), בינתיים נכנסו כ-20-200 רשומות חדשות לכל טבלה (6 טבלאות שונות) ועושה רושם שהבעיה נפתרה.

    אוכל לדעת בוודאות שהדבר לא יחזור רק לאחר שימוש אינטנסיבי יותר אך מתחזק בי החשד שה-@@IDENTITY גרם לזה מאחר וטבלאות

    שעבדו ללא זה היו תקינות לחלוטין.

    אופיר

    יום שני 18 יוני 2012 06:20
  • כל הכבוד על העדכון :-)

    הרבה שוכחים את החלק הזה ואחרי שהם מקבלים עזרה הם נעלמים (לפעמים אפילו בלי מילת תודה).


    יום שני 18 יוני 2012 06:50
    מנחה דיון
  • טוב, מיהרתי לשמוח. הצרה חזרה. שוב יש לי את הבעיה הזו.

    נראה שבכל זאת זה באג,

    מסתבר שהקפיצה נעשית ב-sql server 2012 כאשר מתבצע restart  ל-service שלו, אני רואה עוד דיווחים באינטרנט לגבי זה

    דיון שמצאתי לגבי זה נמצא בלינק הבא ומסביר את הגודל של הקפיצות:

    https://connect.microsoft.com/SQLServer/feedback/details/739013/alwayson-failover-results-in-reseed-of-identity

    מצאתי פתרון שהוצע ולהלן הוא:

    Enable "scan for startup procs configuration.
    In Master add one or more stored procs as required to reseed each table based on the code here.

    create proc FixIdent_DBName_Table
    as
    begin
    declare @MAX int
    select @MAX = max(Identity_Col) from DBName.dbo.Table
    DBCC CHECKIDENT([DBName.dbo.Table],RESEED,@MAX)
    end

    sp_procoption @ProcName = 'FixIdent_DBName_Table' 
        , @OptionName = 'startup' 
        , @OptionValue = 'true' 

    After the restart the seed will be reset correctly.

    Leo Miller
    Senior DBA Consultent
    SQL Services Limited
    New Zealand

    אנסה זאת ואעדכן

    פתרון מעצבן אבל זה מה שיש כרגע...


    • נערך על-ידי ofir_bl יום חמישי 21 יוני 2012 18:12
    • סומן כתשובה על-ידי pituachMVP, Editor יום חמישי 21 יוני 2012 18:45
    יום חמישי 21 יוני 2012 17:57
  • למה מעצבן? נשמע דווקא פתרון פשוט ויעיל :-)

    sp_procoption מאפשר להגדיר פרוצדורות שירוצו אוטומטית בזמן שמתחיל ה INSTANCE של השרת. ולכן הפרוצדורה ששמת בעצם תבצע תיקון בצורה שגם הוצע ודובר גם עם CHECKIDENT ואז procoption תגדיר להריץ את הפרוצדורה של התיקון כאשר שה INSTANCE מתחיל. רעיון לא רע (אם אכן זו הבעיה)

    בכל מקרה נראה מגיע לך סימון של התשובה :-)


    signature

    יום חמישי 21 יוני 2012 18:45
    מנחה דיון
  • לפי מיטב הבנתי אני צריך ליצור פרוצדורה עבור כל טבלה בנפרד (איני טועה, נכון?), זה די הרבה פרוצדורות,

    זאת הסיבה שאמרתי פתרון מעצבן.

    יום חמישי 21 יוני 2012 18:48
  • קודם כל אתה יכול לרוץ על כל הטבלאות שאתה רוצה בפרוצדורה אחת (פרוצדורה יכולה להכיל כמה שאילתות :-) אחרי הכל)

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

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

    עם כל זה עדיין הבעיה מאוד מוזרה :-)
    אם זה היה קורה רק בשרתים שהוגדרו ל always-on עוד הייתי מבין אולי הגיון כזה: השרת לוקח מראש 1000 ID ולכן בירידה של השרת נוצר חור של מה שעדיין לא נעשה בו שימוש אבל כבר נלקח (אני לא אומר שזה המצב ולא יודע מה קורה מאחורי הקלעים אבל זה נראה מקור לבאג כזה). אבל טוענים שם אנשים שזה קורה גם בשרתים שאינם מוגדרים למצב always on

    אם השרת ירד באופן לא מסודר אז הבעיה מובנת

    * יכול להיות שזה באמת באג... אני לא רואה שם תגובות של צוות הפיתוח "משום מה"... בינתיים אישית לא נתקלתי בזה

    ** הערה: הם מדברים שם על טבלאות זניחות עם פחות מ 1000 שורות רק. הטענה שם שזה לא קורה קורה בטבלאות עם פחות מ 1000 שורות.


    signature

    יום חמישי 21 יוני 2012 19:13
    מנחה דיון
  • ההסבר שלך לבעיה הוא הגיוני,

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

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

     תודה לעוזרים (אני מקווה שזו באמת פעם אחרונה שאני רושם את זה ;-) )


    • נערך על-ידי ofir_bl יום חמישי 21 יוני 2012 19:21
    יום חמישי 21 יוני 2012 19:21