Here is one that I used to use some time ago (for Oracle 6 and 7).

This does not support all the *new* stuff available since Oracle8, but it
should not be difficult to change it.. if you do, I would appreciate a copy
:) 

- Kirti

#!/bin/ksh
#---------------------------------------------------------------------------
----
# crdb.ksh      - creates sql script that contains statements necessary
#                 to recreate a database with the current physical
#                 configuration. 
#
# parameters    - SID (oracle database identifier)
#
# output        - crdb_<SID>.sql in $ORACLE_HOME/admin/$ORACLE_SID/scripts
directory
#               
# Author        - Quin Bligh
#             Kirti Deshpande
#
#---------------------------------------------------------------------------
----
get_perm_db_params ()
{
echo "Getting permanent database parameters from controlfile trace..."
touch $TFILE
sleep 2
sqlplus -s <<END1 > /dev/null
sys/$SYSPW
alter database backup controlfile to trace;
END1
(sqlplus -s <<END1A
sys/$SYSPW
set heading off
set feedback off
set pages 0
select replace(value,'?','$ORACLE_HOME')
from v\$parameter
where name = 'user_dump_dest';
END1A
) |
read USER_DUMP_DEST
TRACE_FILE=`find $USER_DUMP_DEST -newer $TFILE -name ora_"*".trc -print
2>/dev/null`
MAXLOGFILES=`grep -i maxlogfiles ${TRACE_FILE}`
MAXDATAFILES=`grep -i maxdatafiles ${TRACE_FILE}`
MAXINSTANCES=`grep -i maxinstances ${TRACE_FILE}`
MAXLOGMEMBERS=`grep -i maxlogmembers ${TRACE_FILE}`
MAXLOGHISTORY=`grep -i maxloghistory ${TRACE_FILE}`
rm -f $TFILE

(sqlplus -s <<END1C
sys/$SYSPW
set heading off
set feedback off
set pages 0
select value 
from nls_database_parameters
where parameter = 'NLS_CHARACTERSET';
END1C
) | read NLS_CHARSET

echo "Char set is $NLS_CHARSET"
}

#---------------------------------------------------------------------------
----
get_dbs_files ()
{
echo "Getting system tablespace definition..."
>$SYSFILE
sqlplus -s <<END2 > $TFILE
sys/$SYSPW
set heading off
set feedback off
set pages 0
select '''' || file_name || '''' || ' size ' || bytes/1024 || 'k'
from dba_data_files
where tablespace_name = 'SYSTEM';
END2
i=0
num=`wc -l $TFILE`
cat $TFILE | while read lines
do
        i=$(($i + 1))
        if [ $i -lt $num ] ; then
                echo "\t$lines," >> $SYSFILE
        else
                echo "\t$lines" >> $SYSFILE
        fi
done
}

#---------------------------------------------------------------------------
----
get_log_files ()
{
echo "Getting log file definitions..."
>$LOGFILE
HOLDGROUP=""

(sqlplus -s <<END3
sys/$SYSPW
set heading off
set feedback off
set pages 0
select a.group# || ' ' || a.member || ' ' || b.bytes/1024
from v\$logfile a, v\$log b
where a.group# = b.group#
order by a.group#;
END3
) |
while read GROUP MEMBER SIZE
do
  if [[ $GROUP != $HOLDGROUP ]]
  then
    [ -z "$HOLDGROUP" ] || echo "\n\t\t ) size ${HOLDSIZE}k," >> $LOGFILE
    echo "\tGROUP $GROUP (" >> $LOGFILE
    HOLDGROUP=$GROUP
    HOLDSIZE=$SIZE
  else
    echo "," >> $LOGFILE
  fi
  
  echo "\t\t '$MEMBER'\c" >> $LOGFILE
done
echo "\n\t\t ) size ${HOLDSIZE}k" >> $LOGFILE

}

