איך מייעלים את המעבר לאתר ה-DR בכמה צעדים פשוטים

נשאלתי על ידי אחד הקוראים בשבוע שעבר לגבי מעבר “שקוף” בין ה-Primary וה-Standby בסביבה של Data Guard. השאלה הייתה יחסית פשוטה: איך מקנפגים את התחנות ככה שהן יעברו לעבוד בצורה אוטומטית מול האתר הפעיל בכל נקודת זמן?

האמת היא שהפתרון פה הוא הרבה יותר פשוט ממה שנדמה ואפילו יצא לי לממש אותו כבר באורקל 10, לפני למעלה מ-5 שנים…

כדי לפתור את הבעיה, מה שאנחנו יכולים לעשות זה ליצור Service של אורקל ולאפשר בכל נקודת זמן רק לצד אחד (ה-Primary) להדליק אותו. לאחר מכן, נגדיר בתחנות שהן מנסות כל הזמן להתחבר הן לאתר הראשי והן לאתר ה-DR אבל בגלל שה-Service רץ רק באחד מבסיסי הנתונים, אז הן תמיד יוכלו להתחבר לאתר אחד ולא לקבל הודעת שגיאה.

איך מבצעים את זה בפועל

 

בשלב הראשון, אנחנו צריכים ליצור Service בסביבת ה-primary:

begin
   dbms_service.create_service('orclprod','orclprod');
end;
/

אם אנחנו משתמשים ב-TAF (כלומר Transparent Application Failover) אז נצטרך להוסיף כמה פרמטרים נוספים ליצירת ה-Service:

begin
  dbms_service.create_service(service_name     => 'orclprod',
                              network_name     => 'orclprod',
                              failover_method  => 'basic',
                              failover_type    => 'select',
                              failover_retries => 5,
                              failover_delay   => 1);
end;
/

לאחר מכן, נדליק את ה-Service:

begin
   dbms_service.start_service('orclprod');
end;
/

 

באופן עקרוני, הפקודה של הדלקת ה-service תבצע את זה גם באתר ה-DR וזה לא מה שרצינו, ולכן אנחנו צריכים להגדיר on startup trigger שיכבה את ה-service במידה והוא עלה באתר ה-DR (או למעשה, אם הוא עלה עם ה-role של ה-DR למקרה שהם יתחלפו בתפקידים):

CREATE TRIGGER Set_Primary_Service_Status AFTER STARTUP ON DATABASE
DECLARE
  v_role VARCHAR(30);
BEGIN
  SELECT DATABASE_ROLE INTO V_ROLE FROM V$DATABASE;
 
  IF v_role = 'PRIMARY' THEN
    DBMS_SERVICE.START_SERVICE('orclprod');
  ELSE
    DBMS_SERVICE.STOP_SERVICE('orclprod');
  END IF;
END;
/

בשלב הזה כדאי לבצע restart ל-standby שלנו כדי שהוא גם יכבה באופן אוטומטי את ה-service.

הסקריפט שיש לנו פה לא עובד כמו שצריך בחלק מהמקרים – לדוגמה אם עובדים עם Active Data Guard מכוון שגם שם מתבצע alter database open (של read only אבל בכל מקרה לא נשארים ב-mount) ואז כאשר עושים switchover או failover אליו אז ה-trigger לא רץ שוב וה-service לא עולה אוטומטית.

 

כדי לפתור את העניין הזה, ניתן ליצור עוד trigger שירוץ אחרי שינוי ה-db role (עובד ב-11 ומעלה, לא ניסיתי ב-10):

 

CREATE TRIGGER Set_Primary_Service_Status AFTER db_role_change ON DATABASE
DECLARE
  v_role VARCHAR(30);
BEGIN
  SELECT DATABASE_ROLE INTO V_ROLE FROM V$DATABASE;
 
  IF v_role = 'PRIMARY' THEN
    DBMS_SERVICE.START_SERVICE('orclprod');
  ELSE
    DBMS_SERVICE.STOP_SERVICE('orclprod');
  END IF;
END;
/

 

עכשיו כשהכול מוגדר, נוכל לתת למשתמשים שלנו את כניסת ה-TNS החדשה שכוללת את שני השרתים וה-Service המשותף

orclprod =
 (DESCRIPTION =
    (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = lnx-server-1)(PORT = 1521))
       (ADDRESS = (PROTOCOL = TCP)(HOST = lnx-server-2)(PORT = 1521))
       )
       (CONNECT_DATA =
       (SERVICE_NAME = orclprod)
    )
 )
0 תגובות

השאירו תגובה

Want to join the discussion?
Feel free to contribute!

השאר תגובה

This site uses Akismet to reduce spam. Learn how your comment data is processed.