Silverlake - Le blog de ADIMCOR

Aller au contenu | Aller au menu | Aller à la recherche

lundi, mai 6 2013

Configuration à 2 listeners ou plus...

Certains DBA pour faciliter la gestion de leurs bases Oracle affectent un listener à chaque instance. Ainsi il suffit de stopper le listener pour rendre la base indisponible depuis le réseau. Certes la commande "alter system enable restricted session" est plus élégante, mais la configuration à multiples listener est parfois complexe. Il faut en effet indiquer à chaque instance sur quel listener elle doit s'enregistrer. Le paramètre LOCAL_LISTENER est prévu pour cela..

Le schéma ci-dessous présente l'architecture :

2_listeners.jpg

Le principe général est d'affecter YODA à LSNR1 et LUKE à LSNR2. Ainsi YODA est accèssible via le port 1521 alors que LUKE l'est via le port 1522 en TCP/IP.

Stopper le listener actuel.

lsnrctl stop

Il faut dans un premier temps modifier le fichier $ORACLE_HOME/network/admin/listener.ora ainsi afin de créer 2 listener distincts : LIST1 et LIST2.

LIST1 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.10)(PORT = 1521))
    )
  )

ADR_BASE_LIST1 = /u01/app/oracle

LIST2 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.10)(PORT = 1522))
    )
  )

ADR_BASE_LIST2 = /u01/app/oracle

Ensuite ajouter dans $ORACLE_HOME/network/admin/tnsnames.ora des alias vers ces deux listeners. Ce sont ces alias qui serviront pour le paramètre LOCAL_LISTENER.

LSNR1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      ( ADDRESS = ( PROTOCOL = TCP ) ( HOST = 192.168.3.10 )( PORT = 1521))
    )
  )

LSNR2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      ( ADDRESS = ( PROTOCOL = TCP ) ( HOST = 192.168.3.10 )( PORT = 1522))
    )
  )

YODA =
  (DESCRIPTION =
    (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.10)(PORT = 1521))
    )
    (CONNECT_DATA =
       (SERVICE_NAME = YODA)
    )
)

LUKE =
  (DESCRIPTION =
    (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.10)(PORT = 1522))
    )
    (CONNECT_DATA =
       (SERVICE_NAME = LUKE)
    )
)

Redémarrer les deux listeners

lsnrctl start list1
lsnrctl start list2

Activer sur chaque instance le paramètre LOCAL_LISTENER

export ORACLE_SID=YODA
sqlplus "/ as sysdba"
SQL> alter system set local_listener='LSNR1' scope=both
SQL> alter system register ;
SQL> exit;
export ORACLE_SID=LUKE
sqlplus "/ as sysdba"
SQL> alter system set local_listener='LSNR2' scope=both
SQL> alter system register ;
SQL> exit;

Vérifier l'enregistrement correct des instances auprès des listeners

lsnrctl status list1
lsnrctl status list2

dimanche, avril 28 2013

Oracle erreur sur librairie libclntsh.so.11.1

Lors de la mise en place de Oracle sur RedHat ou CentOS, il faut impérativement désactiver la gestion SELinux sinon l'erreur suivante se produit.

sqlplus: error while loading shared libraries: /u01/app/oracle/product/11.2.0/dbhome_1/lib/libclntsh.so.11.1: cannot restore segment prot after reloc: Permission denied

Pour cela éditer le fichier /etc/selinux/config et remplacer la claude SELINUX=enforcing par SELINUX=disabled

Activer la configuration par la commande setenforce 0

mercredi, avril 3 2013

Multiplexer les fichiers de contrôle en ASM

Une base de données, LUKE pour ne pas la nommer, ne comporte qu'un seul fichier de contrôle. Les fichiers de la base sont gérés en ASM et OMF. Ce billet montre comment en créer une seconde copie.

Se connecter à la base afin de connaitre le nom du fichier de contrôle actuel.

export ORACLE_SID=LUKE
sqlplus "/ as sysdba"
SQL> show parameter control_files;