#---------------------------------------------------------------------------
----
get_dbf_files ()
{
concat_file ()
{
i=0
num=`wc -l /tmp/$TSNAME.$$`
cat /tmp/$TSNAME.$$ | while read lines
do
        i=$(($i + 1))
        echo $lines | grep "^create" >/dev/null
        if [ $? -eq 0 ] ; then
                echo "\n$lines" >> $DBFILES
        else
           echo $lines | grep -v "size" >/dev/null
           if [ $? -eq 0 ] ; then
                echo "\t$lines" >> $DBFILES
           elif [ $i -lt $num ] ; then
                echo "\t$lines," >> $DBFILES
           else
                echo "\t$lines;" >> $DBFILES
           fi
        fi
done
}

echo "Getting all other tablespace definitions..."
>$TFILE
>$DBFILES
(sqlplus -s <<END4
sys/$SYSPW
set heading off
set feedback off
set pages 0
select tablespace_name ||' '|| initial_extent ||' '||
next_extent ||' '|| min_extents ||' '|| max_extents ||' '||
pct_increase
from dba_tablespaces
where tablespace_name != 'SYSTEM'
and status != 'INVALID'
order by tablespace_name;
END4
) | 
while read TSNAME INITEXT NEXTEXT MINEXT MAXEXT PCTINC
do
echo "create tablespace $TSNAME" > /tmp/$TSNAME.$$
echo "\t default storage (" >> /tmp/$TSNAME.$$
echo "\t\t initial       $INITEXT" >> /tmp/$TSNAME.$$
echo "\t\t next          $NEXTEXT" >> /tmp/$TSNAME.$$
echo "\t\t minextents    $MINEXT" >> /tmp/$TSNAME.$$
echo "\t\t maxextents    $MAXEXT" >> /tmp/$TSNAME.$$
echo "\t\t pctincrease   $PCTINC" >> /tmp/$TSNAME.$$
echo "\t )" >> /tmp/$TSNAME.$$
echo "\t datafile" >> /tmp/$TSNAME.$$
sqlplus -s <<END5 >> /tmp/$TSNAME.$$
sys/$SYSPW
set heading off
set feedback off
set pages 0
select '''' || file_name || '''' || ' size ' || bytes/1024 || 'k'
from dba_data_files
where tablespace_name = '$TSNAME'
order by file_name;
END5
concat_file
rm -f /tmp/$TSNAME.$$
done
}

#---------------------------------------------------------------------------
----
get_rbs ()
{
echo "Getting rollback segment definitions..."
>$RBS
(sqlplus -s <<END6
sys/$SYSPW
set heading off
set feedback off
set pages 0
select a.segment_name ||' ' || a.tablespace_name ||' '|| 
decode(b.optsize,0,a.initial_extent+3*a.next_extent,
null,a.initial_extent+3*a.next_extent,b.optsize)
from dba_rollback_segs a, v\$rollstat b
where a.tablespace_name != 'SYSTEM'
and a.segment_id = b.usn
order by a.segment_name;
END6
) | 
while read RBNAME TSNAME OPTSIZE
do
echo "create rollback segment $RBNAME tablespace $TSNAME storage" \
     "(optimal $OPTSIZE);" >>$RBS
done
}

#---------------------------------------------------------------------------
----
cat_sql ()
{
echo "Building sql script..."
cat -s <<END > $SQL
REM *
connect internal
!cat ${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora | grep -vi "rollback_segments"
>  ${ORACLE_HOME}/dbs/init${ORACLE_SID}_0.ora

startup nomount pfile=$ORACLE_HOME/dbs/init${ORACLE_SID}_0.ora
set echo on
spool crdb${ORACLE_SID}

REM * Create the <dbname> database.  
REM * SYSTEM tablespace configuration guidelines:
REM *   General-Purpose ORACLE RDBMS               50Mb
REM *   Additional dictionary for applications  10-50Mb 
REM * Redo Log File configuration guidelines:
REM *   Use 3+ redo log files to relieve ``cannot allocate new log...''
waits.
REM *   Use ~100Kb per redo log file per connection to reduce checkpoints.
REM *
create database "$ORACLE_SID"
    $MAXLOGFILES
    $MAXDATAFILES
    $MAXINSTANCES
    $MAXLOGMEMBERS
    $MAXLOGHISTORY
    character set "$NLS_CHARSET"
    datafile
`cat $SYSFILE`
    logfile
`cat $LOGFILE`
;

shutdown;
startup open pfile=${ORACLE_HOME}/dbs/init${ORACLE_SID}_0.ora

REM * install data dictionary views:
@${ORACLE_HOME}/rdbms/admin/catalog.sql
@${ORACLE_HOME}/rdbms/admin/catproc.sql
@${ORACLE_HOME}/rdbms/admin/catblock.sql

REM * Install dbms utilities
@${ORACLE_HOME}/rdbms/admin/dbmspool.sql
@${ORACLE_HOME}/rdbms/admin/dbmspipe.sql

REM *
REM * Create rest of datafiles
REM *
`cat $DBFILES`

REM *
REM * Create rollback segments.
REM *
`cat $RBS`

REM *
REM * Restart the instance to activate the the additional rollback segments.
REM *

shutdown
disconnect

connect internal
startup 

REM * Alter SYS and SYSTEM users.
REM *
alter user sys temporary tablespace temp;
alter user system temporary tablespace temp;

END

}

#---------------------------------------------------------------------------
----
# main () 
# 
NAME=`basename $0`
case $# in 
   0)
        echo "Enter oracle sid: [$ORACLE_SID] \c"
        read MYSID
        export ORACLE_SID=${MYSID:-$ORACLE_SID}
   ;;
   1)
        export ORACLE_SID=$1
   ;;
   *)
        echo "Usage: $NAME [sid]"
        exit 1
   ;;
