Introduction

Dans un précédent billet il fut présenté un script de création d'une base Oracle 12c sur un cluster RAC à 2 noeuds. Ici il s'agit d'un script basé sur le même modèle mais pour la création d'une base en mode stand-alone de type non-CDB ( pas de pluggable database ).

La version de Oracle en place est 12.2.0.1 l'adaptation à une autre version est simple, il suffit de modifier la variable ORACLE_HOME. Le script fonctionne en 11gR2 et 12c sans difficulté.

Présentation du script.

Celui-comporte en début un certain nombre de variables qu'il suffit de personnaliser, notamment le nom de la base et l'emplacement des fichiers et aussi des tailles SGA et PGA.

Les variables ORACLE_BASE et ORACLE_HOME respectent la norme OFA.

La gestion des fichiers est assurée en mode OMF.

Il est nécessaire de créer un répertoire $HOME/sql avant lancement.

######################################################
# Shell de creation d'une base Stand-Alone
# SILVERLAKE : 12/01/2018
# Note : Deux fichiers ( init<SID>.ora et create<SID>.sql ) sont ecrits sous $HOME/sql
# Appel : createBASE.sh
######################################################
#!/bin/bash

if [ -z ${ORACLE_BASE} ]
then
  export ORACLE_BASE=/ora01/app/oracle
fi

if [ -z ${ORACLE_HOME} ]
then
  export ORACLE_HOME=${ORACLE_BASE}/product/12.2.0.1/DB
  export PATH=$ORACLE_HOME/bin:$PATH
fi

export DEBUT=$(date +%s)
echo $(date)

# Variables a spécifier
export DB=YODA
export DBUNIQ=${DB}
export ORACLE_SID=${DBUNIQ}
export DATA=${ORACLE_BASE}/oradata
export FRA=${ORACLE_BASE}/fast_recovery_area
export SGA=1280M
export PGA=360M
export MDP=Manager12#
export SERVEUR1=ona01.formation.maison

echo "Suppression ancienne BASE"
rm -rf ${DATA}/${DBUNIQ}
rm -rf ${FRA}/${DBUNIQ}

mkdir -p ${DATA}
mkdir -p ${FRA}

echo "Création base Stand-Alone ${DBUNIQ} sur ${SERVEUR1}"

# Fichier init.ora
# A adapter selon le besoin
cat <<EOF > ${HOME}/sql/init${DB}.ora
db_name=${DB}
db_block_size=8192
db_create_file_dest=${DATA}
db_recovery_file_dest=${FRA}
db_recovery_file_dest_size=5000M
log_archive_format=${DB}_%t_%s_%r.arch
sga_target=${SGA}
pga_aggregate_target=${PGA}
EOF

# Script de creation
# A adapter, notamment dimension des tablespaces standards ( SYSTEM,SYSAUX,TEMP,UNDO,USERS )
# Le tablespace USERS est volontairement cree et bloque a 100K
cat <<EOF > ${HOME}/sql/create${DB}.sql
create database ${DB}
character set AL32UTF8
national character set AL16UTF16
datafile size 500M autoextend on next 500M maxsize 2G extent management local
sysaux datafile size 500M autoextend on next 500M maxsize 2G
undo tablespace UNDOTBS1 datafile size 500M
default temporary tablespace TEMP tempfile size 500M
default tablespace USERS datafile size 100K
logfile group 1 size 50M,
        group 2 size 50M,
        group 3 size 50M
user sys identified by "${MDP}"
user system identified by "${MDP}";
EOF

ln -sfn ${HOME}/sql/init${DB}.ora ${ORACLE_HOME}/dbs/init${DB}.ora

# Creation de la base
echo "Création de l'instance et des fichiers principaux"
resultat=`sqlplus -s "/ as sysdba" <<EOF
create spfile from pfile;
startup force nomount;
start ${HOME}/sql/create${DB}.sql;
exit;
EOF`

echo "Base de données ${DBUNIQ} créee. Les fichiers de contrôle sont en place."

echo "Création des vues du dictionnaire. Phase assez longue"
resultat=`sqlplus -s "/ as sysdba" <<EOF
@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql

BEGIN
 FOR item IN ( SELECT USERNAME FROM DBA_USERS WHERE ACCOUNT_STATUS IN ('OPEN', 'LOCKED', 'EXPIRED') AND USERNAME NOT IN (
'SYS','SYSTEM') )
 LOOP
  dbms_output.put_line('Locking and Expiring: ' || item.USERNAME);
  execute immediate 'alter user ' ||
         sys.dbms_assert.enquote_name(
         sys.dbms_assert.schema_name(
         item.USERNAME),false) || ' password expire account lock' ;
 END LOOP;
END;
/

connect system/${MDP}
@?/sqlplus/admin/pupbld.sql
@?/sqlplus/admin/help/hlpbld.sql helpus.sql
exit;
EOF

# la base est mise en archivelog.
# Commenter ces instructions en cas de non archivelog.
`resultat=`sqlplus -s "/ as sysdba" <<EOF
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
alter system archive log current;
exit;
EOF`

echo ${DBUNIQ}':'${ORACLE_HOME}':Y' >> /etc/oratab

export FIN=$(date +%s)
echo $(date)
export DUREE=$(( ${FIN} - ${DEBUT} ))
echo "Fin de création. Durée -> ${DUREE}"
exit 0

Le script est suffisamment auto-commenté pour être adapté ou amélioré. Par exemple il peut être intéressant de passer en paramètre le nom de la base.

Dans un prochain billet le même script sera adapté pour utiliser le mode CDB soit Pluggable Database.