Logical vs Physical Standby database


Logical vs. Physical Standby databases
Submitted By Rama Subramoniam

A Quick Primer

Standby databases, in a nutshell, acts as a failover for our mission critical production databases. When production database crashes, applications can quickly switchover to the stand by databases.

Oracle provides two types of standby databases:

1. Physical Standby Database

Standby database is called “physical” if the physical structure of stand by exactly matches with stand by structure. Archived redo log transferred from primary database will be directly applied to the stand by database.

2. Logical Standby Database

Stand by database is called “logical”, the physical structure of both
databases do not match and from the archived redo log we create SQL statements then these statements will be applied to stand by database.

Administer Standby Databases

I would say there are three ways we can administer standby database.

1. SQL/Shell Scripts
This is the basic and simple method to create standby database, monitor the log transport and log apply services.
DGMGRL stands for Data Guard Line Mode, a tool provided by oracle to administer standby database.
How it works?
In any typical standby db environment there will be only one primary database and one or more standby databases. With dgmgrl, we need to create one object for primary db called “Configuration” and for each stand by database we create one object alled“site”.Theseobjects“Configuration” and “sites” are interrelated.
Things to remember when using DGMGRL

  • You can not create standby databases thru dgmgrl.You can only use this tool to monitor or switch over dbs.
  • You need to have “sp file” created for all primary/stand by dbs.
  • From dgmgrl, you need to always connect with primary db to perform any activities otherwise its not going work.
  • The parameter dg_broker_start must be set to TRUE

3. OEM

We can use Oracle Enterprise Manager (OEM) to administer both physical and logical standby databases.

How to Create Physical Standby Database

Before you go thru the steps listed below in our example I call primary database as “TEST” and standby database as “TEST_S1”.But keep in mind when you create standby database the environment variable ORACLE_SID is going to be same as primary db name (TEST in our case).

1) Ensure the Primary database is in ARCHIVELOG mode:

	SQL> archive log list
	Database log mode              No Archive Mode
	Automatic archival             Disabled
	Archive destination         /export/home/oracle/temp/oracle/arch
	Oldest online log sequence     7
	Current log sequence           9
	SQL> alter database close;     

	Database altered.

	SQL> alter database archivelog;     

	Database altered.

	SQL> shutdown immediate                      
	ORA-01109: database not open

	Database dismounted.
	ORACLE instance shut down.

Modify the Primary database init.ora so that log_archive_start=true and restart the instance. Verify that database is in archive log mode and that automatic archiving is enabled.

	SQL> archive log list
	Database log mode              Archive Mode
	Automatic archival             Enabled
	Archive destination            /export/home/oracle/temp/oracle/arch
	Oldest online log sequence     7
	Next log sequence to archive   9
	Current log sequence           9

2) Create a backup of the Primary database

You can use an existing backup of the Primary database as long as you have the archive logs that have been generated since that backup. You may also take a hot backup as long as you have all archive logs through the end of the backup of the last table space. To create a cold backup do the following:

		SQL> select name from v$datafile;

		SQL> shutdown immediate
		Database closed.
		Database dismounted.
		ORACLE instance shut down.
		SQL> exit

Create a backup of all data files and online redo logs using an OS command or utility. A backup of the online redo logs is necessary to facilitate switchover.

Once complete startup the instance:

		SQL> startup
		ORACLE instance started.

		Total System Global Area   80512156 bytes
		Fixed Size                   279708 bytes
		Variable Size              71303168 bytes
		Database Buffers            8388608 bytes
		Redo Buffers                 540672 bytes
		Database mounted.
		Database opened.

3) Connect to the primary database and create the standby control file:

	SQL> alter database create standby control file as 

	Database altered.

4) Copy files to the Standby host