La requête renverra un nom du style : +DATA/luke/controlfile/current.260.811769741

Toujours sous SQL*plus arrêter la base, la démarrer en mode nomount, tenter l'insertion d'un second fichier de contrôle avec le même nom que le premier puis stopper la base

SQL> shutdown immediate;
SQL> startup nomount;
SQL> alter system set control_files='+DATA/luke/controlfile/current.260.811769741','+DATA' scope=spfile;
SQL> shutdown immediate;
SQL> exit;

Demander ensuite une restauration des fichiers de contrôle par RMAN

rman target /
RMAN> startup nomount;
RMAN> restore controlfile from '+DATA/luke/controlfile/current.260.811769741';
Démarrage de restore dans 03/04/13
utilisation du fichier de contrôle de la base de données cible au lieu du catalogue de récupération
canal affecté : ORA_DISK_1
canal ORA_DISK_1 : SID=24 type d'unité=DISK

canal ORA_DISK_1 : copie du fichier de contrôle copiée
nom de fichier de sortie=+DATA/luke/controlfile/current.260.811769741
nom de fichier de sortie=+DATA/luke/controlfile/current.268.811779383
Fin de restore dans 03/04/13

RMAN> exit

Se reconnecter SQL*Plus ouvrir la base de données et vérifier la présence des deux fichiers de contrôle.

sqlplus "/ as sysdba"
SQL> show parameter control_files

NAME				     TYPE	 VALUE
------------------------------------         ----------- ------------------------------
control_files			     string	 +DATA/luke/controlfile/current.260.811769741, +DATA/luke/controlfile/current.268.811779383
SQL> alter database mount;

Base de données modifiée.

SQL> alter database open;

Base de données modifiée.

SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
+DATA/luke/controlfile/current.260.811769741
+DATA/luke/controlfile/current.268.811779383

SQL> 

lundi, février 18 2013

ADVM/ACFS et CentOS

Lors de l'installation du Grid 11gR2 sous CentOS 5.9 un message d'erreur apparaît lors du lancement du script root.sh.

ADVM/ACFS is not supported on centos-release

Ce billet montre la résolution pour une CentOS 5.9 en 32bits. Les sources Oracle sont la version GRID 11.2.0.1 également en 32bits. L'adaptation en 64bits ou à une autre version de noyau est simple.

CentOS n'est pas exactement une RedHat et changer /etc/redhat-release ne suffit pas ( la commande utilisée est rpm -qa | grep release ) , il faut modifier un des fichiers PERL de lancement du démon acfs. Ce fichier est /u01/app/11.2.0/grid/lib/osds_acfslib.pm

cd /u01/app/11.2.0/grid/lib
vi osds_acfslib.pm

Se positionner vers la ligne 280 et rajouter CentOS dans les versions valides

