Database Journal
MS SQL Oracle DB2 Access MySQL PostgreSQL Sybase PHP SQL Etc SQL Scripts & Samples Tips Database Forum Rss Feed

» Database Journal Home
» Database Articles
» Database Tutorials
MS Access
SQL Scripts & Samples
» Database Forum
» Slideshows
Free Newsletters:

News Via RSS Feed

Rss Feed

Database Journal |DBA Support |SQLCourse |SQLCourse2

Featured Database Articles


Posted Jun 14, 2007

Manual Standby Database under Oracle Standard Edition

By Sean Hull

Oracle's Standby technology has been rebranded as DataGuard in recent versions of Oracle. Oracle has added a layer of technology automation on top of the standby technology, making automatic Standby technology seamless. But what about the folks on Standard Edition Oracle? Are they left out in the cold?

Well, it turns out that it is still possible to create a *manual* standby database on Oracle SE. Here's how you do it.

1. First you need to create the initial standby database. Here are the steps to do that:

a. Put the primary database in archivelog mode, if it is not already, and add at least LOG_ARCHIVE_DEST and LOG_ARCHIVE_START to your init.ora.


b. Next, create a hotbackup of the primary database. Although you can do this with RMAN, it is probably easiest to just do it manually so you know what is going on. For each tablespace do:

SQL> alter tablespace EXAMPLE begin backup;
SQL> !cp example01.dbf /my/db/backup/
SQL> !cp example02.dbf /my/db/backup/
SQL> !cp example03.dbf /my/db/backup/
SQL> alter tablespace EXAMPLE end backup;

In the above example, the '!' symbol tells sqlplus to run the command from the shell, so we're using the Unix 'cp' command to make copies of those files (which are now frozen in backup mode) in another location.

c. Now, create a standby controlfile from primary database:


d. At this point, you want to copy everything over to the standby server including datafiles, standby controlfile & config files:

$ scp /my/db/backup/*.dbf oracle@

e. From the standby machine, edit the standby init.ora file. Use this parameter to tell Oracle where files on the primary database will be located on the standby. For example if you had files in /ora/oracle on primary, and they are moved to /export/home/oracle on standby, this would work for you:


Note that you can use MULTIPLE pairs of values here, if you have files in different locations. Alternatively, you can startup and mount the standby database then issue:

SQL> alter database rename file '/ora/oracle/myfile.dbf' to /export/home/oracle/myfile.dbf' as an example.

Now you're also likely to have a new location for your archived redo log files, and that's where the parameter LOG_FILE_NAME_CONVERT comes into play.

Important note, neither of these two parameters work for the ONLINE redolog files. Those you will have to rename yourself. If you do not do so, you will get an error at the time you try to SWITCHOVER your standby database. Such errors are easily remedied by running that command.

f. Now, it's time to start the standby instance and mount it.

SQL> startup nomount pfile=/export/home/oracle/admin/SEAN/pfile/initSEAN.standby
SQL> atler database mount standby database;

g. Almost there. Lastly, we need to recover the standby database using the AUTO option. Note that you should build a simple shell script to startup sqlplus and run these commands. A name like manual_standby.sh would work well. You can then run this periodically, say every half hour, from cron to apply any new archived redolog files that have showed up via move_standby.sh below.

SQL> recover standby database;

h. Now, of course, you'll want to test your standby database. You do this by starting up in read-only mode.

SQL> alter database open read only;

i. Don't forget to put it back in standby mode so that when your manual_standby.sh script runs from cron, it won't return errors.

SQL> shutdown immediate;
SQL> startup nomount pfile=/export/home/oracle/admin/SEAN/pfile/initSEAN.standby
SQL> atler database mount standby database;

2. What scripts should run via cron on the primary and standby database?

As we mentioned earlier, a script called manual_standby.sh would work well on the standby database. This script applies new archived redologs that have arrived from the production system. Run it every half hour and see how that works for you. The database must be mounted in standby mode (not read-only) or this script will fail.

You'll also want a script on the production server. Name it move_standby.sh, and run it every thirty minutes to start with. This can use rsync to move redolog files from production to standby. A command like this would work:

$ rsync -e ssh -Pazv /ora/oracle/arch/ oracle@remote:/export/home/oracle/arch/

Note that you may want to adjust options to ssh to your needs. In addition, this presumes you have ssh autologin configured. Read up on the ssh-keygen command. The .ssh directory contains a public key, which is shipped over to the standby machine, and put in the "authorized_keys" file. ssh will then login without a password. Rsync uses ssh as the transport mechanism, so it also executes without a password. Rsync is very smart and only copies blocks and pieces of files that are different, so it is very fast, and also does checksums to guarantee consistency.

3. Is the standby database behind the production database?

Yes, keep in mind we are creating a manual standby database. The standby database will tend to be behind production by about half the size of a redolog file. So if those files are 100M, and you generate 100M of transactions in 30 minutes, then on average standby will be fifteen minutes behind.

4. What types of changes and statements on production will not be automatically applied to standby?

In database parlance, any PHYSICAL changes to the db, plus any commands, issues with the NOLOGGING option. Physical changes include creation of new tablespaces, adding new datafiles, renaming datafiles, autosizing of datafiles, altering redolog files, altering controlfiles and so on. In addition, primary database processes or commands using the UNRECOVERABLE option will not be propagated to the standby database.

There are specific and detailed instructions for making some of these physical changes on the standby db manually, however in many cases recreating the entire standby database per the instructions above, might be the best option.

5. How can we verify that the standby database is up to date?

If you already have the manual_standby.sh script running from cron, disable it.

Then login with sqlplus and issue:

SQL> alter database open read only;

Now that you have the database open read-only, run whatever SQL commands you want to in order to verify some change which you know about on production. When you are done, shutdown, and startup in standby mode again. Don't forget to reenable manual_standby.sh in the crontab.

6. What happens if the standby system restarts?

You could have it automatically start the standby database. In that case, be sure to just check the logfiles. If you want to do it manually in those instances, fire up sqlplus and then issue:

SQL> startup nomount pfile=/export/home/oracle/admin/SEAN/pfile/initSEAN.standby
SQL> alter database mount standby database;

7. What kind of messages can I expect to see in the standby alert.log?

The alert.log is going to have a lot of extra messages since we are repeatedly trying to RECOVER when there may or may not be new transaction logs. When it does this it will say, "looking for archived logfile 1_356.dbf, not found". On the other hand, if it finds it, it will say that it is applying it. You can use unix commands "grep" and "less" to scan through the alert.log file quickly.

8. What other scripts should be put in place?

a. a script to cleanup old archived redo logs on primary.

b. a script to cleanup old archived redo logs on standby

c. a script to rotate and archive the alert.log file when it gets large

d. a script to watch the alert.log file for ORA-xxxxx errors and report them to nagios if it finds any (on both primary and standby)

e. a script to login (via ssh autologin) and check what the latest archived redolog file is, and then also login to the standby and check the alert.log file to verify that those transactions have been applied.

9. How do we switchover in the event of a failure of the primary?

Switchover *can* be done with a script, however I recommend with our manual standby database that you (a) monitor for emergencies on production and (b) manually perform the failover if necessary. This will avoid false positives. Also, it allows you to ship additional redolog data if you have it available from production.

The switchover is a two-step process.

a. Apply remaining redo as we have done before with commands in manual_standby.sh.

b. Startup the database normally, in a read-write mode.

10. What network changes need to happen to failover?

The listener.ora file should be already configured. You can use the same config as primary with a different IP, or you can give this db a different tnsname. For instance, you could call primary SEANA and standby SEANB. Then in your application server configs, when you failover, your database connection configurations need to be updated to point to SEANB. The app servers will probably also need to be restarted at this point.

11. Why can't the primary ship redologs and synchronous changes?

Basically they call it a *manual* standby database for a reason. DataGuard supports options that look like the following:


Again, these are not available in Oracle SE.

12. Once we've failed over, how do we switch back to the primary?

Switching back to the primary database involves these steps:

a. Follow the steps in item 1 above to create a standby database on what was the primary system.

b. If you want to be perfectly clean syncing, do the following:

SQL> shutdown immediate
SQL> startup restrict
SQL> alter system switch logfile
SQL> shutdown immediate

c. Copy over the last archived redolog files

d. Apply them and switchover as described in item 8 above.

13. Are there special init.ora parameters? What makes our standby database special?

The main two things that make it a standby database are:

a. The standby control file (created from primary)

- alter database create standby controlfile as '/my/path/to/standby.ctl

b. The process of mounting as a standby database

- startup nomount pfile=standby.ora

- alter database mount standby database;

There are of course some init.ora parameters which are special for the standby database as well:


So if you do a "shutdown immediate" on the standby, you would start again with:

SQL> startup nomount pfile=/export/home/oracle/admin/SEAN/pfile/initSEAN.standby
SQL> alter database mount standby database;   


Standby database technology in Oracle is a powerful high availability solution. Even if you're using Oracle SE, you can still take advantage of these features built into Oracle, with just a little scripting, hand holding, and ample monitoring. Do your research, test, test, and test again on a development server. And don't forget to monitor all your logfiles for errors. Following these guidelines, you should be in very good shape, at a much lower cost.

» See All Articles by Columnist Sean Hull

Oracle Archives

Latest Forum Threads
Oracle Forum
Topic By Replies Updated
Oracle Data Mining: Classification jan.hasller 0 July 5th, 07:19 AM
Find duplicates - Unique IDs Lava 5 July 2nd, 08:30 AM
no matching unique or primary key rcanter 1 April 25th, 12:32 PM
Update values of one table based on condition of values in other table using Trigger Gladiator 3 February 29th, 06:01 PM