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`