ההשפעה של no logging על data guard
כבר כתבתי בעבר על הקמה של data guard ואחד הדברים שציינו במפורש זה שרצוי מאוד להשתמש ב-force logging כדי להימנע מבעיות של טבלאות שנטענות ב-no logging.
השבוע נדרשתי שוב לנושא על ידי לקוח. הוא רצה לדעת מה קורה אם בכל זאת אנחנו רוצים להקים סביבה של data guard אבל את טבלאות הביניים שלו, הוא לא רוצה לגבות ולא אכפת לא שלא יעברו לסביבת ה-DR.
כדי להדגים מה קורה, בואו נבצע את זה בפועל.
בשלב הראשון, לקחתי סביבת Data Guard שהייתה לי והורדתי ממנה את ה-Force Logging
SQL> select database_role from v$database; DATABASE_ROLE ---------------- PRIMARY SQL> alter database no force logging 2 / Database altered.
לאחר מכן, יצרתי טבלה זמנית בשם TT עם no logging והכנסתי אליה נתונים:
SQL> create table tt nologging as select * From dba_objects; Table created.
ביצעתי switchover לשרת השני:
[oracle@lnx-ora-server2 trace]$ dgmgrl sys/oracle@orcl DGMGRL for Linux: Version 11.2.0.2.0 - Production Copyright (c) 2000, 2009, Oracle. All rights reserved. Welcome to DGMGRL, type "help" for information. Connected. DGMGRL> show configuration; Configuration - my_dg Protection Mode: MaxPerformance Databases: orcldg - Primary database orcl - Physical standby database Fast-Start Failover: DISABLED Configuration Status: SUCCESS DGMGRL> switchover to orcl Performing switchover NOW, please wait... New primary database "orcl" is opening... Operation requires shutdown of instance "orcldg" on database "orcldg" Shutting down instance "orcldg"... ORACLE instance shut down. Operation requires startup of instance "orcldg" on database "orcldg" Starting instance "orcldg"... ORACLE instance started. Database mounted. Database opened. Switchover succeeded, new primary is "orcl" DGMGRL> exit
לאחר מכן, התחברתי ל-primary החדש ושלפתי מהטבלה:
SQL> select database_role from v$database; DATABASE_ROLE ---------------- PRIMARY SQL> conn zohar/zohar Connected. SQL> select * From tt; select * From tt * ERROR at line 1: ORA-01578: ORACLE data block corrupted (file # 4, block # 29651) ORA-01110: data file 4: '/home/oracle/app/oracle/oradata/orcl/users01.dbf' ORA-26040: Data block was loaded using the NOLOGGING option
נוצרה בעיה – הטבלה הייתה ב-no logging אז המידע בה לא נכנס ל-archive logs ולכן לא עבר ל-standby. זה אומר שהמידע שלה לא תקין. מבחינת בסיס הנתונים הבלוקים של הטבלה הזו הם soft corrupted – כלומר יש שם מיני corruption אבל כזה שניתן לתקן באמצעות truncate table פשוט:
SQL> truncate table tt; Table truncated. SQL> select * from tt; no rows selected
שווה לציין שגם ב-alert log יצויין שהיה לנו corruption (וזה ירשם גם ב-ADR):
[oracle@lnx-ora-server1 trace]$ adrci ADRCI: Release 11.2.0.2.0 - Production on Mon Feb 23 16:06:28 2015 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. ADR base = "/home/oracle/app/oracle" adrci> show homes ADR Homes: diag/rdbms/orcl/orcl adrci> set home diag/rdbms/orcl/orcl adrci> show incidents ADR Home = /home/oracle/app/oracle/diag/rdbms/orcl/orcl: ************************************************************************* INCIDENT_ID PROBLEM_KEY CREATE_TIME -------------------- ----------------------------------------------------------- ---------------------------------------- 219969 ORA 1578 2015-02-23 15:44:11.243000 +02:00 219970 ORA 1578 2015-02-23 15:44:13.294000 +02:00 2 rows fetched
סיכום
ראינו שאי שימוש ב-force logging עלול ליצור לנו בעיה של corruptions. לא מדובר פה במשהו יחודי ל-data guard – גם גיבוי אינקרמנטלי או כל גלגול של archive-ים יצור לנו את אותה הבעיה ולכן חשוב מאוד שנבין מה המשמעות של שימוש ב-no logging.
אם אנחנו מודעים באופן מלא למשמעות של השימוש ב-no logging ומוכנים לאבד את הנתונים במידה ונבצע שחזור (או במקרה שלנו switchover) אין שום בעיה להמשיך ולעבוד ככה. מה שחשוב זה להבין את המשמעות.
השאירו תגובה
Want to join the discussion?Feel free to contribute!