Professional Documents
Culture Documents
You may find it necessary to duplicate (clone) an Oracle database. One method is to use import/export.
This method can work fine, but what if your database is too big? Another method is to make a copy of
the current database and rename it. This month I will present an article that explains the steps
necessary to copy and rename a database. This article will assume that the original database is called
PROD and you want to create a TEST duplicate database.
The first step is to locate and copy all database files to their new location. You can use the view
V$DATAFILE in the PROD database to locate these files. Before running the query from
V$DATAFILE, ensure that you are connected to the PROD database by selecting from
V$DATABASE:
SQL> select name from v$database;
NAME
---------------------------------------
PROD
NAME
---------------------------------------
/u08/app/oradata/PROD/system01.dbf
/u06/app/oradata/PROD/rbs01.dbf
/u07/app/oradata/PROD/temp01.dbf
/u10/app/oradata/PROD/userd01.dbf
/u09/app/oradata/PROD/userx01.dbf
After recording these files, shutdown the PROD database and perform an operating system copy of all
database files to another location and/or machine. In my example, I will copy all datafiles to a new
location as shown in the following table:
Old Location New Location
/u08/app/oradata/PROD/system01.dbf
/u08/app/oradata/TEST/system01.dbf
/u06/app/oradata/PROD/rbs01.dbf
/u06/app/oradata/TEST/rbs01.dbf
/u07/app/oradata/PROD/temp01.dbf
/u07/app/oradata/TEST/temp01.dbf
/u10/app/oradata/PROD/userd01.dbf
/u10/app/oradata/TEST/userd01.dbf
/u09/app/oradata/PROD/userx01.dbf
/u09/app/oradata/TEST/userx01.dbf
After copying all files to their new location, startup the PROD database.
From the production database, get a copy of the initPROD.ora file and copy it to initTEST.ora. In the
initTEST.ora file, change the value of "db_name" from PROD to TEST. Keep in mind that you may
also need to change:
• audit_file_dest
• background_dump_dest
• control_files
• core_dump_dest
• log_archive_dest
• user_dump_dest
If the TEST database is going to be on a different machine, copy the initTEST.ora file to that machine
in the proper directory.
Using SVRMGR on the PROD database, create a script that will be able to re-create the controlfile for
the database.
PROD on testdb: svrmgrl
SVRMGR> connect internal
Connected.
SVRMGR> alter database backup controlfile to trace;
Statement processed.
The above statement will put a text copy of the controlfile in the USER_DUMP_DEST directory. You
will need to search for the newest trace file in this directory. In UNIX you can use the "ls -lt"
command. Once you find the correct trace file, rename it to cr_control.sql and edit it as follows:
• Remove everything up to the "START NOMOUNT" statement and everything after the
semicolon at the end of the "CREATE CONTROLFILE" statement.
• Edit the line starting with "CREATE CONTROLFILE" and replace the word "REUSE"
with the word "SET" right before the keyword DATABASE.
• On the same line, modify the database name changing it from PROD to TEST.
• On the same line, change the keyword NORESETLOGS to RESETLOGS.
If the TEST database is on a different machine move this file to that machine.
Make sure that your Oracle environment variable "ORACLE_SID" is set to TEST. (i.e. export
ORACLE_SID=TEST).
Now use SVRMGR and the CREATE CONTROLFILE script (cr_control.sql) to create your
controlfile for TEST:
Before opening the TEST database, you will need to perform incomplete recovery. After recovery you
can open the database using the RESETLOGS option as show below:
SVRMGR> alter database recover database until cancel using backup controlfile;
SVRMGR> alter database recover cancel;
Statement processed.
SVRMGR> alter database open resetlogs;
Statement processed.
SVRMGR>
You can verify that the database was renamed to TEST by querying from V$DATABASE:
SVRMGR> select name from v$database;
NAME
---------
TEST
1 row selected.
SVRMGR>