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.