Copy the backup data files, standby control file, all available archived redo logs, and online redo logs from the primary site to the standby site. Copying of the online redo logs is necessary to facilitate switchover. If the standby is on a separate site with the same directory structure as the primary database then you can use the same path names for the standby files as the primary files. In this way, you do not have to rename the primary data files in the standby control file. If the standby is on the same site as the primary database, or the standby database is on a separate site with a different directory structure the you must rename the primary data files in the standby control file after copying them to the standby site. This can be done using the db_file_name_convert and log_file_name_convert parameters or by manually using the alert database statements.

5) Set the initialization parameters for the primary database

It is suggested that you maintain two init.ora files on both the primary and the standby databases. This allows you to facilitate role reversal during switchover operations more easily.

For primary database ========

1. initTEST.ora
2. switch_to_stdby_initTEST

For Standby database =======

1. initTEST_s1.ora
2. switch_to_primary_initTEST

On primary initTEST.ora file add the following lines:

	log_archive_dest_2='SERVICE=TEST_s1 reopen=60'

Create the standby initialization parameter file and set the parameters for the standby database. Depending on your configuration, you may need to set filename conversion parameters.

Standby init.ora on Primary host:


NOTE: In the above example, db_file_name_convert and log_file_name_convert are not needed as the directory structure on the two hosts are the same. If the directory structure is not the same then setting of these parameters is recommended.

6) Configure networking components

On the Primary host create a net service name that the Primary database can use to connect to the Standby database. On the primary host creates a net service name that Standby, when running on the Primary host, can use to connect to the Primary, when it is running on the Standby host. Example from
Primary’s host tnsnames.ora:

        (ADDRESS= (PROTOCOL= TCP) (Host= (Port= 1523))
        (CONNECT_DATA = (SID= TEST))

	TEST_s1 =
        (ADDRESS= (PROTOCOL= TCP) (Host= (Port= 1530))
        (CONNECT_DATA = (SID= TEST))

The above two net service names must exist in the Standby hosts tnsnames.ora also. You must also configure a listener on the standby database. If you plan to manage this standby database using the Data Guard broker, you must configure the listener to use the TCP/IP protocol and statically register the standby database service using its SID.

7) Start up and mount the stand by database

	oracle@hasunclu2:/export/home/oracle/temp/oracle> sqlplus "/ as 	sysdba"    

	SQL*Plus: Release - Production on Thu Mar 14 18:00:57 	2002 (c) Copyright 2001 Oracle Corporation.  All rights reserved.
	Connected to an idle instance.

	SQL> startup nomount pfile=?/dbs/initTEST_s1.ora
	ORACLE instance started.

	Total System Global Area   80512156 bytes
	Fixed Size                   279708 bytes
	Variable Size              71303168 bytes
	Database Buffers            8388608 bytes
	Redo Buffers                 540672 bytes
	SQL> alter database mount standby database;

	Database altered.


8) Create standby redo log files, if necessary

Standby redo logs are necessary for the higher protection levels such as Guaranteed, Instant, and Rapid. In these protection modes LGWR from the Primary host writes transactions directly to the standby redo logs. This enables no data loss solutions and reduces the amount of data loss in the event of failure. Standby redo logs are not necessary if you are using the delayed protection mode.

If you configure standby redo on the standby then you should also configure standby redo logs on the primary database. Even though the standby redo logs are not used when the database is running in the primary role, configuring the standby redo logs on the primary database is recommended in preparation for an eventual switchover operation.

Standby redo logs must be archived before the data can be applied to the standby database. The standby archival operation occurs automatically, even if the standby database is not in ARCHIVELOG mode. However, the archive process must be started on the standby database. Note that the use of the archiver process (ARCn) is a requirement for selection of a standby redo log.

You must have the same number of standby redo logs on the standby as you have online redo logs on production. They must also be exactly the same size.

The following syntax is used to create standby redo logs:

	SQL> alter database add standby log file
	  '/export/home/oracle/temp/oracle/data/srl_1.dbf' size 20m;

	Database altered.
	SQL> alter database add standby log file
	  2  '/export/home/oracle/temp/oracle/data/srl_2.dbf' size 20m;

	Database altered.

	SQL> alter database add standby log file
 	 2 ‘/export/home/oracle/temp/oracle/data/srl_3.dbf' size 20m;

	Database altered.


