none
כיצד רפליקציה משכפלת משפט UPDATE RRS feed

  • שאלה

  • שלום לכולם וגמר חתימה טובה

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

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

    אריה


    אריה שטרן

    יום שני 21 ספטמבר 2015 14:55

תשובות

  • היי אריה,

    התיאור שלך מדויק והוא אכן משקף התנהגות רגילה של Transnational Replication. נניח שהרצת פקודת UPDATE בצד של ה-Publisher, ופקודה זו עידכנה 100 שורות. בצד של ה- Subscriber, פקודת העדכון הזו תתורגם למאה פקודות UPDATE נפרדות שיורצו תחת טרנזקציה אחת (הפקודות הן ע"פ ה- PK's שעודכנו). 

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

    מקווה שעזרתי וחג סוכות שמח,

    יוסי

    • סומן כתשובה על-ידי pituachMVP, Editor יום שני 16 נובמבר 2015 07:43
    יום חמישי 24 ספטמבר 2015 07:16
  • לפי בקשת החברים.

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

    תודה לכולם וסליחה על התקלה.


    אריה שטרן

    • סומן כתשובה על-ידי pituachMVP, Editor יום שני 16 נובמבר 2015 07:52
    יום שני 16 נובמבר 2015 07:48

כל התגובות

  • באיזה סוג של רפליקציה אתה משתמש?

    לא בדיוק ברור לי מה הכוונה בהפעלה כפולה. כל מה שאני כותב כאן זה תיאורטי וקצת קשה לי להאמין שזה המצב(יתכן שלא הבנתי את התיאור שלך או שהתיאור אינו מדויק). אבל בהחלט אפשר לטעות ולהגדיר למשל רפליקציה של MERGE כך שאותה טבלה מקבלת רפליקציה משני מסדי נתונים או מאותו מסד נתונים פעמיים. פעולות כמו Log shipping  או mirroring למשל לא אמורים לאפשר מקרה כזה, כנ"ל לגבי רפליקציית Snapshot Replication. בכל מקרה צריך לוודא שאתה מנטר את הדבר הנכון, לאחר שנוודא באיזה סוג של רפליקציה אתה עובד :-)

    * נסה לספק עוד מידע אם לך על הבעיה, מידע על גרסאות השרתים, על הרפליקציה והניהול שלה, נסה לאתר בדיוק מי כל ה Distributor ואם יש לך יותר מאחד על אותה טבלה למשל. לא ניסיתי את זה אבל אולי אפשר ליצור במקביל גם Push Subscriptions וגם Pull Subscriptions כך שאולי נקבל פעולות כפולות (אנחנו גם מושכים מידע וגם דוחפים את המידע). אם אכן הבנתי נכון את ההתנהגות שאתה מתאר ויש פעולת עדכון כפולה ולא רק פעולות בדרך או ניטור כפול, אז בקיצור צריך לחקור את הארכיטקטורה של המערכת שלכם לעומק כולל כל מה שבניתם בכל המשחקים והניסיונות בדרך :-) 

    עדכון: במאמר הבא יש הסבר מאוד מקיף כולל כיצד ומה הארכיטקטורה. כדאי לעבור עליו לעומק: http://www.codeproject.com/Articles/715550/SQL-Server-Replication-Step-by-Step אולי זה ייתן עוד רעיונות. אבל בהחלט הדבר שאתה מתאר ומה שאני מבין מהתיאור אפשרי תיאורטית.


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]






    יום שני 21 ספטמבר 2015 20:35
    מנחה דיון
  • תודה על התשובה

    מדובר ב transacsainal replication. מקווה שאוכל עוד היום לספק מידע נוסף. אם לא, אז אחרי החג.

    חג שמח !


    אריה שטרן

    יום חמישי 24 ספטמבר 2015 05:55
  • היי אריה,

    התיאור שלך מדויק והוא אכן משקף התנהגות רגילה של Transnational Replication. נניח שהרצת פקודת UPDATE בצד של ה-Publisher, ופקודה זו עידכנה 100 שורות. בצד של ה- Subscriber, פקודת העדכון הזו תתורגם למאה פקודות UPDATE נפרדות שיורצו תחת טרנזקציה אחת (הפקודות הן ע"פ ה- PK's שעודכנו). 

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

    מקווה שעזרתי וחג סוכות שמח,

    יוסי

    • סומן כתשובה על-ידי pituachMVP, Editor יום שני 16 נובמבר 2015 07:43
    יום חמישי 24 ספטמבר 2015 07:16
  • לפי מה שאני הבנתי ממנו פעולת ה UPDATE מבוצעת פעמיים, כפי שכתבתי בהסבר שלי... לא היה ברור לי אם זה המצב וכתבתי שזה נשמע לי לא סביר. בהחלט הרבה יותר סביר שהמצב הוא כפי שיוסי מתאר, ולא מדובר בפעולה שנעשית פעמיים אלא בפעולה שמדווחת כמה פעמים מפני שהיא בכמה הופרדה לפעולות השונות.

    בכל מקרה הסבר מעולה יוסי :-)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]



    יום חמישי 24 ספטמבר 2015 08:51
    מנחה דיון
  • הי אריה,

    לא חזרת לעדכן אם התגובות כאן עזרו לך ואם פתרת את הבעיה.

    אודה לך אם תוכל לעדכן אותנו.

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

    תודה!

    -----------------------------
    גיא גלנצר
    יועץ והוגה דעות
    http://www.madeiradata.com

    • סומן כתשובה על-ידי אריה שטרן יום שני 16 נובמבר 2015 06:52
    • סימון כתשובה בוטל על-ידי pituachMVP, Editor יום שני 16 נובמבר 2015 07:24
    יום שני 16 נובמבר 2015 06:24
    מנחה דיון
  • תודה לכולם

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


    אריה שטרן

    • סומן כתשובה על-ידי pituachMVP, Editor יום שני 16 נובמבר 2015 07:24
    • סימון כתשובה בוטל על-ידי pituachMVP, Editor יום שני 16 נובמבר 2015 07:52
    יום שני 16 נובמבר 2015 06:53
  • בוקר טוב אריה,

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

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

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

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

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


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]


    יום שני 16 נובמבר 2015 07:37
    מנחה דיון
  • לפי בקשת החברים.

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

    תודה לכולם וסליחה על התקלה.


    אריה שטרן

    • סומן כתשובה על-ידי pituachMVP, Editor יום שני 16 נובמבר 2015 07:52
    יום שני 16 נובמבר 2015 07:48