שימוש ב-with כדי לפשט שליפות

לא הרבה יודעים, אבל התחביר של שליפות באורקל הוא דבר דינמי ומשתנה בין גרסאות. דוגמה טובה ומעניינית  היא שהחל מגרסה 9.2 אורקל הוסיפו את התאימות למה שהוגדר בתקן של SQL99 והדבר הביא להוספה של הפונקציונליות של תנאי with כאשר עושים select – דבר שיכול לעזור לנו מאוד בפישוט שאילתות.

נתחיל בשיעור היסטוריה קצר כדי להבין מה זה בעצם אומר. כידוע, SQL היא לא שפה ייחודית לאורקל – זו שפה עם סטנדרטים שנקבעים על ידי ANSI. הגרסה הראשונה של השפה שעברה סטנדרטיזציה הייתה בשנת 1986 עם הוצאת SQL86.  בשנת 92 יצאה גרסה נוספת (SQL92) שהייתה גם הגרסה הראשונה שאורקל ניסתה להתאים את עצמה אליה בגרסת Oracle 8. בשנת 1999 יצאה גרסה חדשה ומורחבת של השפה (SQL99) שכללה הרבה מהתכונות שהיו באורקל לפני זה (triggers, recursive sql ועוד) ואורקל התאימו את עצמם שוב למרבית התקנים החדשים בגרסה Oracle 9i (אם אני לא טועה זה היה בגרסה 9.2).

המשך קריאה…

מציאת קבצים בין שני תאריכים (UNIX)

כדי למצוא קבצים בין שני תאריכים, ניתן להשתמש בשתי פקודות:  find ו-touch.

יצירת קבצים של תחילת התקופה וסיום התקופה באמצעות touch עם פרמטר t ותאריכי התחלה וסיום (בפורמט yyyyMMddhhmm):

touch -t 200801010000 start
touch -t 200901010000 end

ולאחר מכן שימוש ב-find כדי למצוא את הקבצים בין שני התאריכים:

find . -newer start ! -newer end -type f -ls

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

איך לשחרר שטח מ-tablespace לגודל המינימלי שלו

כאשר נוצר מצב שבו ב-tablespace מתפנה מקום רב, אורקל מאפשרים להקטין את ה-tablespace על ידי מעבר על ה-datafile-ים שלו וביצוע פקודות resize. הבעיה מתעוררת כאשר ישנו Tablespace עם מספר datafiles (ולפעמים זה יכול להגיע גם לעשרות) ואז העבודה של מציאת הסגמנט ש"חוסם" את שחרור השטח הפנוי הופך להיות משימה מהגהינום: גם הזיהוי בצורה ידנית של הבלוק התפוס העליון (HWM) וגם ה-resize שלפעמים לוקח זמן.

דרך אגב, אם יש tablespace  במצב read-only ובו אינדקסים של אובייקט שהוא לא ב-read-only, אז כאשר זורקים את הטבלה או ה-partition אז השטח ב-tablespace הזה לא משתחרר – הסגמנטים של האינדקס הופכים ל-temp segments ועד שלא נפתח את ה-tablespace ל-read write השטח לא יזוהה כפנוי.

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

המשך קריאה…

הדפסת ה-Alert Log מה-Startup האחרון

בשבוע האחרון לא יצא לי לכתוב בעיקר כי הייתי קצת חולה.

כדי לבדוק Alert log מאז העליה האחרונה של ה-DB (או בכלל, ניתן לקנפג את זה שיהיה מעלייה כלשהי של ה-DB) ניתן להשתמש בסקריפט הבא


#!/bin/csh
set Sid=$1

  set StartupRowNumber = `grep -n 'Starting up ORACLE RDBMS' /app01/oracle/admin/$Sid/bdump/alert_$Sid.log |cut -f 1 -d : |sort -nr |sed -n '1 p'`

  if "$StartupRowNumber" == "" then
     set StartupRowNumber = 1
  endif

  sed -n "${StartupRowNumber},$ p" /app01/oracle/admin/$Sid/bdump/alert_$Sid.log | less

קצת הסברים:

  1. השתמשתי ב-grep כדי למצוא את השורות שבהן יש את ההודעה על התחלת עלייה של ה-DB. השתמשתי באופרטור n- כדי שהוא יציג גם מספרי שורות.
  2. השתמשתי ב-cut כדי לחתוך את מספרי השורות בלבד: d- : מייצר עמודות לפי דלימיטר ":" ואילו f 1 -מציג רק את העמודה הראשונה.
  3. השתמשתי ב-sort כדי למיין בצורה הפוכה את המספרים – מסוף הקובץ להתחלה (nr-).
  4. הצגתי רק את השורה הראשונה (כלומר הפעם האחרונה שהייתה התחלה של העלאה). הסיבה שעשיתי את זה ולא tail היא שרציתי לשלוט במספר ה-startup-ים שאני אציג (בסוף לא ביצעתי).
  5. את התנאי שמתי למקרה שבלוג אין עלייה אחרונה של המערכת (לוג חתוך).
  6. הצגה של השורות מהשורה שמצאתי עד סוף הקובץ ביצעתי באמצעות sed.