9) Copy database files

Manually change the names of the primary data files and redo logs in the standby control file for all files not automatically renamed using DB_FILE_NAME_CONVERT and LOG_FILE_NAME_CONVERT as noted in step 5.Datafile names can be changed on the standby at a mounted state with the following syntax:

	SQL> alter database rename file

10) Restart the listeners

On the primary database, and start the listener on the standby database so that changes made to the listener.ora can be implemented.

11) Activate parameter changes

Manually enable initialization parameter changes on the primary database so that it can initiate archiving to the standby site.
At runtime, the LOG_ARCHIVE_DEST_n initialization parameter can be changed using ALTER SYSTEM and ALTER SESSION statements. Activate the changes made to these parameters by either bouncing the instance or activating via alter system.

For example:

	SQL> alter system set log_archive_dest_2='SERVICE=TEST_s1 	reopen=60';

	System altered.

12) Verify Auto Archive

On the Primary database switch a log and verify that it has been shipped properly using the v$archive_dest view.

	SQL> alter system switch logfile;

	System altered.

	SQL> select status, error from v$archive_dest where dest_id=2;


	--------- ------------------------------------------------------


13) Put Standby database in managed standby database

	SQL> recover managed standby database disconnect;
	Media recovery complete.
	SQL> exit

14)Apply redo logs in the standby database

Remember archived logs will be transferred to stand by database. But we need to apply the archived logs to standby database. We can apply these archived logs either thru SQL or data guard command line tool (DGMGRL)

Let us see how we can apply thru SQL.

Go to standby database environment:

	SQL> startup nomount pfile=initTEST_s1.ora

	SQL> alter database mount standby database;

	SQL> recover managed standby database disconnect;

Warning!!!After executing the above statement you will get the sql prompt. But that does not mean the recovery is complete. This statement will kick off “Disaster Recovery Service”.

SQL> recover managed standby database cancel;

The above statement will complete media recovery. Now all archive redo logs applied to standby database.

15) Switchover databases

In real time environment, if primary database is crashed or unavailable for some reason you need to make standby database as primary database.

• Switchover Standby to Primary

In order to do switchover standby have to be in mount state.

SQL> alter database commit to switch over to primary;

Sometimes, this command will ask to do media recovery on stand by instance. Apply logs as mentioned above and rerun the command.

SQL> shutdown immediate;
SQL> startup pfile=switch_to_primary_initTEST.ora

• Switchover Primary to Standby

SQL>alter database commit to switch over to standby;
SQL> shutdown immediate;
SQL> startup pfile= switch_to_stdby_initTEST.ora

How to Create Logical Standby Database

Now, let us talk about how we can create one logical standby database and administer logical standby database.

Before we create logical database perform the following checks to make sure the primary database qualify to have logical standby database.

• Determine whether primary database contains data types like LONG, NCLOB, LONG RAW, BFILE those are not supported by standby database.
• Ensure that the tables in primary database can be uniquely identified.
• Ensure that the primary database is in ARCHIVELOG mode and that archiving is enabled.
• Ensure supplemental logging is enabled on the primary database. To see whether supplemental logging is enabled, start a SQL session and query the V$DATABASE fixed view. For example, enter:


--- ---

If supplemental logging is not enabled, execute the following statements:

• Ensure LOG_PARALLELISM init.ora parameter is set to 1 (default value).If you plan to be performing switchover operations with the logical standby then you must create an alternate tablespace in the primary database for logical standby system tables. Use the DBMS_LOGMNR_D.SET_TABLESPACE procedure to move the tables into the new tablespace. For example:


Steps to create Logical Standby Database

1. On primary database, perform cold backup.
2. Bring the primary database to mount state to create backup of control file.
3. Open the primary database and build the log miner dictionary.

SQL> ALTER system enable restricted session;
4. Archive the current online redo log and disable the restricted session.
5. Identify the archived redo log that contains the log miner dictionary

