פוסטים שנכתבו על ידי זהר אלקיים

תיקון חוסר סנכרון ב-data guard כאשר נוצר קובץ במקום לא סטנדרטי

כאשר מוסיפים Data file לסביבת primary של Dataguard יש להוסיף את הקובץ גם בסביבת ה-standby כדי שהסינכרון ימשיך לעבוד. ל-dataguard ישנה היכולת ליצור בעצמו את הקובץ שנוצר ב-primary גם בסביבות הגיבוי, אם הגדרנו לו מראש מעין טבלת תרגום ל-File system ב-primary ו-File system ב-standby. טבלת ההמרה הזו מתבצעת בפרמטר LOG_FILE_NAME_CONVERT.

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

המשך קריאה…

דרך לראות מה הפאצ'ים שמותקים ב-home של אורקל, מתי הם הותקנו ומה תיאורם

טיפ נחמד ושימושי לשימוש ב-opatch (עובד בגרסה 10 והילך, לא בדקתי בגרסאות קודמות):

אם אנחנו רוצים לגלות מה ה-Patch-ים שהותקנו ב-Home מסויים של אורקל + מתי הם הותקנו ותיאור קצר שמתאר כל פץ' ניתן להשתמש בפקודה הבאה:

$ORACLE_HOME/OPatch/opatch lsinventory -bugs_fixed

אם אנחנו רוצים לזהות איזה PSU-ים כבר הותקנו אפשר להפעיל את הפקודה הבאה:

$ORACLE_HOME/OPatch/opatch lsinventory -bugs_fixed |grep -i psu
(repost לטובת ישור קו בתחום הקטגוריות והתגים)

השהיית פקודה כאשר יש בעיית מקום ב-tablespace

נניח שיש לנו טרנזאקציה של פקודת insert ארוכה במיוחד (כזו שלוקחת שעות) ובאמצע ה-insert מרפי קופץ לביקור ונגמר המקום ב-tablespace של הטבלה. על פניו, אירוע מצער שאי אפשר להתגבר אליו אלא להתחיל מחדש, נכון? אז זהו שלא. ישנו פיצ'ר בשם Resumable Space Allocation שמאפשר לנו להכניס את ה-session להשהייה ולהמתין פרק זמן מוגדר כדי שנוכל לטפל בבעיה. ברגע שנטפל בבעיה, ה-session שלנו ימשיך כרגיל באופן אוטומטי, כאילו לא קרה שום דבר.

זה לא פיצ'ר חדש במיוחד – למעשה הוא קיים כבר מגרסה 9i – אבל הופתעתי היום לגלות שיש מפתחים (ויותר גרוע, DBA-ים) שפשוט לא מכירים את זה. בוא נראה איך אפשר להשתמש בכלי החשוב הזה.
המשך קריאה…

שינוי התנהגות ב-execute immediate בין גרסה 10 לגרסה 11

במסגרת הבדיקות של גרסה 11 נתקלנו בתקלה מוזרה – קוד pl/sql שעבד בגרסאות קודמות הפסיק לעבוד בגרסה החדשה.

הקוד שעבד קודם הוא:

SQL> begin
2 execute immediate 'alter view vemp compile;';
3 end;
4 /
PL/SQL procedure successfully completed.

אבל כאשר ניסינו לשים אותו בגרסה 11.2.0 קיבלנו את ההודעה הבאה:

SQL> begin
2 execute immediate 'alter view vemp compile;';
3 end;
4 /
begin
*
ERROR at line 1:
ORA-00911: invalid character
ORA-06512: at line 2

המשך קריאה…

אגריגציה של מחרוזות

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

  • פונקציית STRAGG (של Tom Kyte) – שזמינה החל מגרסה 9i ומשתמשת בטכניקה של פונקציות משתמש סיכומיות. הפוקנציה הזו לא ידעה כל כך למיין את הרשומות בתוך הרשימה (בעיה שנפתרה לאחר מכן) והיו לה ביצועים לא כל טובים, אבל היא עשתה את העבודה. במאמר מוסגר נציין שהפונקציה הזו נוספה באופן מובנה לבסיס הנתונים בגרסה 11 אבל היא עדיין לא יודעת למיין או להשתמש במפרידים בין הערכים.
  • שימוש ב-CONNECT_BY_PATH ושליפות היררכיות שזמין מגרסה 9i – פתרון מורכב יחסית שלא היה טוב לכל שליפה.
  • שימוש בפונקציית model בעלת התחביר המזעזע והביצועים העוד יותר מזעזעים שזמינה מגרסה 10g.
  • שימוש ב-collect וקוד pl/sql שזמין מגרסה 10g גם כן.
  • עריכה: ידידי לאוניד הזכיר גם את הפונקציה wmsys.wm_concat. היא זמינה החל מגרסה 9i  אבל דורשת התקנה של ה-wmsys (workspace manager) – שמותקן כברירת מחדל רק בגרסאות מאוחרות יותר .

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

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

סיבוב טבלה על ציר

בעיה נפוצה שלא היה לה פתרון פשוט על ידי פקודה עד גרסה 11 היא סיבוב טבלה על ציר. בגרסה 11 ישנו פתרון יעיל ומהיר לבעיה על ידי צמד פקודות: Pivot ו-Unpivot שלא מצריך ניפנופי ידיים והסברים על מימוש שליפה שתבצע את זה.

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

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