esac

clear
echo ""
echo "Running $NAME to create $ORACLE_SID rebuild script\n"
echo " Please enter password for 'SYS' : \c"
stty -echo
read SYSPW
stty echo
echo "\n\n\n"

# Set up ORACLE Environment

export ORAENV_ASK=NO
. oraenv          

#
# Check if the SYS password is correct and if the DB is up 
#
sqlplus -s << END > /tmp/crdb_chk.$$
SYS/$SYSPW
exit;
END
grep 'ORA-01017' /tmp/crdb_chk.$$ > /dev/null
if [ $? = 0 ]
 then
    echo "\n\n"
    echo "--------- ERROR ----------"
    echo "**** Invalid SYS password "
    echo "\n\n\n"
    exit 1
fi
grep 'ORA-01034' /tmp/crdb_chk.$$ > /dev/null
if [ $? = 0 ]
 then
    echo "\n\n"
    echo "------------ ERROR ------------"
    echo "**** Database is not accessible"
    echo "\n\n\n"
    exit 1
fi


TFILE=/tmp/crdb_tmp.$$
SYSFILE=/tmp/crdb_sysfile.$$
LOGFILE=/tmp/crdb_logfile.$$
DBFILES=/tmp/crdb_dbfiles.$$
RBS=/tmp/crdb_rbs.$$
SQL=$ORACLE_BASE/admin/${ORACLE_SID}/scripts/crdb_${ORACLE_SID}.sql

trap "rm -f /tmp/crdb_*.$$;exit" 0 1 2 3 4 5 6 15

get_perm_db_params
get_dbs_files
get_log_files
get_dbf_files
get_rbs

cat_sql

chmod 640 $SQL

echo "\n$NAME done creating sql script! -- See $SQL"

#--- End of File ------- 

-----Original Message-----
Sent: Monday, September 09, 2002 10:33 AM
To: Multiple recipients of list ORACLE-L


If you export with rows=n, you get a text file with all the ddl to recreate
the exportable objects. However, packages/procedures are formatted and not
at all easy to use to recreate and the storage clauses are all in bytes. Not
a pretty method, but certainly one that can be used.

-----Original Message-----
Sent: Friday, September 06, 2002 3:59 PM
To: Multiple recipients of list ORACLE-L


Export can do this. Right?

But the output is not a script but a binary file only Import can understand.

ltiu

Connie Milliken wrote:

>Does anyone have a script that will write another script to recreate a
>particular database quickly with all the info specific to that particular
>database?
>
>Seems to me that I have seen this somewhere before, but I am not sure
where.
>  
>
-- 
Please see the official ORACLE-L FAQ: http://www.orafaq.com
-- 
Author: Deshpande, Kirti
  INET: [EMAIL PROTECTED]

Fat City Network Services    -- (858) 538-5051  FAX: (858) 538-5051
San Diego, California        -- Public Internet access / Mailing Lists
--------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from).  You may
also send the HELP command for other information (like subscribing).

Reply via email to