6. . Copy all these files with init parameter file to the stand by database.
7. On standby system, modify the copied primary init file to support the logical standby feature. Some parameters affected are control_files,standby_archive_dest,parallel_max_servers,instance_name.
8. Start and mount the standby database in exclusive mode.
9. Turn on the database guard.

10. Open the logical standby followed by a shutdown immediate or normal.
11. Open the logical standby database in exclusive mode.
12. Create temporary table space for the standby database.
13. On logical standby database, register the archived log identified in step 5 and run the following command.
14. Run the following ALTER DATABASE statement and include the INITIAL keyword to begin SQL apply operations for the first time on the logical standby.

15. Configure listener on the standby database.
16. Once listeners running on both primary and standby databases run the following command.

17. Create tns names entry for primary database in standby host. Similarly, create tns names entry for standby database in primary host.
18. Enable archiving in the logical standby database.
19. Start archive the current online redo log file. Verify that the remote archiving succeeded by running the following select statement.
20. Verifying archived redo logs are being applied. To verify that the archived redo logs are being applied, query the V$LOGSTDBY view. This view provides information about the processes that are reading redo log information and applying it to the logical standby databases. You can also query the DBA_LOGSTDBY_PROGRESS view to find out the progress of SQL apply operations. The V$LOGSTDBY_STATS view shows the state of the coordinator process and information about the SQL transactions that have been applied to the logical standby database.

Logical or Physical, What is your Choice?

You ask you DBA to implement “stand by “database for your production database. Guess what? You will get “physical standby “database implemented for your production database. Because implementing physical standby database would be first choice for many DBAs as most of us would not realize the benefits we get from having logical standby database.

Let us take close look at the major bottleneck with physical stand by database.
We need to keep the physical standby database in “recovery mode” in order to apply the received archive logs from the primary database. We can open “physical stand by database to “read only” and make it available to the applications users (Only select is allowed during this period).Once the database is opened in “Read only” mode then we can not apply redo logs received from primary database.

We do not see such issues with logical standby database. We can open up the database in normal mode and make it available to the users. At the same time, we can apply archived logs received from primary database.

Real World Scenario

One of my clients was facing critical performance issue with their primary database. The primary database needed to support pretty large user community for the OLTP system and pretty large “Reporting Group”. The database could not cope up with these two large user groups. So I have configured “logical stand by” database for the primary database and I have opened up the database available to the reporting users group. Now the database load is kind of distributed between primary and standby database.


I will hazard a guess that you and many users now have a newfound respect for standby databases. In future, if you need to create standby databases ask yourself the following questions.

• Do I need just one failover database? Then you can choose physical standby database.
• Do I need failover database? Also I need to see whether I can make use of this failover database rather than sitting idle on the server. Then choose logical standby database.


We have a logical standby database in our organisation, primarily to shift the reporting load away from out live oltp. However, maintaining it is pretty much a full time job. Despite extensive tuning of the apply processes and over a hundred oracle patches, our logical is usually 3 - 5 hours behind live thus making it useless as a failover, and barely adequate for reporting. We have also had to skip a lot of the tables that incur large amounts of dml and refresh these once a day. So my view and experience of logical standby is that it is one to avoid - If you're after a reporting system, buy a reporting system. If you want a failover, use physical standby.

We are also planning logical DG setup. Please let me know which version of DG you are refering to.


i gotted the reply regarding physical and logical database.


i have a request that if you hav much more matter available on this topic then plz send me.

than you very mouch.



Great article, one comment -- you say the standby redo logs must equal the primary's redo logs in number. This is true about their size but not the number of groups/logs. Oracle actually recommends that you have a minimum of N + 1 standby redo log groups (for N primary redo log groups). Or, if you are using RAC, then (number of threads) + N. If you only have N standby redo log groups, then you may run into this error under high load when sufficient standby redo log space for incoming transactions cannot be found:

RFS[89]: No standby redo logfiles of size 203806 blocks available


Note that this section also says you may want to configure even more than N+1 for logical standbys to deal with load.