Introduction

J'aime la ligne de commande, les scripts et autre installation silencieuse en particulier avec Oracle. La raison est simple, lors de mes interventions je n'ai le plus souvent à ma disposition qu'un accès ssh au serveur. Dans ces conditions connaitre les outils type TOAD ou même Database Control ne me sert pas à grand chose.

J'anime d'ailleurs un cours pour le compte de ORSYS ( pub gratuite ) sur l'administration de Oracle uniquement en ligne de commande.Vous en trouverez le détail via ce lien

Un des sujets de ce cours est la mise en place d'un script de création automatique d'une base de données. Je l'ai voulu simple avant tout, il y manque tous les tests de bonne exécution par exemple. La version complète est disponible ici

Le script contient deux variables

  • INST : le nom de l'instance
  • PASSWORD : le mot de passe pour les user sys et system

Dans l'exemple nous allons créer une base nommée YODA avec comme mot de passe sys et system : manager11

La version présentée est Oracle 11gR2, mais ce script fonctionne très bien aussi en 9i ou 10g.

Répertoires

La norme OFA sera respectée, les fichiers seront donc sous une structure type :

  • /u01/app/oracle/product/11.2.0/dbhome_1 -> $ORACLE_HOME
  • /u01/app/oracle/oradata/YODA
  • /u02/app/oracle/oradata/YODA
  • /u03/app/oracle/oradata/YODA

Variables

Il suffit de les adapter à la création voulue. Il est aussi très simple de les passer en ligne de commande...

#!/bin/bash
# Script de création de base Oracle
INST=YODA # Nom de l'instance
PASSWORD=manager11 # Mot de passe sys et system

Répertoires de la base

mkdir -p /u01/app/oracle/admin/${INST}/pfile
mkdir -p /u01/app/oracle/oradata/${INST}
mkdir -p /u02/app/oracle/oradata/${INST}
mkdir -p /u03/app/oracle/oradata/${INST}

Le fichier init.ora

La base sera créée avec 3 fichiers de contrôle sur des axes différents et une taille mémoire affecté à l'instance de 1,5Go.

# init.ora
cat <<EOF > /u01/app/oracle/admin/${INST}/pfile/init${INST}.ora
db_name = ${INST}
db_block_size = 8192
control_files = /u01/app/oracle/oradata/${INST}/control01.ctl, /u02/app/oracle/oradata/${INST}/control02.ctl, /u03/app/oracle/oradata/${INST}/control03.ctl
sga_target = 1280M
pga_aggregate_target = 320M
EOF

Création du lien symbolique vers $ORACLE_HOME/dbs et du fichier de mot de passe pour la connexion as sysdba.

# Fichier mot de passe et lien symbolique vers init.ora
cd $ORACLE_HOME/dbs
ln -sfn $ORACLE_BASE/admin/${INST}/pfile/init${INST}.ora init${INST}.ora
orapwd file=orapw${INST} password=${PASSWORD}

Création

Dans un premier temps nous allons générer un script SQL pour l'ordre create database.

# Fichier .sql de création
cat <<EOF > $HOME/create${INST}.sql
create database ${INST}
character set UTF8
national character set UTF8
logfile
group 1 ('/u01/app/oracle/oradata/${INST}/redo01a.log','/u02/app/oracle/oradata/${INST}/redo01b.log') size 50M,
group 2 ('/u01/app/oracle/oradata/${INST}/redo02a.log','/u02/app/oracle/oradata/${INST}/redo02b.log') size 50M,
group 3 ('/u01/app/oracle/oradata/${INST}/redo03a.log','/u02/app/oracle/oradata/${INST}/redo03b.log') size 50M
datafile '/u01/app/oracle/oradata/${INST}/system01.dbf' size 500M autoextend on next 100M maxsize 2G extent management local
sysaux datafile '/u01/app/oracle/oradata/${INST}/sysaux01.dbf' size 500M autoextend on next 100M maxsize 2G
undo tablespace UNDO_TBS datafile '/u01/app/oracle/oradata/${INST}/undo_tbs01.dbf' size 25M
default temporary tablespace TEMP tempfile '/u01/app/oracle/oradata/${INST}/temp01.dbf' size 50M;
EOF

La base est créée avec 3 groupes de redo-logs multipléxés en 2 membres. Un tablespace UNDO et un temporaire, du classique.

Le spfile est créé de suite.

# Lancement en mode nomount de l'instance pour création
# Création directe du spfile
export ORACLE_SID=${INST}
resultat=`sqlplus -s "/ as sysdba" <<EOF
startup nomount;
create spfile from pfile;
shutdown immediate;
startup nomount;
start $HOME/create${INST}.sql;
start $ORACLE_HOME/rdbms/admin/catalog.sql;
start $ORACLE_HOME/rdbms/admin/catproc.sql;
alter user sys identified by ${PASSWORD};
alter user system identified by ${PASSWORD};
exit;
EOF`

les scripts catalog et catproc servent à la création du dictionnaire des données.

Script pupbld.sql

Execution du script pupbld.sql. Afin d'éviter le warning suivant :

Error accessing PRODUCT_USER_PROFILE
Warning:  Product user profile information not loaded!
You may need to run PUPBLD.SQL as SYSTEM

Le script créé la table PRODUCT_USER_PROFILE dans le schema SYSTEM. Le message n'est qu'un warning en fait, la connexion est acceptée en l'absence de cette table.

resultat=`sqlplus -s system/${PASSWORD} <<EOF
start $ORACLE_HOME/sqlplus/admin/pupbld.sql
EOF`

Conclusion

Il est très facile de rajouter d'autres ordres SQL à la suite de ce script. L'objectif ici était de présenter une méthode simple de création. La version complète du script est disponible ici. Selon la puissance de la machine il faut compter 10 à 15 minutes pour la création.

Bonus

Ci dessous quelques commandes utiles à rajouter

# Tablespace par défaut
resultat=`sqlplus -s system/${PASSWORD} <<EOF
create tablespace users datafile '/u02/app/oracle/oradata/RED/users_01.dbf' size 100K;
alter database default tablespace users;
exit;
EOF`

# Flash Recovery Area
mkdir -p /u03/app/oracle/flash_recovery_area
resultat=`sqlplus -s "/ as sysdba" <<EOF
alter system set db_recovery_file_dest_size=5G scope=both;
alter system set db_recovery_file_dest='/u03/app/oracle/flash_recovery_area' scope=both;
exit;
EOF`

# Activation du mode archivelog
resultat=`sqlplus -s "/ as sysdba" <<EOF
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
exit;
EOF`