Monday, November 23, 2009

Build a Reporting Database using standby and flashback


It's been a long time since I posted something. So, here's something worthwhile. Thanks to my colleague Kevin who devised this method!

Requirement


A reporting database to be refreshed daily from the UAT instance. The reporting database should be available during the daytime and the refresh can happen during the night.


Solution


1. Initially, build the reporting database as a standby database.


2. Once the Managed Recovery process (MRP) is initiated and the standby is in sync with the primary database, cancel the MRP.


SQL> alter database recover managed standby database cancel;

3. Enable flashback in the standby database. Note that the DB should be in mount state for this.


SQL> startup mount force;




SQL> alter database flashback on;

4. create guaranteed restore point.



SQL> drop restore point before_open;



SQL> create restore point before_open guarantee flashback database;

5. Activate the standby database.


SQL> alter database activate standby database;

SQL> startup force;

6. In the evening/night, flashback the database to the guaranteed restore point i.e., standby database and resync it with the primary.


SQL> startup mount force;



SQL> flashback database to before_open;



SQL> alter database convert to physical standby;



SQL> startup mount force;



SQL> alter database recover managed standby database disconnect from session;

7. The next day monring, verify that the recovery has indeed completed, by using the following sql:



SQL> set pages 1000



SQL> SELECT ARCH.THREAD# "Thread", ARCH.SEQUENCE# "Last Sequence Received",
APPL.SEQUENCE# "Last Sequence Applied",
(ARCH.SEQUENCE# - APPL.SEQUENCE#) "Difference"
FROM
(SELECT THREAD# ,SEQUENCE# FROM V$ARCHIVED_LOG WHERE (THREAD#,FIRST_TIME ) IN
(SELECT THREAD#,MAX(FIRST_TIME) FROM V$ARCHIVED_LOG GROUP BY THREAD#)) ARCH,
(SELECT THREAD# ,SEQUENCE# FROM V$LOG_HISTORY WHERE (THREAD#,FIRST_TIME ) IN
(SELECT THREAD#,MAX(FIRST_TIME) FROM V$LOG_HISTORY GROUP BY THREAD#)) APPL
WHERE
ARCH.THREAD# = APPL.THREAD#
ORDER BY 1;



SQL> select max(sequence#) from v$archived_log; -- execute on both primary and standby.

8. Repeat the Steps 4 & 5 - to open the reporting database to the users.


9. In the evening/night, repeat Step 6. - to resync the reporting database.


References


1. Introduction to Restore points/flashback databases.

2. Introduction to data guard.

3. Business Continuity for Oracle Applications Release 11i, Database Releases 9i and 10g - Note: 216212.1


No comments: