An Introduction to Rman With Examples

43
An introduction to rman with examples. For beginners and non, rman is one of the most obscure Oracle tools, but in reality it is based on quite simple principles. It is true, though, that a restoration can be distructive for a database. Why is rman dangerous? rman is dangerous because it works at the database physical level; to understand why, let's say that rman is not "too" different from WinZip. Since everybody knows WinZip, it will probably be easier to understand rman. Is WinZip dangerous? The creation of a zip archive is not dangerous, unless you choose the same name for the output file, or the archive is so big that you fill a device or the temporary directory etc. The same thing can be said about rman: taking an rman backup cannot be dangerous (unless you stop the database, or close it intentionally) and you don't overwrite previous backups (you can prevent it). rman creates a compressed backup of the physical database files, including controlfiles, datafiles, archived logs and stores them somewhere. This somewhere can be a disk (like WinZip) or a tape. Therefore, the first important point to remember is: rman creates compressed backups of the physical database; if you prefer, rman zips the database, entirely or not. Is Unzip dangerous? Unzip, on the other hand, can be very dangerous. The risk is overwriting files that should not be overwritten and, therefore, losing important content. The very same applies to rman restores: since they overwrite database files, you should know whether this is the right decision because, otherwise, you may lose your data. This is the main difference between an import and an rman restoration: an rman restoration (restore) overwrites one or more datafiles; this means WATCH OUT. Our first rman backup The only requirements for taking simple, useful rman backups are two: You database is in archivelog mode You have enough disk space somewhere On our Windows 2000 workstation we open a CMD window and type the following few lines: E:\>rman target /

description

An Introduction to Rman With Examples

Transcript of An Introduction to Rman With Examples

Page 1: An Introduction to Rman With Examples

An introduction to rman with examples.

For beginners and non, rman is one of the most obscure Oracle tools, but in reality it is based on quite simple principles. It is true, though, that a restoration can be distructive for a database.

Why is rman dangerous?

rman is dangerous because it works at the database physical level; to understand why, let's say that rman is not "too" different from WinZip. Since everybody knows WinZip, it will probably be easier to understand rman.

Is WinZip dangerous?

The creation of a zip archive is not dangerous, unless you choose the same name for the output file, or the archive is so big that you fill a device or the temporary directory etc. The same thing can be said about rman: taking an rman backup cannot be dangerous (unless you stop the database, or close it intentionally) and you don't overwrite previous backups (you can prevent it).rman creates a compressed backup of the physical database files, including controlfiles, datafiles, archived logs and stores them somewhere. This somewhere can be a disk (like WinZip) or a tape.Therefore, the first important point to remember is:

rman creates compressed backups of the physical database; if you prefer, rman zips the database, entirely or not.

Is Unzip dangerous?

Unzip, on the other hand, can be very dangerous. The risk is overwriting files that should not be overwritten and, therefore, losing important content. The very same applies to rman restores: since they overwrite database files, you should know whether this is the right decision because, otherwise, you may lose your data. This is the main difference between an import and an rman restoration: an rman restoration (restore) overwrites one or more datafiles; this means WATCH OUT.

Our first rman backup

The only requirements for taking simple, useful rman backups are two: You database is in archivelog mode You have enough disk space somewhere

On our Windows 2000 workstation we open a CMD window and type the following few lines: E:\>rman target /

Recovery Manager: Release 9.2.0.1.0 - Production

Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.

connected to target database: ARK9201 (DBID=3564144589)

run { allocate channel t1 type disk; backup database format 'E:\RMAN_BACKUPS\ARK9201\%d_%u_%s';

Page 2: An Introduction to Rman With Examples

release channel t1;}

using target database controlfile instead of recovery catalogallocated channel: t1channel t1: sid=9 devtype=DISK

Starting backup at 10-DEC-04channel t1: starting full datafile backupsetchannel t1: specifying datafile(s) in backupsetincluding current SPFILE in backupsetincluding current controlfile in backupsetreleased channel: t1RMAN-00571: ===========================================================RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============RMAN-00571: ===========================================================RMAN-03009: failure of backup command on t1 channel at 12/10/2004 14:28:50ORA-19602: cannot backup or copy active file in NOARCHIVELOG modeAs we said, the database must be in archive mode if we want to backup open databases. A separate articles explains why it must be so, because it is not so obvious.

SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.

Total System Global Area 135338868 bytesFixed Size 453492 bytesVariable Size 109051904 bytesDatabase Buffers 25165824 bytesRedo Buffers 667648 bytesDatabase mounted.SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.Let's now repeat the operation having put the database in archive mode Choosing C:\Temp as directory for the backup is, of course, a very bad idea. Backups are gold and shoud be kept on a dedicated device; a good name could be E:\RMAN_BACKUPS\SID E:\>rman target /

Recovery Manager: Release 9.2.0.1.0 - Production

Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.

connected to target database: ARK9201 (DBID=3564144589)

RMAN> run {2> allocate channel t1 type disk;3> backup database format 'E:\RMAN_BACKUPS\ARK9201\%d_%u_%s';4> release channel t1;

Page 3: An Introduction to Rman With Examples

5> }

allocated channel: t1channel t1: sid=12 devtype=DISK

Starting backup at 26-DEC-04channel t1: starting full datafile backupsetchannel t1: specifying datafile(s) in backupsetincluding current SPFILE in backupsetincluding current controlfile in backupsetinput datafile fno=00001 name=E:\ORACLE\ORADATA\ARK920\SYSTEM01.DBFinput datafile fno=00002 name=E:\ORACLE\ORADATA\ARK920\UNDOTBS01.DBFinput datafile fno=00004 name=E:\ORACLE\ORADATA\ARK920\EXAMPLE01.DBFinput datafile fno=00009 name=E:\ORACLE\ORADATA\ARK920\XDB01.DBFinput datafile fno=00005 name=E:\ORACLE\ORADATA\ARK920\INDX01.DBFinput datafile fno=00008 name=E:\ORACLE\ORADATA\ARK920\USERS01.DBFinput datafile fno=00003 name=E:\ORACLE\ORADATA\ARK920\DRSYS01.DBFinput datafile fno=00006 name=E:\ORACLE\ORADATA\ARK920\ODM01.DBFinput datafile fno=00007 name=E:\ORACLE\ORADATA\ARK920\TOOLS01.DBFchannel t1: starting piece 1 at 26-DEC-04channel t1: finished piece 1 at 26-DEC-04piece handle=E:\RMAN_BACKUPS\ARK9201\ARK920_03G8KC6G_3 comment=NONEchannel t1: backup set complete, elapsed time: 00:25:58Finished backup at 26-DEC-04

released channel: t1The resulting backup file(s) are in our case dir c:\rman_backups\ark9201 Volume in drive C is 80-01-14A2 Volume Serial Number is 64DA-0BF7

Directory of c:\rman_backups\ark9201

12/26/2004 02:29p .12/26/2004 02:29p ..12/26/2004 02:44p 418,471,936 ARK920_03G8KC6G_3

Our first archive backup

Taking only the database backup is not enough, for reasons that will be clear later. We must take a backup of the archived log as well, and the command is very similar RMAN> run {2> allocate channel t1 type disk;3> backup archivelog all delete input format 'C:\RMAN_BACKUPS\ARK9201\arch_%d_%u_%s';4> release channel t1;5> }

allocated channel: t1channel t1: sid=12 devtype=DISK

Starting backup at 26-DEC-04current log archivedchannel t1: starting archive log backupsetchannel t1: specifying archive log(s) in backup setinput archive log thread=1 sequence=77 recid=1 stamp=545945036

Page 4: An Introduction to Rman With Examples

input archive log thread=1 sequence=78 recid=2 stamp=545945039input archive log thread=1 sequence=79 recid=3 stamp=545945099channel t1: starting piece 1 at 26-DEC-04channel t1: finished piece 1 at 26-DEC-04piece handle=C:\RMAN_BACKUPS\ARK9201\ARCH_ARK920_04G8KTGL_4 comment=NONEchannel t1: backup set complete, elapsed time: 00:00:37channel t1: deleting archive log(s)archive log filename=E:\ORA920\RDBMS\ARC00077.001 recid=1 stamp=545945036archive log filename=E:\ORA920\RDBMS\ARC00078.001 recid=2 stamp=545945039archive log filename=E:\ORA920\RDBMS\ARC00079.001 recid=3 stamp=545945099Finished backup at 26-DEC-04

released channel: t1

RMAN>

rman on UNIX

rman works the same way on a UNIX server, using an appropriate directory format:

RMAN> run { allocate channel t1 type disk;2> backup database format '/u01/oracle/archive/%d_%u_%s';3> backup current controlfile format '/u01/oracle/archive/%d_%u_%s';4> release channel t1;}

using target database controlfile instead of recovery catalogallocated channel: t1channel t1: sid=26 devtype=DISK

Starting backup at 14:29:22 18-jan-2005channel t1: starting full datafile backupsetchannel t1: specifying datafile(s) in backupsetinput datafile fno=00001 name=/u01/oradata/ORA920/system01.dbfinput datafile fno=00002 name=/u02/oradata/ORA920/undo01.dbfinput datafile fno=00004 name=/u01/oradata/OMF_DATA_ORA920/o1_mf_tbs_data_0ybcd28z_.dbfinput datafile fno=00003 name=/u01/oradata/OMF_DATA_ORA920/o1_mf_tools_0ybbwkp7_.dbfinput datafile fno=00005 name=/u01/oradata/ORA920/oem_repository.dbfchannel t1: starting piece 1 at 14:29:24 18-jan-2005channel t1: finished piece 1 at 14:31:10 18-jan-2005piece handle=/u01/oracle/archive/ORA920_01gah0q3_1 comment=NONEchannel t1: backup set complete, elapsed time: 00:01:48Finished backup at 14:31:11 18-jan-2005

Starting backup at 14:31:11 18-jan-2005channel t1: starting full datafile backupsetchannel t1: specifying datafile(s) in backupsetincluding current controlfile in backupsetchannel t1: starting piece 1 at 14:31:15 18-jan-2005channel t1: finished piece 1 at 14:31:18 18-jan-2005piece handle=/u01/oracle/archive/ORA920_02gah0th_2 comment=NONEchannel t1: backup set complete, elapsed time: 00:00:05

Page 5: An Introduction to Rman With Examples

Finished backup at 14:31:18 18-jan-2005

Starting Control File Autobackup at 14:31:18 18-jan-2005piece handle=/optware/oracle/9.2.0.1/dbs/c-2554142925-20050118-00 comment=NONEFinished Control File Autobackup at 14:31:22 18-jan-2005

released channel: t1

RMAN> host ;

oracle@edc-se[on pts/4] ls -ltr /u01/oracle/archive/total 562128-rw-r----- 1 oracle dba 282476544 Jan 18 14:31 ORA920_01gah0q3_1-rw-r----- 1 oracle dba 5177344 Jan 18 14:31 ORA920_02gah0th_2oracle@edc-se[on pts/4] exithost command complete

Backup the controlfile

RMAN> run { allocate channel t1 type disk;2> backup current controlfile format '/u01/oracle/archive/controlf_%d_%u_%s';3> release channel t1;}

allocated channel: t1channel t1: sid=26 devtype=DISK

Starting backup at 14:33:59 18-jan-2005channel t1: starting full datafile backupsetchannel t1: specifying datafile(s) in backupsetincluding current controlfile in backupsetchannel t1: starting piece 1 at 14:34:00 18-jan-2005channel t1: finished piece 1 at 14:34:03 18-jan-2005piece handle=/u01/oracle/archive/controlf_ORA920_04gah12n_4 comment=NONEchannel t1: backup set complete, elapsed time: 00:00:04Finished backup at 14:34:03 18-jan-2005

Starting Control File Autobackup at 14:34:03 18-jan-2005piece handle=/optware/oracle/9.2.0.1/dbs/c-2554142925-20050118-01 comment=NONEFinished Control File Autobackup at 14:34:07 18-jan-2005

released channel: t1Here is a backup of archived log files

RMAN> run { allocate channel t1 type disk;2> backup archivelog all format '/u01/oracle/archive/archive_%d_%u_%s' delete input;3> release channel t1;}

allocated channel: t1channel t1: sid=26 devtype=DISK

Starting backup at 14:42:00 18-jan-2005

Page 6: An Introduction to Rman With Examples

current log archivedchannel t1: starting archive log backupsetchannel t1: specifying archive log(s) in backup setinput archive log thread=1 sequence=9 recid=1 stamp=547477014input archive log thread=1 sequence=10 recid=2 stamp=547562627input archive log thread=1 sequence=11 recid=3 stamp=547562680input archive log thread=1 sequence=12 recid=4 stamp=547580133input archive log thread=1 sequence=13 recid=5 stamp=547623518input archive log thread=1 sequence=14 recid=6 stamp=547744760input archive log thread=1 sequence=15 recid=7 stamp=547865707input archive log thread=1 sequence=16 recid=8 stamp=547915324channel t1: starting piece 1 at 14:42:08 18-jan-2005channel t1: finished piece 1 at 14:43:03 18-jan-2005piece handle=/u01/oracle/archive/archive_ORA920_06gah1hv_6 comment=NONEchannel t1: backup set complete, elapsed time: 00:00:56channel t1: deleting archive log(s)archive log filename=/optware/oracle/admin/ORA920/arch/ORA920_1_9.arc recid=1 stamp=547477014archive log filename=/optware/oracle/admin/ORA920/arch/ORA920_1_10.arc recid=2 stamp=547562627archive log filename=/optware/oracle/admin/ORA920/arch/ORA920_1_11.arc recid=3 stamp=547562680archive log filename=/optware/oracle/admin/ORA920/arch/ORA920_1_12.arc recid=4 stamp=547580133archive log filename=/optware/oracle/admin/ORA920/arch/ORA920_1_13.arc recid=5 stamp=547623518archive log filename=/optware/oracle/admin/ORA920/arch/ORA920_1_14.arc recid=6 stamp=547744760archive log filename=/optware/oracle/admin/ORA920/arch/ORA920_1_15.arc recid=7 stamp=547865707archive log filename=/optware/oracle/admin/ORA920/arch/ORA920_1_16.arc recid=8 stamp=547915324Finished backup at 14:43:04 18-jan-2005

Starting Control File Autobackup at 14:43:04 18-jan-2005piece handle=/optware/oracle/9.2.0.1/dbs/c-2554142925-20050118-02 comment=NONEFinished Control File Autobackup at 14:43:09 18-jan-2005

released channel: t1

The rman clauses from logseq and until logseq

Sometimes you will want to backup only certain archived logs and not all. This is the case, for example, when you ran out of space and you were forced to move the archived logs on disk onto another directory. In this case the clause "archivelog all" would give an error, because rman will not be able to find the files.

run { allocate channel dev1 type 'sbt_tape'; backup archivelog from logseq 12 until logseq 15 thread 1 delete input;}Keeping an eye on the list above, the command would back up the archived redo logs from ORA920_1_12.arc to ORA920_1_15.arc Remember that the name depends on the parameter ... in your init.ora In our case the values is ...

Page 7: An Introduction to Rman With Examples

RMAN> show2> all;

RMAN configuration parameters are:CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # defaultCONFIGURE BACKUP OPTIMIZATION OFF; # defaultCONFIGURE DEFAULT DEVICE TYPE TO DISK; # defaultCONFIGURE CONTROLFILE AUTOBACKUP ON;CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # defaultCONFIGURE DEVICE TYPE DISK PARALLELISM 1; # defaultCONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # defaultCONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # defaultCONFIGURE MAXSETSIZE TO UNLIMITED; # defaultCONFIGURE SNAPSHOT CONTROLFILE NAME TO '/optware/oracle/9.2.0.1/dbs/snapcf_ORA920.f'; # defaultRMAN> list backupset ; List of Backup Sets===================

BS Key Type LV Size Device Type Elapsed Time Completion Time------- ---- -- ---------- ----------- ------------ --------------------1 Full 269M DISK 00:01:41 14:31:04 18-jan-2005 BP Key: 1 Status: AVAILABLE Tag: TAG20050118T142923 Piece Name: /u01/oracle/archive/ORA920_01gah0q3_1 List of Datafiles in backup set 1 File LV Type Ckp SCN Ckp Time Name ---- -- ---- ---------- -------------------- ---- 1 Full 562946 14:29:24 18-jan-2005 /u01/oradata/ORA920/system01.dbf 2 Full 562946 14:29:24 18-jan-2005 /u02/oradata/ORA920/undo01.dbf 3 Full 562946 14:29:24 18-jan-2005 /u01/oradata/OMF_DATA_ORA920/o1_mf_tools_0ybbwkp7_.dbf 4 Full 562946 14:29:24 18-jan-2005 /u01/oradata/OMF_DATA_ORA920/o1_mf_tbs_data_0ybcd28z_.dbf 5 Full 562946 14:29:24 18-jan-2005 /u01/oradata/ORA920/oem_repository.dbf

BS Key Type LV Size Device Type Elapsed Time Completion Time------- ---- -- ---------- ----------- ------------ --------------------2 Full 4M DISK 00:00:03 14:31:16 18-jan-2005 BP Key: 2 Status: AVAILABLE Tag: TAG20050118T143112 Piece Name: /u01/oracle/archive/ORA920_02gah0th_2 Controlfile Included: Ckp SCN: 563054 Ckp time: 14:31:13 18-jan-2005

BS Key Type LV Size Device Type Elapsed Time Completion Time------- ---- -- ---------- ----------- ------------ --------------------3 Full 4M DISK 00:00:02 14:31:20 18-jan-2005 BP Key: 3 Status: AVAILABLE Tag: Piece Name: /optware/oracle/9.2.0.1/dbs/c-2554142925-20050118-00 Controlfile Included: Ckp SCN: 563071 Ckp time: 14:31:18 18-jan-2005

BS Key Type LV Size Device Type Elapsed Time Completion Time------- ---- -- ---------- ----------- ------------ --------------------

Page 8: An Introduction to Rman With Examples

4 Full 4M DISK 00:00:03 14:34:02 18-jan-2005 BP Key: 4 Status: AVAILABLE Tag: TAG20050118T143359 Piece Name: /u01/oracle/archive/controlf_ORA920_04gah12n_4 Controlfile Included: Ckp SCN: 563233 Ckp time: 14:33:59 18-jan-2005

BS Key Type LV Size Device Type Elapsed Time Completion Time------- ---- -- ---------- ----------- ------------ --------------------5 Full 4M DISK 00:00:02 14:34:06 18-jan-2005 BP Key: 5 Status: AVAILABLE Tag: Piece Name: /optware/oracle/9.2.0.1/dbs/c-2554142925-20050118-01 Controlfile Included: Ckp SCN: 563233 Ckp time: 14:33:59 18-jan-2005

BS Key Size Device Type Elapsed Time Completion Time------- ---------- ----------- ------------ --------------------6 203M DISK 00:00:56 14:43:03 18-jan-2005 BP Key: 6 Status: AVAILABLE Tag: TAG20050118T144206 Piece Name: /u01/oracle/archive/archive_ORA920_06gah1hv_6

List of Archived Logs in backup set 6 Thrd Seq Low SCN Low Time Next SCN Next Time ---- ------- ---------- -------------------- ---------- --------- 1 9 118838 12:18:25 13-jan-2005 124198 12:56:51 13-jan-2005 1 10 124198 12:56:51 13-jan-2005 208951 12:43:38 14-jan-2005 1 11 208951 12:43:38 14-jan-2005 209145 12:44:30 14-jan-2005 1 12 209145 12:44:30 14-jan-2005 227914 17:35:21 14-jan-2005 1 13 227914 17:35:21 14-jan-2005 271564 05:38:29 15-jan-2005 1 14 271564 05:38:29 15-jan-2005 392830 15:19:13 16-jan-2005 1 15 392830 15:19:13 16-jan-2005 514138 00:55:00 18-jan-2005 1 16 514138 00:55:00 18-jan-2005 563727 14:42:00 18-jan-2005

BS Key Type LV Size Device Type Elapsed Time Completion Time------- ---- -- ---------- ----------- ------------ --------------------7 Full 4M DISK 00:00:02 14:43:07 18-jan-2005 BP Key: 7 Status: AVAILABLE Tag: Piece Name: /optware/oracle/9.2.0.1/dbs/c-2554142925-20050118-02 Controlfile Included: Ckp SCN: 563788 Ckp time: 14:43:03 18-jan-2005

RMAN>

Are we sure that our backups do not contain corrupted blocks

There is, of course, little point in taking backups if we don't know whether they are physically usable, i.e. all their blocks are clean. rman offer the command validate RMAN> validate backupset 6;

Page 9: An Introduction to Rman With Examples

allocated channel: ORA_DISK_1channel ORA_DISK_1: sid=26 devtype=DISKchannel ORA_DISK_1: starting validation of archive log backupsetchannel ORA_DISK_1: restored backup piece 1piece handle=/u01/oracle/archive/archive_ORA920_06gah1hv_6 tag=TAG20050118T144206 params=NULLchannel ORA_DISK_1: validation complete

RMAN> validate backupset 5;

using channel ORA_DISK_1channel ORA_DISK_1: starting validation of datafile backupsetchannel ORA_DISK_1: restored backup piece 1piece handle=/optware/oracle/9.2.0.1/dbs/c-2554142925-20050118-01 tag=null params=NULLchannel ORA_DISK_1: validation complete

RMAN> validate backupset 4;

using channel ORA_DISK_1channel ORA_DISK_1: starting validation of datafile backupsetchannel ORA_DISK_1: restored backup piece 1piece handle=/u01/oracle/archive/controlf_ORA920_04gah12n_4 tag=TAG20050118T143359 params=NULLchannel ORA_DISK_1: validation complete

Clause not backed up since time

There are cases when backups fail and the stand becomes unclear. To avoid any risk the clause not backed up since time can be used. This commands makes rman save only the datafiles (or the archived logs) that haven't be backed up for a certain span of time and skip the rest. RMAN> run { allocate channel t1 type disk;2> backup database format '/u01/oracle/archive/%d_%u_%s' not backed up since time 'sysdate -5';3> release channel t1;}

allocated channel: t1channel t1: sid=25 devtype=DISK

Starting backup at 15:41:31 21-jan-2005skipping datafile 1; already backed up on 20:38:51 18-jan-2005skipping datafile 2; already backed up on 20:38:51 18-jan-2005skipping datafile 3; already backed up on 20:38:51 18-jan-2005skipping datafile 4; already backed up on 20:38:51 18-jan-2005skipping datafile 5; already backed up on 20:38:51 18-jan-2005Finished backup at 15:41:33 21-jan-2005

released channel: t1An examples on how to restore a data file can be found on the first article about restoration

The basics of an rman restoreCare is needed for rman restores because they will normally overwrite existing datafiles; before taking any action it is

Page 10: An Introduction to Rman With Examples

imperative to understand why a restore is needed and how to proceed.In our opinion it is better to explain basic rman concepts with understandable examples.

Example 1: a restoration is needed because a datafile is lost.

1. In order to restore a database or a data file some kind of backup must have been taken; in our exaple, let's suppose that our database consists of three datafiles and that a backup is taken on Mar 10th 2005 in the afternoon.

">

The stand of the datafiles can differ because in general it is not guaranteed that the very last changes in the database have actually been written to disk. This is why the timestamps 15:09 and 15:15 have been used in the picture.

2. During the week archive log backups are taken daily, for example to tape using the command:

run { allocate channel t1 type 'sbt_tape'; backup archivelog all delete input; release channel t1;

}

Page 11: An Introduction to Rman With Examples

3. A week later a disk crashes and the database file number 3 is lost:

Page 12: An Introduction to Rman With Examples

In this example, it must be understood that only the DBFile3 has to be restored, without overwriting the datafiles that have not been affected by the crash, or a week’s work would be lost.The tablespace containing the damaged file should be put offline with the SQLPLUS command: SQLPLUS / AS SYSDBA ALTER TABLESPACE this_tbs OFFLINE IMMEDIATE;

rman target / catalog rman@MYCATALOG rman> run { allocate channel t1 type 'sbt_tape';

restore tablespace this_tbs;release channel t1;

}If we are sure that only the datafile 3 has been damaged and not the rest of the tablespace this_tbs, we could use instead: rman> run { allocate channel t1 type 'sbt_tape';

restore datafile 3;release channel t1;

}

Page 13: An Introduction to Rman With Examples

It is now obvious that we have a mish-mash of contents, with tablespace up-to-date and a tablespace my_tbs with contents as of one week before. In this situation, Oracle will refuse to bring the tablespace online, probably with the error message 'datafile 'DBFIle3' needs to be recovered'. How is it possible to bring the tablespace my_tbs at the same stand as for the other tablespaces? It is possible because we have the archive logs backups, that contain all the changes to the database made between Mar 10th and Mar 17th.The command needed is:

run { allocate channel t1 type 'sbt_tape'; recover database; release channel t1;

}During the execution of this command, rman will restore the archived redo logs and apply them to the damaged tablespace. At the end of the process the tablespace can be brought online and the database is back to normal.

Identifying Host Names and IP AddressesThis article presents a mixed bag of Oracle functionality relating to the identification of host names and IP addresses for Oracle clients and servers.

UTL_INADDR SYS_CONTEXT V$INSTANCE V$SESSION

UTL_INADDR

The UTL_INADDR package was introduced in Oracle 8.1.6 to provide a means of retrieving host names and IP addresses of remote hosts from PL/SQL.

The GET_HOST_ADDRESS function returns the IP address of the specified host name.SQL> SELECT UTL_INADDR.get_host_address('bart') FROM dual;

UTL_INADDR.GET_HOST_ADDRESS('BART')--------------------------------------------------------------------------------192.168.2.4

SQL>The IP address of the database server is returned if the specified host name is NULL or is omitted.SQL> SELECT UTL_INADDR.get_host_address from dual;

GET_HOST_ADDRESS--------------------------------------------------------------------------------192.168.2.5

SQL>An error is returned if the specified host name is not recognized.SQL> SELECT UTL_INADDR.get_host_address('banana') from dual;SELECT UTL_INADDR.get_host_address('banana') from dual

Page 14: An Introduction to Rman With Examples

*ERROR at line 1:ORA-29257: host banana unknownORA-06512: at "SYS.UTL_INADDR", line 19ORA-06512: at "SYS.UTL_INADDR", line 40ORA-06512: at line 1

SQL>The GET_HOST_NAME function returns the host name of the specified IP address.SQL> SELECT UTL_INADDR.get_host_name('192.168.2.4') FROM dual;

UTL_INADDR.GET_HOST_NAME('192.168.2.4')--------------------------------------------------------------------------------bart

SQL>The host name of the database server is returned if the specified IP address is NULL or omitted.SQL> SELECT UTL_INADDR.get_host_name FROM dual;

GET_HOST_NAME--------------------------------------------------------------------------------C4210gR2

1 row selected.

SQL>An error is returned if the specified IP address is not recognized.SQL> SELECT UTL_INADDR.get_host_name('1.1.1.1') FROM dual;SELECT UTL_INADDR.get_host_name('1.1.1.1') FROM dual *ERROR at line 1:ORA-29257: host 1.1.1.1 unknownORA-06512: at "SYS.UTL_INADDR", line 4ORA-06512: at "SYS.UTL_INADDR", line 35ORA-06512: at line 1

SQL>

SYS_CONTEXT

The SYS_CONTEXT function is able to return the following host and IP address information for the current session:

TERMINAL - An operating system identifier for the current session. This is often the client machine name.

HOST - The host name of the client machine. IP_ADDRESS - The IP address of the client machine. SERVER_HOST - The host name of the server running the database instance.

The following examples show the typical output for each variant.SQL> SELECT SYS_CONTEXT('USERENV','TERMINAL') FROM dual;

Page 15: An Introduction to Rman With Examples

SYS_CONTEXT('USERENV','TERMINAL')--------------------------------------------------------------------marge

1 row selected.

SQL> SELECT SYS_CONTEXT('USERENV','HOST') FROM dual;

SYS_CONTEXT('USERENV','HOST')--------------------------------------------------------------------marge

1 row selected.

SQL> SELECT SYS_CONTEXT('USERENV','IP_ADDRESS') FROM dual;

SYS_CONTEXT('USERENV','IP_ADDRESS')--------------------------------------------------------------------192.168.2.3

1 row selected.

SQL> SELECT SYS_CONTEXT('USERENV','SERVER_HOST') FROM dual;

SYS_CONTEXT('USERENV','SERVER_HOST')--------------------------------------------------------------------C4210gr2

1 row selected.

SQL>

V$INSTANCE

The HOST_NAME column of the V$INSTANCE view contains the host name of the server running the instance.SQL> SELECT host_name FROM v$instance;

HOST_NAME------------------------------------------------C4210gR2

1 row selected.

SQL>

V$SESSION

The V$SESSION view contains the following host information for all database sessions: TERMINAL - The operating system terminal name for the client. This is often set to the

client machine name. MACHINE - The operating system name for the client machine. This may include the

domain name if present.

The following examples show the typical output for each column.

Page 16: An Introduction to Rman With Examples

SQL> SELECT terminal, machine FROM v$session WHERE username = 'TIM_HALL';

TERMINAL MACHINE------------------------------ ----------------------------------------------------MARGE ORACLE-BASE\MARGE

1 row selected.

Oracle Flashback

Wrong DML: what to do when data is deleted by mistake.

In Oracle the rolling back a transaction is possible before the final commit or up to a savepoint, but the database offers another chance, which is probably little known, and it is the Flashback.

The essential requirement is that the database is using UNDO tablespaces and that the undo_retention is high enough. Generally speaking, rolling back the changes is only possible if the correction is made not later than the number of seconds specified by the parameter undo_retention. SQL> show parameter undo

NAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_management string AUTOundo_retention integer 1800undo_suppress_errors boolean FALSEundo_tablespace string UNDOTBS1In this example a table is created and populated

SQL> CREATE TABLE t_a (c1 number);

SQL> INSERT INTO t_a values (1);

SQL> INSERT INTO t_a values (2);

SQL> INSERT INTO t_a values (3);

1 row created.SQL> INSERT INTO t_a values (4);SQL> INSERT INTO t_a values (5);

1 row created.

SQL> COMMIT;

Commit complete.

SQL> ALTER SESSION SET NLS_DATE_FORMAT ='hh24:mi:ss dd-mon-yyyy';

Page 17: An Introduction to Rman With Examples

Session altered.

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE--------------------12:53:43 31-dec-2004

SQL> DELETE t_a;

5 rows deleted

SQL> COMMITCommit completed

SQL> SELECT COUNT(*) FROM t_a;

COUNT(*)---------- 0

The deletion was a blunder and the problem is realized 20 minutes later; since the undo_retention is 1800 seconds (30 minutes) it is probably still possible to rescue the data using the close "AS OF TIMESTAMP" and specifying a time interval in the past.

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE--------------------13:11:20 31-dec-2004

SQL> SELECT * FROM t_a 2 AS OF TIMESTAMP (sysdate - interval '30' minute);

C1---------- 1 2 3 4 5

By specifying SELECT AS OF TIMESTAMP we are still able to access the records that have been deleted, even if the table is now empty.

SQL> SELECT COUNT(*) FROM t_a;

COUNT(*)---------- 0