...
# OK, now check to see if we support this release
  $supported = 0;
  if (($release =~ /enterprise-release-5/) ||
         ($release =~ /redhat-release-5/) ||
         ($release =~ /centos-release-5/))
  {
...

Il faut ensuite installer les modules pour le noyau Linux. Dans un premier temps créer un répertoire pour ces modules ( adapter le chemin à la version du noyau de votre machine )

mkdir -p /lib/modules/2.6.18-348.1.1.el5/extra/usm

Puis y recopier les fichiers .ko souhaités, il est naturel que les versions noyau soient différentes. Il s'agit ici d'un CD Oracle 11.2.0.1 en 32 bits ( i386 ).

cp /u01/app/11.2.0/grid/install/usm/EL5/i386/2.6.18-8/2.6.18-8.el5-i686/bin/*.ko /lib/modules/2.6.18-348.1.1.el5/extra/usm

Lancer ensuite la commande de gestion des dépendances et le démon acfs

depmod
/u01/app/11.2.0/grid/bin/acfsload start -s

Cette manipulation est à faire sur tous les noeuds du cluster;

vendredi, janvier 25 2013

Ré-installer un serveur Oracle après sinistre

Toujours dans la logique de démystifier RMAN, je vous propose ici un cas simple et banal.

Votre base et serveur Oracle est détruit. Il ne vous reste que la sauvegarde RMAN. Bien entendu ce scénario implique une perte de données, celles n'étant pas sur la sauvegarde ! Si c'est inacceptable, il faut mettre autre chose en place.

On utilise ici une version 11g mais est adaptable en 10g sans problème. Les hypothèses de départ sont les suivantes :

  • La base de données se nomme RED
  • Les fichiers sous sous /u01, /u02 et /u03
  • La norme OFA est respectée
  • On utilise une Flash Recovery Area.

Dans un premier temps ré-installer le serveur Oracle ( OS + Binaires sans créer de base de données ) voir l'article sur le wiki pour plus de détails.

Créer la structure des répertoires :

mkdir -p /u01/app/oracle/admin/RED/pfile
mkdir -p /u01/app/oracle/oradata/RED
mkdir -p /u02/app/oracle/oradata/RED
mkdir -p /u03/app/oracle/oradata/RED
mkdir -p /u01/app/oracle/flash_recovery_area/RED

Recopier toute la sauvegarde RMAN sous /u01/app/oracle/flash_recovery_area/RED

Créer un initRED.ora provisoire sous /u01/app/oracle/admin/RED/pfile

Contenu de initRED.ora

db_name=RED
db_block_size=8192
db_recovery_file_dest_size=2G
db_recovery_file_dest=/u01/app/oracle/flash_recovery_area

Au niveau du shell

export ORACLE_SID=RED
sqlplus /nolog
SQL> connect / as sysdba
SQL> startup nomount pfile='/u01/app/oracle/admin/RED/pfile/initRED.ora';
SQL> exit

Se connecter à RMAN

rman target /
RMAN> restore spfile from autobackup;
RMAN> shutdown immediate;
RMAN> startup nomount;
RMAN> restore controlfile from autobackup;
RMAN> alter database mount;
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open resetlogs;
RMAN> exit;

Se connecter normalement à RED.

vendredi, janvier 11 2013

Démystifier RMAN

Introduction

Un titre un peu accrocheur pour ce blllet. Je suis toujours surpris quand je donne un cours Oracle de rencontrer beaucoup de stagiaires utilisant import/export pour effectuer les sauvegardes Oracle. Ils ont certes entendu parler de RMAN, mais le produit semble faire "peur".

Ce billet présente une sauvegarde à froid et une restauration avec RMAN.

Sauvegarde à froid

Oracle emploi le mot de sauvegarde cohérente. La base doit donc être stoppée afin que tous les fichiers soit au même niveau de transaction, c'est à dire que toutes les informations sont bien écrites dans les fichiers de données. Les fichiers sont donc en cohérence les uns avec les autres.

Sauvegarder une base avec RMAN à froid est simple surtout si un Flash Recovery Area est en place. Voici les commandes à passer

export ORACLE_SID=YODA
rman target /
RMAN> shutdown immediate;
RMAN> startup mount;
RMAN> backup database;
RMAN> alter database open;
RMAN> exit;

On peut difficilement faire plus simple...

La base doit être stopée et redémarrée en mode MOUNT car les informations de sauvegarde sont stockées dans le fichier de contrôle. La commande backup database sauvegarde l'ensemble des fichiers, en fin de sauvegarde la base est ouverte pour exploitation.

Restauration

"Sauvegarder à rien ne sert, si restaurer ne peut ce faire". Dans l'exemple suivant nous allons supposer que tous les fichiers de données sont perdus.

Voici les commandes à passer :

export ORACLE_SID=YODA
rman target /
RMAN> startup mount;
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open resetlogs;
RMAN> exit;

Conclusion

RMAN est un produit très complet, de plus il est livré avec toute licence Oracle Database, y compris la version XE gratuite. Son utilisation demande de l'apprentissage, il existe chez Orsys ( oui je fais un peu de pub pour un client... ) un cours de 3 jours sur ce sujet.

Ce billet ne fait d'effleurer RMAN, mettre en place juste la sauvegarde est une bonne précotion. Et si vous n'arrivez pas à restaurer, nous les DBA nous saurons !!!

jeudi, novembre 1 2012

Logiciels obsolètes

Le CERTA a diffusé en juin 2012 une note sur l'obsoléscence de certains logiciels, en particulier les OS Linux et Oracle Voir le lien suivant

Oracle annonce la fin de maintenance pour les versions de bases de données inférieures à 11.1.

La version 10G largement diffusée, ne sera plus maintenue à partir de juillet 2013. Le lien suivant permet de connaitre la position de Oracle sur ses produits

versions_oracle.png

jeudi, octobre 18 2012

Connaître le schéma sur lequel on travaille avec oracle

La commande set alter session current_schema permet de passer d'un schéma à un autre simplement.

La requête suivante permet de connaître sous quel user on est identifié et sous quel schéma on travaille.

select sys_context('USERENV','SESSION_USER') current_user, sys_context('USERENV','SESSION_SCHEMA') current_schema from dual;

mercredi, octobre 3 2012

Fonction de calcul du dimanche de Pâques en PL/SQL

Bien que n'étant pas vraiment programmeur, il m'arrive de donner des formations sur PL/SQL. Afin de faire souffrir mes stagiaires, je leur demande d'écrire une fonction calculant le jour de Pâques.

Pâques est une fête mobile qui permet de calculer d'autres jours fériés

  • Lundi de Pâques, le lendemain.
  • L'ascension, 40 jours après Pâques,
  • La Pentecôte, 50 jours après Paques
  • Le lundi de Pentecôte, lendemain du précédent.

La fonction suivante est exacte pour les années 1955 à 2048.

Pour rédiger ce billet, j'ai pris un des algorythmes sur la page suivante Calcul de Pâques - Wikipédia

create or replace function calc_paques( annee in number ) return date is
a number;b number;c number;d number;e number;de number;
paques date;
begin
a := mod( annee,19 );b := mod( annee,4 );c := mod( annee,7 );
d := mod(( (19 * a) + 24 ),30 );
e := mod(( (2 * b) + (4 * c) + (6 * d) + 5 ), 7);
de := d + e;
if de > 9 then
select to_date( to_char( de - 9 ) ||'/04/' || to_char( annee ), 'DD/MM/YYYY') into paques from dual;
else
select to_date( to_char( 22 + de ) ||'/03/' || to_char( annee ), 'DD/MM/YYYY') into paques from dual;
end if;
if paques > to_date( '25/04/' || to_char( annee ), 'DD/MM/YYYY') then
paques := paques - 7;
end if;
return paques;
end;
/

Son utilisation sous SQL*Plus reste basique

select calc_paques( to_number(to_char(sysdate,'YYYY'))) from dual;

Fonction à intégrer dans un package de gestion des dates bien pratique aux DRH et autres logiciels de logistique...

vendredi, juillet 6 2012

Export avec exp et tables vides en Oracle 11gR2.

Bien que déprécié l'utilitaire exp est toujours très utilisé. Il existe un "bug" en version 11gR2 relatif aux tables vides qui ne sont pas exportées.

Attention ce phénomène ne se produit pas en 11.2.0.3 qui est la release actuelle au moment de la rédaction de ce billet.

Pour éviter ce désagrément, il faut positionner le paramètre Oracle DEFERRED_SEGMENT_CREATION à FALSE.

alter system set deferred_segment_creation=false scope=both;

Utiliser, selon les recommendations de Oracle, datapump pour les exports ne produit pas de dysfonctionnement.

mercredi, juin 13 2012

Base Oracle violation règles critiques.

Lors de la création d'une base Oracle, certaines permissions violent des règles de sécurité. Dans le Database Control ceci se manifeste par un certain nombre ( 8 par défaut ) d'alerte en page d'accueil.

Eliminer ces alertes est assez simple, 6 d'entre elles concernent l'affectation de droit d'execution à PUBLIC. Se connecter sous sqlplus et exécuter les ordres suivants :

revoke execute on utl_tcp from public;
revoke execute on utl_http from public;
revoke execute on utl_smtp from public;
revoke execute on utl_file from public;
revoke execute on dbms_lob from public;
revoke execute on dbms_job from public;

Le dernier ordre ( dbms_job ) prend un peu de temps.

Il reste deux règles, la première concerne les droits sur le répertoire audit et à déjà fait l'objet d'un billet ( voir ici ). Il suffit de passer la commande suivante en tant que user oracle.

chmod o-rx $ORACLE_HOME/rdbms/audit

La dernière concerne la mise en place d'une fonction de vérification des mots de passe pour le profil DEFAULT. Oracle fournit un script pour celà qu'il est possible de personnaliser.

start $ORACLE_HOME/rdbms/admin/utlpwdmg.sql

Ce script passe les ordres suivants :

ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 180
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1
PASSWORD_VERIFY_FUNCTION verify_function_11G;

La fonction de vérification contient les règles suivantes :

  • Le mot de passe est différent du user
  • La longueur est au moins de 8 caractères
  • Le mot de passe est testé sur un mini dictionnaire afin d'eviter certains mots.
  • Le mot de passe contient au moins une lettre et un chiffre.
  • Le nouveau mot de passe doit être different par 3 lettres du précédent.

Et s'il vous plait, ne pas mettre system/manager. Si vous saviez le nombre de bases, y compris dans des sociétés prestigieuses, où je me suis connecté ainsi...

Il suffit de rédemarrer le database control ou de patienter 24 heures, les alertes auront disparues.

mercredi, juin 6 2012

Diagnostiquer les problèmes sous Oracle 11g

Introduction

La version 11g introduit une nouvelle infrastructure pour le diagnostic des problèmes, Automatic Diagnostic Repository.

ADR se présente sous la forme d'une arborescence de répertoires qui stocke de manière centralisée les données de diagnostic.

Il existe 2 concepts :

  • Les problèmes : Erreur Internes ORA-00600, OS ORA-07445...Chaque problème inclut un code ORA...et éventuellement des paramètres supplémentaires.
  • Les incidents : Il s'agit d'une occurrence d'un problème, chaque incident porte un numéro

Le référentiel ADR

Stocke tous les fichiers de traces et journaux pour l'ensemble des produits s'exécutant sur le serveur.

  • BD,
  • listener...

Défini par le paramètre DIAGNOSTIC_DEST, sa valeur par défaut est $ORACLE_BASE si cette variable est définie, sinon $ORACLE_HOME/log

La racine de ce répertoire se nomme diag et contient un sous répertoire par produit Oracle

  • rdbms → BD, ce répertoire contient un sous répertoire par instance de base de données.
  • tnslsnr→ listener...

Les principaux répertoires sont :

  • Alert : Fichier d'alerte format XML
  • Incident : Fichiers relatifs aux incidents
  • Trace : Fichier de trace des processus et format texte du fichier d'alerte bien connu ( alert.log )

Les anciens paramètres BACKGROUND_DUMP_DEST et USER_DUMP_DEST sont dépréciés.

Fichiers d'alertes et de traces

Oracle maintient un fichier d’alerte dans lequel il écrit des messages d’information ou d’erreurs sur la vie de la base de données :

  • Création de la base de données,
  • Démarrages et arrêts,
  • Modifications de la structure (tablespaces, fichiers de données),
  • Erreurs internes (ORA-00600, ORA-07445),
  • Erreurs de bloc corrompu (ORA-01578),
  • Problèmes relatifs à l’écriture ou à l’archivage des fichiers de journalisation.

En complément, lorsqu’un processus rencontre un problème, il écrit des informations dans un fichier de trace.

Le fichier d'alerte est disponible sous deux formats : texte et XML.

  • Le nom du fichier d’alerte xml est de la forme : log.xml ( sous répertoire alert )
  • Le nom du fichier d’alerte texte est de la forme : alert_<SID>.log ( sous répertoire trace )

Processus d'arrière plan ( sous répertoire trace )

  • Le nom des fichiers de trace des processus d’arrière-plan est de la forme : <sid>_<nom_processus>_<id_processus>.trc.
  • Le nom des fichiers de trace des processus serveur est de la forme : <sid>_ora_<id_processus>.trc.

ADRCI

Automatic Diagnostic Repository Command Interpreter. Outil ligne de commande et interactif pour gérer les erreurs Oracle. Dans ce billet nous allons voir les fonctionnalités suivantes :

  • Visualiser le fichier alert.log
  • Gestion des problèmes et des incidents
  • Création de packages zippés pour envoi au support Oracle.
  • Purge des fichiers de traces.

Pour la rédaction de cet exemple, je me suis inspiré de l'article anglais suivant

Un exemple de dysfonctionnement

Se connecter en sys

sqlplus sys/manager11@red as sysdba
SQL> create user alice identified by ecila;
SQL> grant connect,resource to alice;
SQL> connect alice/ecila@red
SQL> create table t ( n number );
SQL> select object_id from user_objects;

Noter le numéro retourné par la requête ( exemple 17322 ) et se reconnecter sys

SQL>connect sys/manager11@red as sysdba
SQL>update tab$ set cols=2 where obj#=17322;
SQL>commit;

Cet update fausse le dictionnaire des données, à ne pas faire en production !

Tester le dysfonctionnement

Dans un premier temps purger la shared_pool afin de vider le dictionnary cache

SQL> alter system flush shared_pool;

Se reconnecter alice

SQL> connect alice/eciala@red
SQL> select * from t;
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 2236
Session ID: 29 Serial number: 9

Sortir du SQL par exit

Utilisation de adrci

Au niveau du shell, lancer adrci, puis la commande show home

adrci>show home
ADR Homes: 
diag/tnslsnr/SILVERLAKE/listener
diag/rdbms/red/RED

Il existe plusieurs ADR directory, relatives ici au listener ( diag/tnslsnr ) et au moteur de Oracle ( diag/rdbms ). L'erreur s'est produite au niveau du moteur Oracle donc rdbms. Toujours sous adrci, se positionner dans la bonne arborescence.

adrci> set home diag/rdbms/red/RED

Visualiser la fin du fichier alert.log

adrci>show alert -tail

Identifier le problème

ADR défini les concepts de problème et d'incident.

Un incident est une occurrence d'un problème, ainsi si la même erreur se reproduit une seconde fois il n'y aura qu'un problème mais 2 incidents.

Ouvrir une seconde session et sous sqlplus en connexion alice et relancer la commande select * from t;

A nouveau sous adrci taper la commande show problem.

adrci>show problem

Relever le numero du problème ( problem_id ) exemple ici : 1

Identifier les incidents

adrci> show incident

Relever le numéro de l'incident, par exemple 12971.

Demander l'affichage de l'incident

adrci> show incident -mode detail -p "incident_id=12971"

Repérer le numéro du PROBLEM_ID et demander l'édition de la trace, il s'agit du nom de fichier de la dernière ligne.

adrci>show trace /u01/app/oracle/diag/rdbms/yoda/YODA/incident/incdir_12971/YODA_ora_2944_i12971.trc

Ceci lance dans vi le fichier trace, il est possible de retrouver la requête SQL en recherchant le mot "current_sql"

***** Current SQL Statement for this session (sql_id=89km4qj1thh13) *****
         select * from t
 ***** current_sql_statement *****

Envoyer les traces au support Oracle

Le problème généré dans cet exemple ne peut pas être facilement diagnostiqué, aussi il faut envoyer les traces au support oracle, pour cela créer un package zippé.

adrci>ips create package problem 1 correlate all
Created package 2 based on problem id 1, correlation level all

Selon le cas, le chiffre peut être différent de "1"

adrci>ips generate package 2 in "/home/oracle"
Generated package 2 in file /home/oracle/ORA7445qc_20120606132038_COM_1.zip, mode complete

Ici aussi, selon le cas le chiffre peut être différent de "2"

Envoyer le fichier zip à Oracle.

Il existe sous My Oracle Support une page spéciale pour ce type d'erruer ( ORA-00600 et ORA-07445 )

Purge des traces

Avec le temps il est nécessaire de purger les traces. La commande suivante liste l'ensemble des traces par ordre chronologique

adrci> show tracefile -rt

La durée de retention par défaut des traces ordinaires( switch redo log par exemple ) est de 720 heures, soit 30 jours. Pour les incidents 8760 heures soit un an

adrci>show control
SHORTP_POLICY : Traces ordinaires → 720
LONGP_POLICY : Incidents → 8760

Ceci se paramètre par les commandes suivantes :

adrci> set control (SHORTP_POLICY = 360) → 15 jours
adrci> set control (LONGP_POLICY = 2190) → 3 mois.

Pour purger les traces on indique le nombre de minutes, par exemple purger les traces de plus de 2 jours ( 2880 minutes )

adrci> purge -age 2880 -type trace

dimanche, avril 8 2012

Script shell pour création base oracle

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`

vendredi, janvier 27 2012

Restaurer une base Oracle sur une autre machine

Ce billet présente le mode opératoire de restauration d'une base Oracle en version 10g avec RMAN.

On part du principe que le serveur est détruit et qu'il ne reste que la sauvegarde RMAN de disponible.

Dans l'exemple la base de données se nomme RED.

Installer l'OS et les binaires Oracle comme d'habitude.

Créer les répertoires sur la nouvelle machine, sous l'identité oracle.

mkdir -p /u01/app/oracle/admin/RED/bdump
mkdir -p /u01/app/oracle/admin/RED/udump
mkdir -p /u01/app/oracle/admin/RED/pfile
mkdir -p /u01/app/oracle/oradata/RED
mkdir -p /u02/app/oracle/oradata/RED
mkdir -p /u03/app/oracle/oradata/RED
mkdir -p /u01/app/oracle/flash_recovery_area/RED

Recopier toute la sauvegarde sous /u01/app/oracle/flash_recovery_area/RED

Créer un initRED.ora provisoire sous /u01/app/oracle/admin/RED/pfile

Contenu de initRED.ora

db_name=RED
db_recovery_file_dest_size=2G
db_recovery_file_dest=/u01/app/oracle/flash_recovery_area

Au niveau du shell

export ORACLE_SID=RED
sqlplus /nolog
SQL> connect / as sysdba
SQL> startup nomount pfile='/u01/app/oracle/admin/RED/pfile/initRED.ora';
SQL> exit

Dans un premier temps nous allons restaurer le vrai fichier de paramètres, puis redémarrer la base dessus.

Se connecter à RMAN

rman target /
RMAN> restore spfile from autobackup;
RMAN> shutdown immediate;
RMAN> startup nomount;
RMAN> restore controlfile from autobackup;
RMAN> alter database mount;
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open resetlogs;
RMAN> exit;

L'ordre recover database va certainement échouer, car les redo-logs sont perdus. Sauf si bien sur il existe une copie ailleurs...

Se connecter normalement à RED.

dimanche, janvier 15 2012

Installer le database control en ligne de commande

Ce billet concerne la version 10g de Oracle.

Lors de la création manuelle d'une base Oracle, sans l'assistant dbca, le database control n'est pas configuré, il est bien évidement possible de le faire à postériori. La commande permettant ceci est emca qui peut s'appeler en mode intéractif, mais aussi avec un fichier de réponse.

Dans l'exemple suivant, nous allons utiliser une base de données nommée YODA, sur un serveur appelé adi100.concarnux.fr. Le mot de passe des utilisateurs sys, dbsnmp et sysman étant manager10.

La syntaxe du fichier est très claire pour l'adapter à la configuration souhaitée.

Remplir les clauses EMAIL_ADDRESS et MAIL_SERVER_NAME est facultatif, mais une demande sera faite intéractivement;

Créer un fichier, par exemple em.rsp avec les lignes suivantes :

HOST=adi100.concarnux.fr
SID=YODA
PORT=1521
ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
EMAIL_ADDRESS=votre_mail
MAIL_SERVER_NAME=votre_serveur_smtp
DBSNMP_PWD=manager10
SYSMAN_PWD=manager10
SYS_PWD=manager10

Dans le cas d'utilisation de ASM il faut compléter ce fichier avec les lignes suivantes :

ASM_OH=/u01/app/oracle/product/10.2.0/db_1
ASM_SID=+ASM
ASM_PORT=1521
ASM_USER_ROLE=sysdba
ASM_USER_NAME=sys
ASM_USER_PWD=manager10

Lancer ensuite la commande de création

emca -config dbcontrol db -repos create -respFile em.rsp

Pour récréer un database control

emca -config dbcontrol db -repos recreate -respFile em.rsp

samedi, janvier 14 2012

Oracle 10g version 10.2.0.5 et trace dans udump

Le patchset 10.2.0.5 est le dernier en date, à la rédaction de ce billet, il y a toutefois un soucis léger, le niveau de trace dans le répertoire pointé par USER_DUMP_DEST est assez fort. Il est possible de corriger cela simplement en installant le patch 10248542.

Il y a toutefois un pré-requis, il faut utiliser la version 10.2.0.5.1 de OPatch, car celle qui est dans le patchset 10.2.0.5 est la 10.2.0.4.1 et donc non conforme. En clair il faut patcher avant de patcher !

Depuis My Oracle Support télécharger le patch 6880880. l'installation est simple, il suffit de décrompresser le zip dans $ORACLE_HOME et de remplacer tous les fichiers existants.

Procéder ensuite à l'installation du patch 10248542.

jeudi, décembre 22 2011

Mise en place d'un dataguard sous Oracle 10g

Le dataguard, on disait standby database avant, permet de disposer d'une base de secours sur laquelle il est possible de basculer en cas d'arrêt de la base de production.

La gestion du dataguard comporte de très nombreuses fonctionnalités, j'ai voulu décrire la mise en place d'une configuration simple avec deux serveurs. Si l'un s'arrête, on bascule sur l'autre.

Le temps d'indisponibilité est faible. Attention un dataguard n'est pas une configuration RAC, il protège de la perte de données mais n'est pas une solution de haute disponibilité.

L'article est assez conséquent et se trouve sur le wiki de Silverlake via ce lien

Pour simuler l'environnement, je suis parti sur un serveur avec CentOS 5.7 et deux VM sous XEN

L'image ci-dessous ( honteusement pompée sur le site Oracle ) montre le principe du dataguard.

odg_arch.gif

J'ai apporté un soin particulier ( comme toujours ? ) à rendre ce billet le plus clair possible, tout retour est le bienvenu.

samedi, décembre 17 2011

PFILE ou SPFILE

La requête suivante permet de savoir si la base a été démarrée avec un pfile ou un spfile

select decode(count(*), 1, 'spfile', 'pfile' )
from v$spparameter
where rownum=1
and isspecified='TRUE';

jeudi, décembre 1 2011

Améliorer SQL*Plus

Deux fonctionnalités basiques mais au combien indispensables sous SQL*Plus

  • Définir l'éditeur de texte, appelé par la commande ed
  • Changer le prompt SQL > en mettant le nom de l'utilisateur connecté et la chaine Oracle*Net

Pour rendre définitif ces fonctionnalités, il faut éditer le fichier $ORACLE_HOME/sqlplus/admin/glogin.sql et y ajouter les deux lignes suivantes :

define _editor=vi
set sqlprompt "&_user:&_connect_identifier > " 

mardi, novembre 29 2011

Logminer via Database Control

La version 11g de oracle offre la possibilité de visualiser les transactions, et de les défaire, depuis le Database Control.

Cette fonctionnalité est accessible par l'onglet "Disponibilité", rubrique "Visualiser et gérer les transactions"

logminer-dbcontrol.png

Il y a toutefois des pré-requis, la base doit être en mode archivelog et il faut activer des "supplemental log". Se connecter en sysdba sur la base et passer les deux commandes suivantes :

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;

Un article très complet en langue anglaise est disponible via ce lien.

- page 1 de 4