SQL> CREATE TABLE t_b AS (SELECT * FROM t_a AS OF TIMESTAMP (SYSDATE - INTERVAL '30' MINUTE);

Page 18: An Introduction to Rman With Examples

Table created.

SQL> SELECT COUNT(*) FROM t_b;

COUNT(*)---------- 5

SQL> SELECT * FROM t_b;

C1---------- 1 2 3 4 5

It was therefore possible to restore the contents as they were 20 minutes before. If the table is dropped, unfortunately no rollback is possible. SQL>SQL> DROP TABLE t_a;

Table dropped.

SQL> CREATE TABLE t_c AS (SELECT * FROM t_a AS OF TIMESTAMP (SYSDATE - INTERVAL '40' MINUTE)); CREATE TABLE t_c AS (SELECT * FROM t_a AS OF TIMESTAMP (SYSDATE - INTERVAL '40' MINUTE)) *ERROR at line 1:ORA-00942: table or view does not existThe Oracle Flashback is therefore one of the ways of restoring deleted or wrongly updated records; another tool is the Oracle LogMiner, which offers a graphical interface.

Understanding checkpoints, system change number SCN and recovery

How does Oracle know that a database needs recovering? What checks does it carry out when a database is opened? This article explains a couple of common cases of Oracle recovery and the role of the system change number SCN in the recovery.

What is the SCN system change number?

Page 19: An Introduction to Rman With Examples

Every modification in the database (for example, an update) is given an unique system change number SCN, which is, therefore, an ever increasing integer. The latest SCN is immediately recorded in the controlfile.

The modifications are logged in the online redo log by the log writer LGWR, but not necessarily in the datafiles. Infact, there are times when the modified data is still in memory in a block that has become "dirty", meaning that it no longer contains the same data as the block in the datafile.

There are moments, though, when all modifications are written onto all the datafiles: this happens by a checkpoint, shutdown of the database, when a redo log is switched.At that point the header of the datafiles is updated with the SCN of the system, which will be the same as recorded in the controlfile. The Oracle process CKPT (the checkpoint process) is responsible for this update. When the checkpoint is completed the database reaches a "consistent" state, meaning that it is clean, there is no contraddiction between the SCN and timestamps of the various components.

The V$DATAFILE_HEADER dynamic view

For the purpose of our discussion, it is important to familiarise ourselves with the dynamic view V$DATAFILE_HEADER, which contains the information that Oracle writes in the datafile headers.

SQL> descr V$DATAFILE_HEADER Name Null? Type ----------------------------------------- -------- ---------------------------- FILE# NUMBER STATUS VARCHAR2(7) ERROR VARCHAR2(18) FORMAT NUMBER RECOVER VARCHAR2(3) FUZZY VARCHAR2(3) CREATION_CHANGE# NUMBER CREATION_TIME DATE TABLESPACE_NAME VARCHAR2(30) TS# NUMBER RFILE# NUMBER RESETLOGS_CHANGE# NUMBER RESETLOGS_TIME DATE CHECKPOINT_CHANGE# NUMBER CHECKPOINT_TIME DATE CHECKPOINT_COUNT NUMBER BYTES NUMBER BLOCKS NUMBER NAME VARCHAR2(513)SQL> column CHECKPOINT_CHANGE# format 99999999999999SQL> select FILE#, CHECKPOINT_TIME, CHECKPOINT_CHANGE# from V$DATAFILE_HEADER;

FILE# CHECKPOINT_TIME CHECKPOINT_CHANGE#---------- -------------------- ------------------ 1 13:47:58 02-AUG-2004 6488359

Page 20: An Introduction to Rman With Examples

2 13:47:58 02-AUG-2004 6488359 3 13:47:58 02-AUG-2004 6488359 4 13:47:58 02-AUG-2004 6488359 5 13:47:58 02-AUG-2004 6488359 6 13:47:58 02-AUG-2004 6488359 8 13:47:58 02-AUG-2004 6488359 9 13:47:58 02-AUG-2004 64883598 rows selected.The view v$database contains information that comes from the controlfile. SQL> descr v$database Name Null? Type ----------------------------------------- -------- ---------------------------- DBID NUMBER NAME VARCHAR2(9) CREATED DATE RESETLOGS_CHANGE# NUMBER RESETLOGS_TIME DATE PRIOR_RESETLOGS_CHANGE# NUMBER PRIOR_RESETLOGS_TIME DATE LOG_MODE VARCHAR2(12) CHECKPOINT_CHANGE# NUMBER ARCHIVE_CHANGE# NUMBER CONTROLFILE_TYPE VARCHAR2(7) CONTROLFILE_CREATED DATE CONTROLFILE_SEQUENCE# NUMBER CONTROLFILE_CHANGE# NUMBER CONTROLFILE_TIME DATE OPEN_RESETLOGS VARCHAR2(11) VERSION_TIME DATE OPEN_MODE VARCHAR2(10) PROTECTION_MODE VARCHAR2(20) PROTECTION_LEVEL VARCHAR2(20) REMOTE_ARCHIVE VARCHAR2(8) ACTIVATION# NUMBER DATABASE_ROLE VARCHAR2(16) ARCHIVELOG_CHANGE# NUMBER SWITCHOVER_STATUS VARCHAR2(18) DATAGUARD_BROKER VARCHAR2(8) GUARD_STATUS VARCHAR2(7) SUPPLEMENTAL_LOG_DATA_MIN VARCHAR2(3) SUPPLEMENTAL_LOG_DATA_PK VARCHAR2(3) SUPPLEMENTAL_LOG_DATA_UI VARCHAR2(3) FORCE_LOGGING VARCHAR2(3)

SQL> select CONTROLFILE_CHANGE# from v$database;

CONTROLFILE_CHANGE#------------------- 6488361

SQL> select CHECKPOINT_CHANGE# from v$database;

CHECKPOINT_CHANGE#------------------ 6488359

Page 21: An Introduction to Rman With Examples

We notice that the CHECKPOINT_CHANGE# in the datafile headers is identical to the CHECKPOINT_CHANGE# in the controlfile(s) because when the queries were executed, the database had just been opened..

1 case: datafile that needs recovery

To understand how things work, let's make a couple of experiments. Warning: these are operation that should be avoided in real life. Their sole purpose here is to explain the concept, they are not recommended procedures.

Being on UNIX, it is possible to make copies of datafiles and controlfiles when the database is open. Since we don't want to break anything, our database is in archive mode, we have already taken a good rman backup and we are therefore ready to restore if something goes wrong.These are the steps of our exercise to simulate the restore and recovery of a datafile:

1. A copy of one of the datafiles is taken. 2. Normal activity continues. 3. The database is closed.

Page 22: An Introduction to Rman With Examples

4. The copy taken at step 1 is put back onto its original place; this file is therefore "older" than the others (even if the timestamp might be more recent)

5. The database is open

Let's have a look at our test database: 1* select file#, name from v$datafile

FILE# NAME---------- -------------------------------------------------------------------------------- 1 /u05/oradata/DEVDB/system01DEVDB.dbf 2 /u04/oradata/DEVDB/rbs01DEVDB.dbf 3 /u05/oradata/DEVDB/temp01DEVDB.dbf 4 /u04/oradata/DEVDB/tools01DEVDB.dbf 5 /u05/oradata/DEVDB/users01DEVDB.dbf 6 /u05/oradata/DEVDB/data01DEVDB.dbf 8 /u04/oradata/DEVDB/appidx01DEVDB.dbf 9 /u05/oradata/DEVDB/appdata01DEVDB.dbf

8 rows selected.We create a table t_test before copying the datafile and a table t_test2 after copying it: SQL> create table t_test(c1 number) tablespace tools;

Table created.

SQL> select FILE#, CHECKPOINT_TIME, CHECKPOINT_CHANGE# from V$DATAFILE_HEADER;

FILE# CHECKPOINT_TIME CHECKPOINT_CHANGE#---------- -------------------- ------------------ 1 13:47:58 02-AUG-2004 6488359 2 13:47:58 02-AUG-2004 6488359 3 13:47:58 02-AUG-2004 6488359 4 13:47:58 02-AUG-2004 6488359 5 13:47:58 02-AUG-2004 6488359 6 13:47:58 02-AUG-2004 6488359 8 13:47:58 02-AUG-2004 6488359 9 13:47:58 02-AUG-2004 6488359

8 rows selected.

SQL> insert into t_test values(1);

1 row created.

SQL> /

1 row created.

SQL> commit;

Commit complete.

Page 23: An Introduction to Rman With Examples

SQL> select FILE#, CHECKPOINT_TIME, CHECKPOINT_CHANGE# from V$DATAFILE_HEADER;

FILE# CHECKPOINT_TIME CHECKPOINT_CHANGE#---------- -------------------- ------------------ 1 13:47:58 02-AUG-2004 6488359 2 13:47:58 02-AUG-2004 6488359 3 13:47:58 02-AUG-2004 6488359 4 13:47:58 02-AUG-2004 6488359 5 13:47:58 02-AUG-2004 6488359 6 13:47:58 02-AUG-2004 6488359 8 13:47:58 02-AUG-2004 6488359 9 13:47:58 02-AUG-2004 6488359

8 rows selected.The SCN hasn't changed yet. We now make the copy SQL> !cp /u04/oradata/DEVDB/tools01DEVDB.dbf /tmp

SQL> alter system switch logfile;

System altered.

SQL> select FILE#, CHECKPOINT_TIME, CHECKPOINT_CHANGE# from V$DATAFILE_HEADER;

FILE# CHECKPOINT_TIME CHECKPOINT_CHANGE#---------- -------------------- ------------------ 1 13:57:20 02-AUG-2004 6488566 2 13:57:20 02-AUG-2004 6488566 3 13:57:20 02-AUG-2004 6488566 4 13:57:20 02-AUG-2004 6488566 5 13:57:20 02-AUG-2004 6488566 6 13:57:20 02-AUG-2004 6488566 8 13:57:20 02-AUG-2004 6488566 9 13:57:20 02-AUG-2004 6488566

8 rows selected.

SQL> shutdown immediateDatabase closed. Database dismounted.ORACLE instance shut down.SQL> exitAt this point as a safety measure we take a copy /u04/oradata/DEVDB/tools01DEVDB.dbf.save of the datafile 4 as it is now and copy back from /tmp:oracle-localora@# cp /u04/oradata/DEVDB/tools01DEVDB.dbf /u04/oradata/DEVDB/tools01DEVDB.dbf.save

oracle-localora@# cp /tmp/tools01DEVDB.dbf /u04/oradata/DEVDB/tools01DEVDB.dbf

cp: overwrite /u04/oradata/DEVDB/tools01DEVDB.dbf (yes/no)? yThe database can now be opened: let's see what happens: SQL> startupORACLE instance started.

Page 24: An Introduction to Rman With Examples

Total System Global Area 189409824 bytesFixed Size 731680 bytesVariable Size 104857600 bytesDatabase Buffers 81920000 bytesRedo Buffers 1900544 bytesDatabase mounted.ORA-01113: file 4 needs media recoveryORA-01110: data file 4: '/u04/oradata/DEVDB/tools01DEVDB.dbf'So, why does Oracle (rightly) complain about file 4? Because the SCN in its header is different from the others: SQL> select FILE#, CHECKPOINT_TIME, CHECKPOINT_CHANGE# from V$DATAFILE_HEADER;

FILE# CHECKPOINT_TIME CHECKPOINT_CHANGE#---------- -------------------- ------------------ 1 13:57:57 02-AUG-2004 6488582 2 13:57:57 02-AUG-2004 6488582 3 13:57:57 02-AUG-2004 6488582 4 13:47:58 02-AUG-2004 6488359 5 13:57:57 02-AUG-2004 6488582 6 13:57:57 02-AUG-2004 6488582 8 13:57:57 02-AUG-2004 6488582 9 13:57:57 02-AUG-2004 6488582The datafile 4 has a "delay", since its SCN number is smaller than the one in the other datafiles and controlfile. We can also find out which archived (or online) redo logs will be necessary for the recovery: they are the ones (or one) whose FIRST_CHANGE# is less or equal 6488359 AND next_change is greater SQL> select NAME, FIRST_CHANGE# from v$archived_log where FIRST_CHANGE# >= 6488359;

NAME FIRST_CHANGE#--------------------------------------------------------------------------------/opt/oracle/admin/DEVDB/arch/1_60.dbf 6488563

SQL> RECOVER DATABASE;

ORA-00279: change 6488359 generated at 08/02/2004 13:47:58 needed for thread 1ORA-00289: suggestion : /opt/oracle/admin/DEVDB/arch/1_60.dbfORA-00280: change 6488359 for thread 1 is in sequence #60

Specify log: {<RET>=suggested | filename | AUTO | CANCEL} [we press return]Log applied.Media recovery complete.

SQL>ALTER DATABASE OPEN

The database is back to normal.

2. When is command "recover database using backup controlfile" required?

Page 25: An Introduction to Rman With Examples

Let's take a copy of the controlfile before any DDL activity, such as creating a new table and populating it. This will simulate the restore of a controlfile: SQL> !cp /u01/oradata/DEVDB/ctl1DEVDB.dbf /tmp

SQL> create table t_test2(c1 number) tablespace tools;Table created.

SQL> insert into t_test2 values(10);1 row created.

SQL> insert into t_test2 values(11);1 row created.

SQL> insert into t_test2 values(12);1 row created.

SQL> commit;

Commit complete.We now shutdown the database; this will cause a checkpoint to happen, meaning that all datafiles headers will be updated with the SCN contained in the controlfile. SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> exitBefore any dangerous experiment, the wise DBA will always takes a copy of the controlfile(s) oracle-localora@# cp /u01/oradata/DEVDB/ctl1DEVDB.dbf /u01/oradata/DEVDB/ctl1DEVDB.dbf.saveoracle-localora@# cp /u02/oradata/DEVDB/ctl2DEVDB.dbf /u02/oradata/DEVDB/ctl2DEVDB.dbf.saveoracle-localora@# cp /u03/oradata/DEVDB/ctl3DEVDB.dbf /u03/oradata/DEVDB/ctl3DEVDB.dbf.saveLet's now overwrite the controlfiles with the copy we created on the /tmp directory: oracle-localora@# cp /tmp/ctl1DEVDB.dbf /u01/oradata/DEVDB/ctl1DEVDB.dbfcp: overwrite /u01/oradata/DEVDB/ctl1DEVDB.dbf (yes/no)? yoracle-localora@# cp /tmp/ctl1DEVDB.dbf /u02/oradata/DEVDB/ctl2DEVDB.dbfcp: overwrite /u02/oradata/DEVDB/ctl2DEVDB.dbf (yes/no)? yoracle-localora@# cp /tmp/ctl1DEVDB.dbf /u03/oradata/DEVDB/ctl3DEVDB.dbfcp: overwrite /u03/oradata/DEVDB/ctl3DEVDB.dbf (yes/no)? yoracle-localora@# Let's try to open the database. SQL> startupORACLE instance started.

Total System Global Area 189409824 bytesFixed Size 731680 bytesVariable Size 104857600 bytesDatabase Buffers 81920000 bytesRedo Buffers 1900544 bytesDatabase mounted.ORA-01122: database file 1 failed verification checkORA-01110: data file 1: '/u05/oradata/DEVDB/system01DEVDB.dbf'ORA-01207: file is more recent than controlfile - old controlfile

Page 26: An Introduction to Rman With Examples

SQL> select FILE#, CHECKPOINT_TIME, CHECKPOINT_CHANGE# from V$DATAFILE_HEADER;

FILE# CHECKPOINT_TIME CHECKPOINT_CHANGE#---------- -------------------- ------------------ 1 14:20:22 02-AUG-2004 6488634 2 14:20:22 02-AUG-2004 6488634 3 14:20:22 02-AUG-2004 6488634 4 14:20:22 02-AUG-2004 6488634 5 14:20:22 02-AUG-2004 6488634 6 14:20:22 02-AUG-2004 6488634 8 14:20:22 02-AUG-2004 6488634 9 14:20:22 02-AUG-2004 6488634

8 rows selected.

SQL> select CHECKPOINT_CHANGE# from v$database;

CHECKPOINT_CHANGE#------------------ 6488582Oracle complains saying the the controlfile is an old copy judging from the SCN; during other kinds of recovery you will be prompted that the command "recover database using backup controlfile" is needed essentially for the same reason. Let's see what happens if we try a normal recovery: SQL> recover database;ORA-00283: recovery session canceled due to errorsORA-01122: database file 1 failed verification checkORA-01110: data file 1: '/u05/oradata/DEVDB/system01DEVDB.dbf'ORA-01207: file is more recent than controlfile - old controlfile

Instead we use:

SQL> recover database using backup controlfile;ORA-00279: change 6488582 generated at 08/02/2004 13:57:20 needed for thread 1ORA-00289: suggestion : /opt/oracle/admin/DEVDB/arch/1_61.dbfORA-00280: change 6488582 for thread 1 is in sequence #61

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: cannot open archived log '/opt/oracle/admin/DEVDB/arch/1_61.dbf'ORA-27037: unable to obtain file statusSVR4 Error: 2: No such file or directoryAdditional information: 3This is an interesting case because the redo log needed for the recovery hasn't been archived yet and it is one of the online redo logs. We can see it because the latest archived log is sequence 60, but Oracle is looking for the sequence 61. SQL> !ls -ltr /opt/oracle/admin/DEVDB/archtotal 10298-rw-r----- 1 oracle dba 18944 Aug 2 13:57 1_59.dbf -rw-r----- 1 oracle dba 1536 Aug 2 13:57 1_60.dbf SQL> select member from v$logfile;

Page 27: An Introduction to Rman With Examples

MEMBER--------------------------------------------------------------------------------/u03/oradata/DEVDB/redog2m1DEVDB.dbf/u04/oradata/DEVDB/redog2m2DEVDB.dbf/u01/oradata/DEVDB/redog1m1DEVDB.dbf/u02/oradata/DEVDB/redog1m2DEVDB.dbf

SQL> recover database using backup controlfile;ORA-00279: change 6488582 generated at 08/02/2004 13:57:20 needed for thread 1ORA-00289: suggestion : /opt/oracle/admin/DEVDB/arch/1_61.dbfORA-00280: change 6488582 for thread 1 is in sequence #61

Specify log: {<RET>=suggested | filename | AUTO | CANCEL} [we type the name of the online redo log]/u03/oradata/DEVDB/redog2m1DEVDB.dbfLog applied.Media recovery complete.We have now almost finished; the final remark is that when recovering with a backup controlfile, the database must be opened with the clause "resetlogs" SQL> alter database open;alter database open*ERROR at line 1:ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

SQL> alter database open noresetlogs;alter database open noresetlogs*ERROR at line 1:ORA-01588: must use RESETLOGS option for database open

SQL> alter database open resetlogs;Database altered.

SQL> select * from t_test2;

C1---------- 10 11 12

SQL> select * from t_test;

C1---------- 1 1The contents of the database are as expected.

Page 28: An Introduction to Rman With Examples

Error message: port already in useSometimes it happens that an installation fails with the error message "port already in use" (this can be the case with the Oracle snmpx daemon on UNIX systems).If you don't know which TCP port is generating the error, the following UNIX command lists those currently being used.

oracle@:PROD1 >netstat -an | grep LISTEN | sort -k 1 *.111 *.* 0 0 24576 0 LISTEN *.13 *.* 0 0 24576 0 LISTEN *.161 *.* 0 0 24576 0 LISTEN *.19 *.* 0 0 24576 0 LISTEN *.2049 *.* 0 0 24576 0 LISTEN *.21 *.* 0 0 24576 0 LISTEN *.23 *.* 0 0 24576 0 LISTEN *.2410 *.* 0 0 24576 0 LISTEN... ... *.898 *.* 0 0 24576 0 LISTEN *.9 *.* 0 0 24576 0 LISTEN *.9991 *.* 0 0 24576 0 LISTEN179.146.111.76.1521 *.* 0 0 24576 0 LISTEN

This list shows the port 21 (ftp), 23 (telnet), 1521 (an Oracle listener) etc. If you suspect of a particular TCP port (for example 161) go for it.

netstat -an | grep 161

*.161 *.* 0 0 24576 0 LISTEN

Find the process that is using the TCP portIt is now necessary to find out which process is actually using the TCP port. On the Internet an open source tool called lsof is available, but if you don't feel like installing another tool, the following short script can do the work.The script goes through the process tables and finds out which one is already using a certain port. You need root privileges to run this script.

for PROC in /proc/*do echo $PROC

Page 29: An Introduction to Rman With Examples

pfiles -F $PROC | grep port |grep 161done

A sample output is

../proc/76/proc/777 sockname: AF_INET 0.0.0.0 port: 161 sockname: AF_INET 179.146.111.98 port: 161 sockname: AF_INET 179.146.111.101 port: 161 sockname: AF_INET 179.146.111.102 port: 161 sockname: AF_INET 179.146.111.100 port: 161/proc/779/proc/784...

We have now got the process ID 777 and it is easy to determine what it is doing :

app@serverdaddy[on pts/1] ps -ef | grep 777 root 777 717 0 Dec 05 ? 11:28 /opt/buw/bin/snmpd -f -x -s g_mon -l

Our investigation is therefore completed: the TCP port 161 is being used by the process /opt/buw/bin/snmpd.

A real case: Could not start agent. Initialization failure

Sometimes it happens, especially after an updrade, to come across the error:

Failed while initializing Collection ServiceError initializing subsystemsAgent exited at Thu Jan 27 11:00:54 MET 2005 with return value 55Could not start agent. Initialization failure

oracle@zhru09 [oracle] # pwd/opt/oracle/9.2.0.5/network/logoracle@dbserver [oracle] # ls -ltrtotal 6-rw-rw---- 1 oracle dba 278 Jan 27 11:00 nmiconf.log-rw-r----- 1 oracle dba 267 Jan 27 11:00 dbsnmp.nohup-rw-rw---- 1 oracle dba 585 Jan 27 11:00 dbsnmp.logThe contents of dbsnmp.nohup are:

oracle@dbserver [oracle] # cat dbsnmp.nohup

------------------------ Thu Jan 27 11:00:49 MET 2005 ------------------------Failed while initializing Collection ServiceError initializing subsystemsAgent exited at Thu Jan 27 11:00:54 MET 2005 with return value 55Could not start agent. Initialization failureThe contents of dbsnmp.log are: oracle@dbserver [oracle] # cat dbsnmp.log

Page 30: An Introduction to Rman With Examples

DBSNMP for Solaris: Version 9.2.0.5.0 - Production on 27-JAN-2005 11:00:52

Copyright (c) 2003 Oracle Corporation. All rights reserved.

System parameter file is /var/opt/oracle/snmp_ro.oraLog messages written to /opt/oracle/9.2.0.5/network/log/dbsnmp.logTrace information written to /opt/oracle/9.2.0.5/network/trace/dbsnmp_6038.trcTrace level is currently 0

NMS-00001: Warning: dbsnmp unable to connect to SNMP master agent11:00:54 27/01/2005ODG-05019: Error: failed to bind socket11:00:54 27/01/2005ODG-05083: Error: failed to allocate listening port/socketThe explanation in the Oracle Metalink for the error ODG-05083 is:

Error: ODG-5083 Text: Error: failed to allocate listening port/socket ---------------------------------------------------------------------------

Cause: an error occurred while attempting to open the Data Gatherer socket (1808). Action:ensure that no other process is using this socket and retry the operation Therefore, withe script above, let's check whether some other process is already using the port 1808:

sysuser@dbserver[on pts/5] netstat -a |egrep -i 1808dbserver.1808 *.* 0 0 24576 0 LISTEN

for PROC in /proc/*do echo $PROC pfiles -F $PROC | grep port |grep 1808done

.../proc/1162/proc/1165/proc/3687/proc/3689/proc/3691/proc/4429 sockname: AF_INET 169.166.228.84 port: 1808/proc/5632... ...

root@dbserver[on pts/7]# ps -aef|grep -i 4429

Page 31: An Introduction to Rman With Examples

root 7961 6922 0 11:36:15 pts/7 0:00 grep -i 4429 oracle 4429 1 0 Dec 09 ? 43:56 /u00/app/oracle/product/8.1.7/bin/vppdcroot@dbserver[on pts/7]# kill -3 4429root@dbserver[on pts/7]# kill -5 4429root@dbserver[on pts/7]# kill -9 4429The problem, therefore, was that the data gatherer of version 8.1.7 was still running. The reason why sometimes we forget this process is that the agent in 9i is also the data gatherer.Again, this is a real case.

What is a cluster?This article gives some information about intalling and using the Oracle Real Application Cluster RAC. A definition of a cluster is : "A group of computers linked to provide fast and reliable service. Cluster technologies have evolved over the past 15 years to provide servers that are both highly available and scalable. Clustering is one of several approaches that exploits parallel processing — the use of multiple subsystems as building blocks".

Clusters have existed for quite a long time; the first solution was offered by DEC for its VMS operating system. Clusters on UNIX are more recent.

Clustering is therefore a solution for having different computers share common devices and jointly perform tasks; they exist with or without databases.Several companies offer clustering software: Veritas, Sun, IBM, Microsoft, MySql etc. For example, the version for Windows NT can be downloaded from real application cluster for NT/2000 This means that the set of commands for managing the cluster itself depends on the specific product.

Shared storage

A cluster will share some storage. There will be some software in place to manage this storage, which could be the Veritas Volume Manager, or Sun Soltice, or UNIX itself if you are using raw devices. Even if it is likely that the clustering software and the storage manager will be provided by the same vendor, it is not necessarily so.

What is an Oracle Real Application Cluster?The Oracle RAC is a solution offered by Oracle Corporation in order to build a shared database using the clustering technology; RAC and clustering are not the same thing: RAC comes on top of the clustering software, even if the two softwares are tightly interconnected.

Page 32: An Introduction to Rman With Examples

Real Application Clusters requires that all each instance be able to access a set of devices on a shared disk subsystem. Veritas Storage Foundation (VSF) for RAC supports an Oracle-certified Cluster File System (CFS), allowing to store the files that Real Application Clusters requires directly on the cluster file system. A raw disk subsystem can be used instead if required.

Veritas states that the I/O performance of the VSF matches that of the raw devices. The CFS allows the use of normal Oracle commands such as "alter datafile resize 500M". With raw devices this is not possible, because the system manager must create the device with a certain size using the Volume Manager. Analogously, the archived redo logs can be created on the CFS.

Oracle Cluster can be installed also on a single node, but the cluster management must be installed in advance and running. The tool on WindowsNT/2000 and Linux is called oracm and is shipped with Oracle.

How many copies of Oracle binaries in a RAC?

The Oracle binaries can be installed once on the shared storage or on each server (for example, on the system disk). Both ways are possible and your decision should be consider few factors: easy of use and possible downtime.

One copy of the binaries introduces a single point of failure. One copy of the binaries is more manageable; for example, a patch has to be

applied only once and not on each server. If you keep only one copy, than you have a certain outage if you have to apply

a patch, because all the instances will be to be brought down. On the contrary, with binaries on each node only the instance on that particular node will have to be stopped.

Defining the instances on the two nodes of the Oracle cluster

If the cluster software is running, the installation with the Oracle Universal Installer is very simple. The installer will detect the two nodes and will ask on which node the software should be copied; if you are using a shared device for the $ORACLE_HOME

Page 33: An Introduction to Rman With Examples

the node doesn't matter.When the installation is completed, you can try to start the instance on one of the two nodes without mounting the database, which of course hasn't yet been created.The tool is the usual sqlplus, even if the new tool svrctl can be used.

RAC configuration files

How many copies of init.ora should you keep? Where to define TNS_ADMIN? The new cluster systax introduced a "dot" notation in the init.ora file to specify parameters for different instances. This allows to keep only one copy of init.ora for all instances.

To fix the ideas, let's say that the cluster nodes are called sercluster1 and sercluster2, the database name is EUROPE and that the instances names are EU1, EU2 etc. It the shared mountpoint is /orasoft, the ORACLE_BASE=/orasof/oracle, ORACLE_HOME=$ORACLE_BASE/9.2.0 One possible way to proceed is creating a tree $ORACLE_BASE/admin/EUROPE/... on the shared device. In particular, we will define an initEUROPE.ora on $ORACLE_BASE/admin/EUROPE/pfile The soft links must now be created:

ln -s $ORACLE_BASE/admin/EUROPE/pfile/initEUROPE.ora $ORACLE_HOME/dbs/initEU1.oraln -s $ORACLE_BASE/admin/EUROPE/pfile/initEUROPE.ora $ORACLE_HOME/dbs/initEU2.oraTo set correctly the environment on the two nodes, a possible script would be #!kshexport ORACLE_BASE=/orasoft/oracleexport ORACLE_HOME=$ORACLE_BASE/9.2.0myHost=`hostname`if [ $myHost = "sercluster1" ]; then ORACLE_SID=EU1else ORACLE_SID=EU2fiexport ORACLE_SID... ... ...The immediate question is: how can you use the same init.ora if the instance names are different? The answer is that in a RAC environmnet it is now possible to specify a parameter with a "dot" notation. For example:

cluster_database=true cluster_database_instances=2#EU1.instance_name=EU1EU1.instance_number=1EU1.thread=1EU1.undo_tablespace=UNDOEU1

EU2.instance_name=EU2EU2.instance_number=2EU2.thread=2EU2.undo_tablespace=UNDOEU2

undo_management=auto

Page 34: An Introduction to Rman With Examples

Creating the RAC database

At this stage $ORACLE_HOME and $ORACLE_SID must be defined in the environment and the init.ora file must be found on $ORACLE_HOME/dbs.

As we said before, on UNIX (Linux) the init.ora on $ORACLE_HOME/dbs is typically a soft link to $ORACLE_BASE/admin/$ORACLE_SID/pfile/init${ORACLE_SID}.ora

For this operation, the parameter cluster_database should be set to FALSE; in fact, the first part is not different from creating a database with a single instance and this setting avoids some unnecessary complexity at this stage.

cluster_database = FALSE

The database can now be created using normal scripts.

sqlplus '/ as sysdba'sql> startup nomountspool /orasoft/oracle/admin/EUROPE/create/logs/crDB_EUROPE_1.logstartup nomount pfile ='/orasoft/oracle/admin/EUROPE/pfile/initEUROPE.ora'CREATE DATABASE EUROPE controlfile REUSE maxinstances 4 maxlogfiles 64 maxlogmembers 4 maxdatafiles 1000 maxloghistory 1000 character set AL32UTF8 national character set AL16UTF16 DATAFILE '/u00/oradata/EUROPE/EUROPE_system01.dbf' SIZE 1000M REUSEEXTENT MANAGEMENT LOCALUNDO TABLESPACE UNDOEU1 DATAFILE '/u09/oradata/EUROPE/EUROPE_undo_T1_01.dbf' SIZE 5000M REUSEDEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE '/u08/oradata/EUROPE/EUROPE_temp01.dbf' SIZE 5000M REUSE EXTENT MANAGEMENT LOCAL UNIFORM SIZE 50M LOGFILE GROUP 1 ('/u05/oradata/EUROPE/EUROPE_redo1_1T1.dbf',

'/u06/oradata/EUROPE/EUROPE_redo1_2T1.dbf') SIZE 100M REUSE, GROUP 2 ('/u06/oradata/EUROPE/EUROPE_redo2_1T1.dbf',

'/u07/oradata/EUROPE/EUROPE_redo2_2T1.dbf') SIZE 100M REUSE, GROUP 3 ('/u07/oradata/EUROPE/EUROPE_redo3_1T1.dbf',

'/u05/oradata/EUROPE/EUROPE_redo3_2T1.dbf') SIZE 100M REUSE, GROUP 4 ('/u05/oradata/EUROPE/EUROPE_redo4_1T1.dbf',

'/u06/oradata/EUROPE/EUROPE_redo4_2T1.dbf') SIZE 100M REUSE; spool off

Page 35: An Introduction to Rman With Examples

The second instance can start, but cannot mount nor open the database. Before this is possible, the redo logs and the UNDO tablespace for the second instance must be created

ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 5 ('/u04/oradata/EUROPE/EUROPE_redo5_1T2.dbf',

'/u05/oradata/EUROPE/EUROPE_redo5_2T2.dbf') SIZE 100M;ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 6 ('/u05/oradata/EUROPE/EUROPE_redo6_1T2.dbf',

'/u06/oradata/EUROPE/EUROPE_redo6_2T2.dbf') SIZE 100M;ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 7 ('/u06/oradata/EUROPE/EUROPE_redo7_1T2.dbf',

'/u07/oradata/EUROPE/EUROPE_redo7_2T2.dbf') SIZE 100M;ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 8 ('/u07/oradata/EUROPE/EUROPE_redo8_1T2.dbf',

'/u08/oradata/EUROPE/EUROPE_redo8_2T2.dbf') SIZE 100M;

ALTER DATABASE ENABLE THREAD 2;

CREATE UNDO TABLESPACE UNDOEU2 DATAFILE '/u07/oradata/EUROPE/EUROPE_undo_T2_01.dbf' SIZE 5000M REUSE;

Shut down the two instances Now set cluster_database = TRUE

# LISTENER.ORA Network Configuration File: /optware/oracle/network/admin/listener.ora# Generated by Oracle configuration tools.

LISTENER_EU1 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = sercluster1)(PORT = 2002)) )

SID_LIST_LISTENER_EU1 = (SID_LIST = (SID_DESC = (ORACLE_HOME = /optware/oracle/9.2.0) (SID_NAME = EU1) ) )

LISTENER_EU2 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = sercluster2)(PORT = 2002)) )

SID_LIST_LISTENER_EU2 = (SID_LIST = (SID_DESC = (ORACLE_HOME = /orasoft/oracle/9.2.0) (SID_NAME = EU2)

Page 36: An Introduction to Rman With Examples

) )

# TNSNAMES.ORA Network Configuration File: /orasoft/oracle/network/admin/tnsnames.ora# Generated by Oracle configuration tools.

EUROPE = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = sercluster1)(PORT = 2002)) (ADDRESS = (PROTOCOL = TCP)(HOST = sercluster1)(PORT = 2002)) (LOAD_BALANCE = yes) ) (CONNECT_DATA = (SERVICE_NAME = EUROPE) ) )