Imprimer Imprimer

Architecture (s) Oracle

Administration Oracle, Divers pas de Commentaire »

Architectures locales et réparties

On peut distinguer essentiellement 3 types d’architecture globale de systèmes d’information basés sur Oracle :

  • architecture locale
    Tout est sur le même serveur matériel, programme client et serveur de données Oracle

    archi locale

  • architecture client/serveur
    On a 2 poles : client + serveur
    On a un programme client (un exécutable) sur le poste client, dit alors ‘client lourd’ . Le PC communique avec le serveur de données sur un serveur distant, via le réseau, et la couche Oracle Net.

    archi 2 tier

  • architecture 3 tiers
    On a 3 poles : cleint / serveur d’application /serveur de donnéesPas de programme client. Un navigateur suffit sur le poste de travail (dit alors ‘client léger’). Il dialogue avec le seveur de données distant via http.

archi 3 tier

note : il existe également des architectures n- tiers plus anecdotiques, mais conceptuellement intéressantes

Instance ?
Rappel : Une instance est caractérisée par son identificateur : SID, généralement une variable ORACLE_SID positionnée dans l’environnement.

Une instance active en mémoire ce sont :
- des programmes de fond, services ou processus, qui assurent la maintenance du serveur de données et les entrées / sorties fichiers
- des process server (dédiés ou non à un utilisateur)
- une zone globale partagée : la SGA, qui contient essentiellement du cache de buffers
- des zones mémoires dédiées aux utilisateurs : les PGAs (Private Global Area)

instance gene

Schéma de l’architecture générale en mémoire

La SGA
La SGA est essentiellement un cache mémoire qui contient des infos partagées de la base.

Les process de fond
Ils permettent de paralléliser et désynchroniser les accès multi-utilisateur à la base.
Nous allons lister les principaux :

  • DBWn Database Writer
    Ecrit les données modifiées, du cache de données de la SGA vers les fichiers de données. On peut en avoir plusieurs (max 20) suivant la valeur du parametre DB_WRITER_PROCESSES
  • LGWR Log Writer
    Ecrit les mises à jour, du cache de LOG de la SGA vers les ou le fichiers REDOLOG, suivant qu’on utilise des LOGs multiplexés ou non.
  • CKPT Checkpoint
    Signale l’occurence d’un point de reprise (flush de tous les buffers de données), à DBWR
  • PMON Process Monitor
    Libère les ressources et nettoie le cache en cas d’échec d’un process utilisateur
  • SMON System Monitor
    Surveille les process de l’instance et assure les restaurations d’instance
  • RECO Recoverer
    Gère les transactions distribuées (commit à 2 phases)

et optionnellement :

  • ARCn Archiver
    sauvegarde le REDOLOG qui vient d’être terminé
  • Dnnn Dispatcher
    Distribue les accès utilisateurs, vers les serveurs partagés, en architecture multiplexée (Shared Server)
  • Snnn Shared Server
    Process utilisateurs partagé, en architecture multiplexée
  • CJQn Coordinateur de jobs batch
    Jnnn Process fils dédiés aux Jobs
  • QMNn - Queue monitor
    gestionnaire de file d’attente, pour l’option Oracle Advanced QUeuing
  • Pnnn Esclave d’execution Parallele
    Exécution des requêtes parallèles. Le nb max de process est donné par : PARALLEL_MAX_SERVERS
  • LCKn Lock monitor
    verrouillage des ressources utilisées par plusieurs instances
  • LMS Global cache service
    Gestion des ressources inter-instances en architecture cluster (RAC)

instance detail

note : sous Unix/Linux ces process correspondent à des process Unix, qui appartiennent à l’utilisateur Oracle et s’exécutent de manière ‘déconnectée’ (background).
On peut facilement en avoir la liste avec la commande suivante :
$> ps -ef |grep oracle

process unix

Sous Windows ils correspondent à des services :

services

Imprimer Imprimer

ORA-01031 / ORA-06512

Divers, Musée des erreurs pas de Commentaire »

Probleme lors de l’export 10g
sur APEX et les applications utilisant des ‘domain index’ORA-01031: insufficient privileges
ORA-06512: at “SYS.DBMS_EXPORT_EXTENSION”, line 257
ORA-06512: at line 1
EXP-00078: Error exporting metadata for index WWV_FLOW_OH_IDX. Index creation wi
ll be skipped
C’est un BUG en plus des droits standards d’export, il faut des GRANT SELECT explicites sur les tables ayant des index de domaine…

On fait un scrit pour trouver les tables à GRANTer :

SQL > select ‘GRANT SELECT ON ‘||OWNER||’.'||TABLE_NAME||’ TO user_qui_fait_lexport;’
from dba_indexes
where index_type=’DOMAIN’

–>

GRANT SELECT ON KF.STATES TO user_qui_fait_lexport;
GRANT SELECT ON KF.INTERSTATES TO user_qui_fait_lexport;
GRANT SELECT ON KF.OCEAN TO ORA_BAT;
GRANT SELECT ON KF.TERRITORIES TO ORA_BAT;

et executer les grant !

Imprimer Imprimer

Calculer les statistiques pour tous les objets d’un schema

Divers, scripts et trucs pas de Commentaire »

Si l’optimiseur est un peu fatigué et que les requetes sql ne sont pas meix on peut toujours essayer d’aider le dit optimiseur en recalculant les statistiques pours tous les objets du schema.

Il existe un package Oracle pour ca en 9i et 10g, plutot que de faire de fastidieux ANALYZE TABLE…COMPUTE .

C’est DBMS_STATS et la procedure GATHER_SCHEMA_STATS

begin
dbms_stats.gather_schema_stats(’&OWNER’,DBMS_STATS.AUTO_SAMPLE_SIZE,false,
‘FOR ALL COLUMNS SIZE AUTO’,1,’GLOBAL’,true,null,null,’GATHER AUTO’);
end;
/

ou plus simplement (en utilisant les valeurs par defaut des parametres :

execute dbms_stats.gather_schema_stats(ownname=>’nom_du_proprietaire’);

Pour plus d’infos sur le paramétrage voir la doc officielle PL/SQL supplied packages

et la procedure GATHER_SCHEMA_STATS du package DBMS_STAT

Bonnes stats !

Imprimer Imprimer

Introduction PL/SQL

Divers pas de Commentaire »

PL/SQL est un langage qui intègre SQL et permet de programmer de manière procédurale. Il est spécifique ? Oracle. Pour SQL Server il existe par exemple un équivallent : TRANSAC SQL

Globalement, avec PL/SQL on aura ? notre disposition un vrai langage de programmation moins intuitif mais aussi plus puissant que le SQL. Les 2 langages sont éminemment complémentaires.

Les principaux avantages / inconvénients sont les suivants :
- ne dispense pas de connaître le SQL,
- permet le traitement par bloc de SQL et donc optimise le trafic réseau,
- l’utilisation de variable de stockage et de type simple et strucuré dynamique (%TYPE, %ROWTYPE, etc)
- des traitements plus complexes, notamment pour la gestion des cas particuliers et des erreurs (traitement des exceptions),
- l’utilisation de librairies standards prédéfinies (supplied PLSQL packages, comme les RDBMS_xxx),
- un paramétrage et la création d’ordres SQL dynamiques.

Le PL/SQL peut être utilisé sous 3 formes :

* un bloc de code, executé comme une commande SQL, viua un interpréteur standard (SQL+ ou iSQL*PLus)
* un fichier de commande PL/SQL
* un programme stocké (procédure, fonction, package ou trigger)

ordres SQL supportés dans PL/SQL

Les instructions du langage de manipulation de données (LMD) et certaines instructions de gestion de transaction, ? savoir :
- INSERT, UPDATE, DELETE, SELECT,
- COMMIT, ROLLBACK, SAVEPOINT,
- LOCK TABLE,
- SET TRANSACTION READ ONLY.
Avec les versions antérieures ? la 9i, Les ordres du LDD ne sont pas supportés par défaut il faut utiliser un package spécial comme dans le script suivant.

Autres composants du langage PL/SQL

Les principales autres instructions (non SQL) du PL/SQL sont les suivantes :
CLOSE, EXECUTE IMMEDIATE, FETCH, FORALL, GOTO, IF, LOOP, NULL, OPEN, FOR, RAISE, RETURN

A cela s’ajoute les opérateurs :
d’affectation : ‘:=’, ‘(SELECT) INTO’ et ‘(FETCH) INTO’
+ les opérateurs classqiues du SQL : ||, >, >, >=, <=, <>, !=, …

La liste des mots réservés PL/SQL est disponible ici,
http://didier.deleglise.free.fr/plsql/plsql_mots_reserves.pdf…au format PDF.


Blocs et sections PL/SQL

Les blocs de code s’appellent également des blocs anonymes.
Ils commenceront simplement par un ‘BEGIN’ ou un ‘DECLARE’.
Ils sont composés de 1 ? 3 sections :
Type de section obligatoire ? Mots clés
section déclarative non DECLARE…
section exécutable oui BEGIN …END;
section de traitement des exceptions non EXCEPTION

la section ‘exception’ quand elle est présente est incluse dans la section exécutable et NON PAS ? la suite de celle ci.

(DD is proud to announce…)le plus petit bloc PL/SQL au monde:

SQL> BEGIN
NULL;
END;
.
/
Procedure PL/SQL terminee avec succes.

le bloc ne peut pas être vide et doit contenir au moins une instruction…le ‘.’ sous SQL*PLus sert a arrêter la saisie du code PL/SQL et le ‘/’ comme toujours ? executer le contenu du buffer de commande courant.

avec une déclaration de variable un (tout petit) bloc PL/SQL ca donne ça :

SQL> DECLARE x INTEGER;
BEGIN
X := 1;
END;
.
Procedure PL/SQL terminee avec succes.

un bloc avec des exceptions a donc la structure suivante :

DECLARE — mes déclarations de variables…
BEGIN — début de la section executable
– mes ordres SQL et PLSQL
EXCEPTION
– mon traitement des exceptions
END; — la fin du bloc executable

Gestion des exceptions

Les exceptions peuvent se déclencher automatiquement en cas d’erreur système ou de pb réseau par exemple, ou explicitement avec l’instruction ‘RAISE’

Il existe des exception prédéfinies, des exceptions génériques et des exceptions définies par l’utilisateur.

exemple :

DECLARE S VARCHAR(15);
BEGIN
S := ‘Salut’;
DBMS_OUTPUT.PUT_LINE(S||’ les gars’);
EXCEPTION
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(’On a une exception générique ici’);
END;

WHEN OTHERS permet de gérer toutes les exceptions qui ne sont pas prédéfinies dans Oracle.
De manière classique en utilisant le SQLCODE (le code de retour donnant le no de l’erreur Oracle survenue)


EXCEPTION
— pb de connexion, une exception prédéfinie
WHEN LOGIN_DENIED Then

— dans tous les autres cas…
WHEN OTHERS THEN
If SQLCODE = … Then …
Elsif SQLCODE = … Then …

End if ;
END;

Voici la liste de ces dernières :

Nom exception Code Erreur
———————— ———–
ACCESS_INTO_NULL ORA-06530
CASE_NOT_FOUND ORA-06592
COLLECTION_IS_NULL ORA-06531
CURSOR_ALREADY_OPEN ORA-06511
DUP_VAL_ON_INDEX ORA-00001
INVALID_CURSOR ORA-01001
INVALID_NUMBER ORA-01722
LOGIN_DENIED ORA-01017
NO_DATA_FOUND ORA-01403
NOT_LOGGED_ON ORA-01012
PROGRAM_ERROR ORA-06501
ROWTYPE_MISMATCH ORA-06504
SELF_IS_NULL ORA-30625
STORAGE_ERROR ORA-06500
SUBSCRIPT_BEYOND_COUNT ORA-06533
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532
SYS_INVALID_ROWID ORA-01410
TIMEOUT_ON_RESOURCE ORA-00051
TOO_MANY_ROWS ORA-01422
VALUE_ERROR ORA-06502
ZERO_DIVIDE ORA-01476

NO_DATA_FOUND est fréquemment utilisée dans les programmes, lorsqu’on veut finir une boucle de lecture de lignes par exemple.
LOGIN_DENIED également, acr les pbs de connexions sont en pratique assez nombreux.

Imprimer Imprimer

Contraintes d’intégrité

Administration Oracle, Divers pas de Commentaire »

Les contraintes sont des règles de gestion, qui doivent (normalement) être vérifiées lors des mises ? jour (INSERT, UPDATE, DELETE).
Ces contrôles sont centralisés dans la base, au niveau de la structure de la table elle même et non pas déportées sur l’application cliente.
Une mise ? jour qui ne satisfait pas une contrainte, déclenche une erreur d’exécution :’…CONSTRAINT VIOLATED…’
Dans certains cas les contraintes peuvent être momentanément invalidées (DISABLEd ou DEFERRED).

Il y a plusieurs types de contraintes :

- NULL : valeur indéfinie (??)
- NOT NULL : valeur obligatoire (non indéfinie)
- DEFAULT : une valeur par defaut si non renseignée
- UNIQUE : !
- PRIMARY KEY : clé primaire (identifiant de la table, obligatoire ET unique)
- FOREIGN KEY : clé étrangère ‘colonne qui référence la clé primaire d’une autre table)
- CHECK : doit vérifier une condition

On peut créer des contraintes directement avec l’instruction ‘CREATE TABLE’ ou en ajouter / modifier / supprimer, respectivement avec les instructions ‘ALTER TABLE ADD | MODIFY |DROP CONSTRAINT …’

exemples de contraintes

– exemple de table avec des colonnes …
– et des contrainte NOT NULL, UNIQUE, PRIMARY KEY et CHECK

SQL> DROP TABLE employe_dd;

SQL> CREATE TABLE employe_dd
( employee_id NUMBER(6) PRIMARY KEY
, last_name VARCHAR2(25) NOT NULL
, salary NUMBER(8,2)
, CONSTRAINT emp_salary_min_dd CHECK (salary > 0)
, email VARCHAR2(25) NOT NULL
, CONSTRAINT emp_email_dd UNIQUE (email)
, commission_pct NUMBER(2,2)
, department_id NUMBER(4)
) ;

– exemple de table avec clé primaire et étrangère NOMMEES rajoutées ? posteriori
– ici la contrainte NOT NULL est nommée…

SQL> DROP TABLE departement_dd;

SQL> CREATE TABLE departement_dd
( department_id NUMBER(4)
, department_name VARCHAR2(30) CONSTRAINT dept_name_dd_nn NOT NULL
, location_id NUMBER(4)
) ;

SQL> ALTER TABLE departement_dd
ADD ( CONSTRAINT dept_id_dd_pk PRIMARY KEY (department_id));

SQL> ALTER TABLE employe_dd
ADD ( CONSTRAINT emp_dept_dd_fk FOREIGN KEY (department_id)
REFERENCES departement_dd );

Note : la contrainte d’intégrité référentielle impose qu’un employé appartienne a un département EXISTANT.
Symétriquement, si l’on veut supprimer un département qui a des employes on viole la contrainte :
SQL> delete from departments where department_id=10;
–> erreur : ORA-02292: violation de contrainte (HR.EMP_DEPT_FK) d’intégrité - enregistrement fils existant

Il existe une clause ‘ON DELETE CASCADE’ qui permet de déclencher une suppression automatique des lignes ‘filles’ si une ligne ‘mère’ est supprimée : supprimer par exemple tous les emplyés associés ? un departement qui vient d’être supprimé…

SQL> ALTER TABLE employees
ADD ( CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
REFERENCES departments ON DELETE CASCADE )
SQL> select count(*) from employees
WHERE department_id=100;
–> 6
SQL> DELETE from departments WHERE department_id=100;
–> 1 row deleted
mais les lignes de ‘employees’ correspondantes ont également été supprimées :
SQL> select count(*) from employees
WHERE department_id=100;
–> 0

Infos dans le référentiel

SQL> select * from user_constraints

ou + précisément

SQL> select constraint_name, constraint_type, table_name,
search_condition,r_constraint_name, status
from user_constraints
where table_name like ‘%DD’

CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME SEARCH_CONDITION R_CONST_NAME STATUS
—————– ————— ———- —————- ———— ——
EMP_SALARY_MIN_DD C EMPLOYE_DD salary > 0 - ENABLED
SYS_C004030 C EMPLOYE_DD EMAIL IS NOT NULL - ENABLED
SYS_C004029 C EMPLOYE_DD LAST_NAME IS NOT NULL - ENABLED
DEPT_NAME_DD_NN C DEPARTEMENT_DD D_NAME IS NOT NULL - ENABLED
EMP_DEPT_DD_FK R EMPLOYE_DD - DEPT_ID_DD_PK ENABLED
SYS_C004032 P EMPLOYE_DD - - ENABLED
EMP_EMAIL_DD U EMPLOYE_DD - - ENABLED
DEPT_ID_DD_PK P DEPARTEMENT_DD - - ENABLED

invalidation de contraintes

Les clauses ‘DEFERRED’ et ‘DEFERRABLE’ permettent de différer l’application de la contrainte ? la fin de la
transaction :

SQL> create table test(n number check ( n in (10, 20) ) deferrable initially deferred );
SQL> alter session set constraint = deferred;
SQL> insert into test values(100);
–> OK
SQL> insert into test values(200);
SQL> commit;
–> erreur sur la transaction
ORA-02091: transaction annulée
ORA-02290: violation de contraintes (HR.SYS_C004039) de vérification

SQL> alter session set constraint = immediate;
SQL> insert into test values (100);
–> erreur sur l’insertion :
ORA-02290: violation de contraintes (HR.SYS_C004039) de vérification

On peut également utiliser les clause ENABLE/DISABLE de ‘ALTER TABLE’
ENABLE VALIDATE : s’applique aux lignes existantes dans la table
ENABLE NOVALIDATE : aux ligne futures
DISABLE : inhibe la contrainte

SQL> CREATE TABLE test (n number , constraint nb_ok check ( n in (10, 20) ));
SQL> insert into test values (100);
– erreur : ORA-02290: violation de contraintes (HR.NB_OK) de vérification
SQL> ALTER TABLE test DISABLE CONSTRAINT nb_ok ;
SQL> insert into testing values(100);
–> 1 ligne insérée (la contrainte était inhibée)

ALTER TABLE test ENABLE NOVALIDATE CONSTRAINT nb_ok;
–> OK : Table Altered…

ALTER TABLE test ENABLE VALIDATE CONSTRAINT nb_ok;
–> erreur : ORA-02293: impossible de valider (HR.NB_OK)
- violation d’une contrainte de contrôle

la clause validate, force le controle de la contraine sur la lignes existantes et la valeur ‘100′ insérée précédemment est non conforme…

Voici un exemple complet de création de mini base avec contraintes, d’après les tables de démo HR officielles d’Oracle :

Rem
Rem $Header: hr_cre.sql 29-aug-2002.11:44:03 hyeh Exp $
Rem Copyright (c) 2001, 2002, Oracle Corporation. All rights reserved.
Rem

REM ****************************************************
REM Create the REGIONS table to hold region information for locations
REM HR.LOCATIONS table has a foreign key to this table.

Prompt ****** Creating REGIONS table ….

CREATE TABLE regions
( region_id NUMBER
CONSTRAINT region_id_nn NOT NULL
, region_name VARCHAR2(25)
);

CREATE UNIQUE INDEX reg_id_pk
ON regions (region_id);

ALTER TABLE regions
ADD ( CONSTRAINT reg_id_pk
PRIMARY KEY (region_id)
) ;

REM ********************************************************
REM Create the COUNTRIES table to hold country information for customers
REM and company locations.
REM OE.CUSTOMERS table and HR.LOCATIONS have a foreign key to this table.

Prompt ****** Creating COUNTRIES table ….

CREATE TABLE countries
( country_id CHAR(2)
CONSTRAINT country_id_nn NOT NULL
, country_name VARCHAR2(40)
, region_id NUMBER
, CONSTRAINT country_c_id_pk
PRIMARY KEY (country_id)
)
ORGANIZATION INDEX;

ALTER TABLE countries
ADD ( CONSTRAINT countr_reg_fk
FOREIGN KEY (region_id)
REFERENCES regions(region_id)
) ;

REM ********************************************************
REM Create the LOCATIONS table to hold address information for company departments.
REM HR.DEPARTMENTS has a foreign key to this table.

Prompt ****** Creating LOCATIONS table ….

CREATE TABLE locations
( location_id NUMBER(4)
, street_address VARCHAR2(40)
, postal_code VARCHAR2(12)
, city VARCHAR2(30)
CONSTRAINT loc_city_nn NOT NULL
, state_province VARCHAR2(25)
, country_id CHAR(2)
) ;

CREATE UNIQUE INDEX loc_id_pk
ON locations (location_id) ;

ALTER TABLE locations
ADD ( CONSTRAINT loc_id_pk
PRIMARY KEY (location_id)
, CONSTRAINT loc_c_id_fk
FOREIGN KEY (country_id)
REFERENCES countries(country_id)
) ;

Rem Useful for any subsequent addition of rows to locations table
Rem Starts with 3300

CREATE SEQUENCE locations_seq
START WITH 3300
INCREMENT BY 100
MAXVALUE 9900
NOCACHE
NOCYCLE;

REM **************************************************
REM Create the DEPARTMENTS table to hold company department information.
REM HR.EMPLOYEES and HR.JOB_HISTORY have a foreign key to this table.

Prompt ****** Creating DEPARTMENTS table ….

CREATE TABLE departments
( department_id NUMBER(4)
, department_name VARCHAR2(30)
CONSTRAINT dept_name_nn NOT NULL
, manager_id NUMBER(6)
, location_id NUMBER(4)
) ;

CREATE UNIQUE INDEX dept_id_pk
ON departments (department_id) ;

ALTER TABLE departments
ADD ( CONSTRAINT dept_id_pk
PRIMARY KEY (department_id)
, CONSTRAINT dept_loc_fk
FOREIGN KEY (location_id)
REFERENCES locations (location_id)
) ;

Rem Useful for any subsequent addition of rows to departments table
Rem Starts with 280

CREATE SEQUENCE departments_seq
START WITH 280
INCREMENT BY 10
MAXVALUE 9990
NOCACHE
NOCYCLE;

REM *********************************************
REM Create the JOBS table to hold the different names of job roles within the company.
REM HR.EMPLOYEES has a foreign key to this table.

Prompt ****** Creating JOBS table ….

CREATE TABLE jobs
( job_id VARCHAR2(10)
, job_title VARCHAR2(35)
CONSTRAINT job_title_nn NOT NULL
, min_salary NUMBER(6)
, max_salary NUMBER(6)
) ;

CREATE UNIQUE INDEX job_id_pk
ON jobs (job_id) ;

ALTER TABLE jobs
ADD ( CONSTRAINT job_id_pk
PRIMARY KEY(job_id)
) ;

REM ***********************************************
REM Create the EMPLOYEES table to hold the employee personnel
REM information for the company.
REM HR.EMPLOYEES has a self referencing foreign key to this table.

Prompt ****** Creating EMPLOYEES table ….

CREATE TABLE employees
( employee_id NUMBER(6)
, first_name VARCHAR2(20)
, last_name VARCHAR2(25)
CONSTRAINT emp_last_name_nn NOT NULL
, email VARCHAR2(25)
CONSTRAINT emp_email_nn NOT NULL
, phone_number VARCHAR2(20)
, hire_date DATE
CONSTRAINT emp_hire_date_nn NOT NULL
, job_id VARCHAR2(10)
CONSTRAINT emp_job_nn NOT NULL
, salary NUMBER(8,2)
, commission_pct NUMBER(2,2)
, manager_id NUMBER(6)
, department_id NUMBER(4)
, CONSTRAINT emp_salary_min
CHECK (salary > 0)
, CONSTRAINT emp_email_uk
UNIQUE (email)
) ;

CREATE UNIQUE INDEX emp_emp_id_pk
ON employees (employee_id) ;

ALTER TABLE employees
ADD ( CONSTRAINT emp_emp_id_pk
PRIMARY KEY (employee_id)
, CONSTRAINT emp_dept_fk
FOREIGN KEY (department_id)
REFERENCES departments
, CONSTRAINT emp_job_fk
FOREIGN KEY (job_id)
REFERENCES jobs (job_id)
, CONSTRAINT emp_manager_fk
FOREIGN KEY (manager_id)
REFERENCES employees
) ;

ALTER TABLE departments
ADD ( CONSTRAINT dept_mgr_fk
FOREIGN KEY (manager_id)
REFERENCES employees (employee_id)
) ;

Rem Useful for any subsequent addition of rows to employees table
Rem Starts with 207

CREATE SEQUENCE employees_seq
START WITH 207
INCREMENT BY 1
NOCACHE
NOCYCLE;

REM ***********************************************
REM Create the JOB_HISTORY table to hold the history of jobs that
REM employees have held in the past.
REM HR.JOBS, HR_DEPARTMENTS, and HR.EMPLOYEES have a foreign key to this table.

Prompt ****** Creating JOB_HISTORY table ….

CREATE TABLE job_history
( employee_id NUMBER(6)
CONSTRAINT jhist_employee_nn NOT NULL
, start_date DATE
CONSTRAINT jhist_start_date_nn NOT NULL
, end_date DATE
CONSTRAINT jhist_end_date_nn NOT NULL
, job_id VARCHAR2(10)
CONSTRAINT jhist_job_nn NOT NULL
, department_id NUMBER(4)
, CONSTRAINT jhist_date_interval
CHECK (end_date > start_date)
) ;

CREATE UNIQUE INDEX jhist_emp_id_st_date_pk
ON job_history (employee_id, start_date) ;

ALTER TABLE job_history
ADD ( CONSTRAINT jhist_emp_id_st_date_pk
PRIMARY KEY (employee_id, start_date)
, CONSTRAINT jhist_job_fk
FOREIGN KEY (job_id)
REFERENCES jobs
, CONSTRAINT jhist_emp_fk
FOREIGN KEY (employee_id)
REFERENCES employees
, CONSTRAINT jhist_dept_fk
FOREIGN KEY (department_id)
REFERENCES departments
) ;

Imprimer Imprimer

Compatibilité import / export 9i / 10g

Administration Oracle, Divers pas de Commentaire »

En résumé
version import = version base cible
version export V9 compatible avec base 10 et 11G

matrice de compatibilté export / import

+———+————————————————————+ |EXPORT | IMPORT into: | | from +——-+——–+——–+——–+——–+——–+——-+ | \/ | 8.1.x | 8.1.7 | 9.0.1 | 9.2.0 | 10.1.0 | 10.2.0 | 11.1.0| +———+——-+——–+——–+——–+——–+——–+——-+ |5.x 1) 2)|EXP5x | EXP5x | EXP5x | EXP5x | EXP5x | EXP5x | EXP5x | |6.x 2)|EXP6x | EXP6x | EXP6x | EXP6x | EXP6x | EXP6x | EXP6x | |7.x 3)|EXP7x | EXP7x | EXP7x | EXP7x | EXP7x | EXP7x | EXP7x | +———+——-+——–+——–+——–+——–+——–+——-+ |8.0.3 |EXP803 | EXP803 | EXP803 | EXP803 | EXP803 | EXP803 | EXP803| |8.0.4 |EXP804 | EXP804 | EXP804 | EXP804 | EXP804 | EXP804 | EXP804| |8.0.5 |EXP805 | EXP805 | EXP805 | EXP805 | EXP805 | EXP805 | EXP805| |8.0.6 |EXP806 | EXP806 | EXP806 | EXP806 | EXP806 | EXP806 | EXP806| +———+——-+——–+——–+——–+——–+——–+——-+ |8.1.5 |EXP815 | EXP815 | EXP815 | EXP815 | EXP815 | EXP815 | EXP815| |8.1.6 |EXP81x | EXP816 | EXP816 | EXP816 | EXP816 | EXP816 | EXP816| |8.1.7 |EXP81x | EXP817 | EXP817 | EXP817 | EXP817 | EXP817 | EXP817| +———+——-+——–+——–+——–+——–+——–+——-+ |9.0.1 |EXP81x | EXP817 | EXP901 | EXP901 | EXP901 | EXP901 | EXP901| |9.2.0 | N/S | EXP817 | EXP901 | EXP920 | EXP920 | EXP920 | EXP920| +———+——-+——–+——–+——–+——–+——–+——-+ |10.1.0 4)| N/S | EXP817 | EXP901 | EXP920 | 4) | |10.2.0 4)| Not Supported | EXP920 | 4) | +———+——-+——–+——–+——–+——–+——–+——-+ |11.1.0 4)| Not Supported | EXP920 | 4) | +———+——-+——–+——–+——–+——–+——–+——-+

Quelques tests

——————————————————-

srv1:/oracle/9iDB/bin >exp scott/tiger@b9 file=/tmp/exp9b9.dmp

Export: Release 9.2.0.6.0 - Production on Tue Mar 11 16:52:39 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Export terminated successfully without warnings.

——————————————————-

srv1:/oracle/10GDB/bin > exp scott/tiger@b10 file=/tmp/exp10b10.dmp

Export: Release 10.2.0.3.0 - Production on Tue Mar 11 17:05:44 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64
bit Production
With the Partitioning, OLAP and Data Mining options

Export terminated successfully without warnings.

——————————————————-

srv1:/oracle/10GDB/bin > exp scott/tiger@b9 file=/tmp/exp10b9.dmp

Export: Release 10.2.0.3.0 - Production on Tue Mar 11 16:49:35 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.

EXP-00056: ORACLE error 6550 encountered
ORA-06550: line 1, column 41:
PLS-00302: component ‘SET_NO_OUTLINES’ must be declared
ORA-06550: line 1, column 15:
PL/SQL: Statement ignored
EXP-00000: Export terminated unsuccessfully

——————————————————-

srv1:/oracle/10GDB/bin >imp scott/tiger@b9 file=/tmp/exp9b9.dmp

Import: Release 10.2.0.3.0 - Production on Tue Mar 11 16:56:51 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.

IMP-00058: ORACLE error 6550 encountered
ORA-06550: line 1, column 33:
PLS-00302: component ‘SET_NO_OUTLINES’ must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
IMP-00000: Import terminated unsuccessfully

——————————————————-

srv-1:/oracle/9iDB/bin >exp scott/tiger@b10 file=/tmp/exp9b10.dmp

Export: Release 9.2.0.6.0 - Production on Tue Mar 11 17:00:56 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64
bit Production
With the Partitioning, OLAP and Data Mining options

EXP-00008: ORACLE error 37002 encountered
ORA-37002: Oracle OLAP failed to initialize. Please contact Oracle OLAP tech
nical support.
ORA-33262: Analytic workspace EXPRESS does not exist.
ORA-06512: at “SYS.DBMS_AW”, line 93
ORA-06512: at “SYS.DBMS_AW”, line 122
ORA-06512: at “SYS.DBMS_AW_EXP”, line 473
ORA-06512: at line 1
EXP-00083: The previous problem occurred when calling SYS.DBMS_AW_EXP.schema
_info_exp
. exporting statistics
Export terminated successfully with warnings.

——————————————————-

srv1:/oracle/9iDB/bin >imp scott/tiger@b9 file=/tmp/exp10b10.dmp

Import: Release 9.2.0.6.0 - Production on Tue Mar 11 17:13:43 2008

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to: Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Producti
on
With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining op
tions
JServer Release 9.2.0.6.0 - Production

IMP-00010: not a valid export file, header failed verification
IMP-00000: Import terminated unsuccessfully

Imprimer Imprimer

Paramètres d’instance et de session

Administration Oracle, Divers pas de Commentaire »

Les paramètres d’initialisation

Les ressources utilsées par une base, essentiellement ressources mémoires, buffers, processus et fichiers sont paramétrables, et permettent d’ajuster son fonctionnement, voire de faire de l’optimisation (tuning).
Certains paramètres ont des valeurs libres (dans un domaine de valeurs, bien sûr), d’autres plus restrictifs sont dépendants du systèmes d’exploitation, ou dérivés d’autres paramètres.

Lors de son démarrage, une instance Oracle lit ses paramètres dans un fichier, dit de démarrage ou d’initialisation.
La totalité des paramètres d’initialisation est décrite dans la documentation Oracle Oracle 10gR2 reference (attention PDF de 30MO!).

note : augmenter les ressources allouées ? la base en augmentant les valeurs de certains

paramètres est une bonne idée…jusqu’? un certain point. La mémoire ne peut pas,on s’en doute, être entièrement dévolue ? la SGA…
Quelle que soit la base il est obligatoire de spécifier explicitement au strict minimum 2 paramètres :

‘DB_NAME’ : le nom de la base de données
‘CONTROL_FILES’ : la liste des fichiers de contrôle utilisés

Les autres paramètres les plus fréquemment utilisés sont les suivants (S:statique, M:modifiable, D: dérivé d’un autre paramètre)

COMPATIBLE S Compatibilité arrière avec les versions précédentes (>= 9.2.0)
DB_DOMAIN S Nom de domaine, qui associé au DB_NAME donne un nom de base uniqueNom de domaine, qui associé au DB_NAME donne un nom de base unique
DB_RECOVERY_FILE_DEST M Répertoire de destination de la zone de FLASH recovery
LOG_ARCHIVE_DEST_n M Répertoire des fichiers REDO LOGS archivés
NLS_LANGUAGE D Langue utilisée (fonction de NLS_LANG dans l’environnement Unix ou windows)
NLS_TERRITORY M le territoire (France par ex). Impacte les dates, et la monnaie
OPEN_CURSORS M nb max de cursor ouvrable par une application
PGA_AGGREGATE_TARGET M si 0, dimensionnement auto de la PGA, pour les proccess utilisateur server
PROCESSES S nb max de process connectés ? Oracle (background et user)
SESSIONS D = 1,1 * PROCESSES
SGA_TARGET D si 0 auto dimensionnement de la SGA
SHARED_SERVER M 0 si serveur dédié, n = nb de serveurs partagés lancés au startup instance
SP_FILE S emplacement du SP File
UNDO_MANAGEMENT S Manual | Auto, par defaut Manual indique qu’on utilise des Rollback segments

Paramètres statiques et dynamiques

Certains paramètres peuvent être modifiés en temps réel, ils sont dits dynamiques, d’autres seront pris en compte au prochain redémarrage de la base, ils sont dits statiques.
Les paramètres dynamiques peuvent être modifiés pour la durée de la session,, pour la durée de l’instance ou de manière permanente avec la commande ‘ALTER SESSION’ ou ‘ALTER SYSTEM’.
Voici les syntaxes :

ALTER SESSION SET =
ALTER SYSTEM SET = [SCOPE = MEMORY | SPFILE | BOTH] [DEFERRED] [COMMENT = ”]

exemples

SQL> ALTER SESSION SET NLS_LANGUAGE=’FRENCH’;


Informations sur les paramètres

On peut utiliser les commandes SQL*Plus SHOW :

SQL> SHOW PARAMETER

active_instance_count integer  
aq_tm_processes integer 0
archive_lag_target integer 0
asm_diskgroups string  
asm_diskstring string  
asm_power_limit integer 1
audit_file_dest string F:ORACLEPRODUCT10.2.0ADMIN ORCLADUMP
audit_sys_operations boolean FALSE
audit_trail string NONE
background_core_dump string partial
background_dump_dest string F:ORACLEPRODUCT10.2.0ADMIN ORCLBDUMP
backup_tape_io_slaves… boolean… FALSE…

ou en filtrant avec un mot clé :

SQL> SHOW PARAMETER AUDIT

audit_file_dest string F:ORACLEPRODUCT10.2.0ADMIN ORCLADUMP
audit_sys_operations boolean FALSE
audit_trail string NONE

ou utiliser des vues virtuelles du dictionnaire :

V$PARAMETER : les paramètres en cours d’utilisation (de la session donc…)
V$PARAMETER2 : les mêmes, mais mieux présentés…
V$SPPARAMETER : les paramètres du SPFILE (valable au (re)démarrage de l’instance)
V$SYSTEM_PARAMETER : paramètres de l’instance en cours en mémoire

SQL> select a.name, a.value courante, sp.value sp_file, mem.value memoire
from v$parameter a, v$spparameter sp, v$system_parameter mem
where a.name=sp.name
and mem.name=a.name
and a.name = ‘open_cursors’

NAME COURANTE SP_FILE MEMOIRE
open_cursors 1100 1100 1100

SQL> alter system set open_cursors=1200;
– on modifie la valeur courante de l’instance, ce qui a un impact sur la session
– mais ne sera plus valable au redemarrage de la base (spfile non modifié…)

NAME COURANTE SP_FILE MEMOIRE
open_cursors 1200 1100 1200

SQL> — infos sur parametres, par defaut ou non ?
SQL> SELECT NAME , VALUE, ISDEFAULT, DESCRIPTION
FROM V$PARAMETER

NAMEtracefile_identifier VALUE ISDEFAULTTRUE DESCRIPTIONtrace file custom identifier
lock_name_space   TRUE lock name space used for generating lock names for standby/clone database
processes 150 FALSE user processes
sessions 170 TRUE user and system sessions
timed_statistics TRUE TRUE maintain internal timing statistics
timed_os_statistics 0 TRUE internal os statistic gathering interval in seconds

SQL> — combine de parametres spécifiés dans le SPFILE ?
SQL> SELECT count(*)
FROM V$SPPARAMETER
WHERE ISSPECIFIED IS TRUE
COUNT(*)
———-
23

Imprimer Imprimer

Récupération rapide d’une table …dans la poubelle (RECYCLE BIN)

Administration Oracle, Divers pas de Commentaire »

Les suppressions de tables, ne sont plus désormais physiques et définitives, mais mettent simplement l’objet ? la corbeille (RECYCLE BIN). Tant que cette dernière n’est pas vidée, il est possible de récupérer l’objet supprimé.

skull Attention ! pour pouvoir être utilisée la poubelle …doit être active. On peut vérifier le paramètre d’initilalisation : SQL> SHOW PARAMETER RECYCLE , qui doit être ? ‘ON’.

skullskull Attention encore plus !! les commandes de gestion de la poubelle ne sont pas des commandes SQL , mais SQL*Plus donc même si vous êtes en 10g mais avec un client autre que SQL+ 10g , les commandes ne seront pas reconnues. Vous aurez des messages du genre,
- sous i*SQLPlus : Command beginning “purge tabl…” is not available in iSQL*Plus
- sous SQLPlus : SP2-0734: unknown command beginning “purge scot…” - rest of line ignored.
Des infos sur le contenu de la poubelle dans le dictionnaire…

Les informations concernant la corbeille peuvent être consultées dans le dictionnaire :

SQL> SHOW RECYCLEBIN
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
————- ————— ———– ———
T1 BIN$EkKm2r93vZfgQKjAhw1XeA==$0 TABLE 2006-04-25:15:51:52

ou via les tables USER_RECYCLEBIN et DBA_RECYCLEBIN.

exemple

SQL> select original_name nom, object_name “nom interne”,
operation, createtime “date création “,
droptime “date suppression “, can_undrop “récupérable ? “, can_purge “purgeable ?”
FROM user_recyclebinNOM NOM INTERNE OPERATION date création date suppression récupérable? purgeable?
— —————————— ——— ——————- ——————- ———— ———-
T1 BIN$Ejia7J3wZRXgQKjAhw0prg==$0 DROP 2006-04-25:15:10:17 2006-04-25:15:10:22 YES YES
T2 BIN$Ejia7J3vZRXgQKjAhw0prg==$0 DROP 2006-04-25:15:09:30 2006-04-25:15:09:35 YES YES

note : les colonnes CREATETIME et DROPTIME sont des…VARCHAR (?)

exemples de récupération

SQL> FLASHBACK TABLE T2 TO BEFORE DROP
SQL> FLASHBACK TABLE “BIN$Ejia7J3vZRXgQKjAhw0prg==$0″ TO BEFORE DROP

note : on peut donc également utiliser le nom interne ET CE QUELQUESOIT LA COMMANDE SQL !
Il est conseillé de l’encadrer par des guillemets pour masquer les caractères spéciaux

Une table T1 peut avoir été supprimée plusieurs fois, et apparaitre plusieurs fois dans la corbeille.
Pour éviter toute ambiguité, il faut vérifier le contenu de la poubelle avant récupération
et utiliser le nom interne le cas échéant plutot que le nom logique.

exemple

SQL> create table t1 (n integer);
SQL> drop table t1;
SQL> create table t1(new_n integer);
SQL> drop table t1;
et dans la corbeille on a :
NOM nom interne OPERATION date création date suppression
T1 BIN$EkKm2r92vZfgQKjAhw1XeA==$0 DROP 2006-04-25:15:51:14 2006-04-25:15:51:28
T1 BIN$EkKm2r93vZfgQKjAhw1XeA==$0 DROP 2006-04-25:15:51:44 2006-04-25:15:51:52SQL> desc “BIN$EkKm2r93vZfgQKjAhw1XeA==$0″
Name Type
NEW_N NUMBER(38)

SQL> –c’est bien celle que je veux recuperer…dont acte
SQL> FLASHBACK TABLE “BIN$EkKm2r93vZfgQKjAhw1XeA==$0″ TO BEFORE DROP;

Suppression permanente

On peut supprimer une table de la corbeille avec la commande ‘PURGE’ :

SQL> PURGE TABLE T3

ou indirectement en utilisant des commandes affectant le trablespace utilisateur :

SQL> PURGE TABLESPACE users; — purge tous les objets du tablespace
SQL> PURGE TABLESPACE users USER scott; –purge tous les objets de SCOTT du tablespace USERS

ou vider en une fois la poubelle utilisateur ou la poubelle générale :

SQL> PURGE recyclebin;
SQL> PURGE dba_recyclebin;

Eviter la poubelle

On peut également supprimer physiquement et directement une table, en évitant de la conserver dans la corbeille donc, avec l’option ‘PURGE’ de la commande ‘DROP TABLE’

SQL> DROP TABLE T5 PURGE

Ou invalider l’utilisation de la poubelle de manière transversale,
grace au paramètre d’initialisation ‘RECYCLEBIN’

SQL> show parameter recyclebin
NAME TYPE VALUE
recyclebin string ON

SQL> ALTER SYSTEM SET recyclebin = OFF;
System Altered

SQL> show parameter recyclebin
NAME TYPE VALUE
recyclebin string OFF

Imprimer Imprimer

lister et arreter des JOBs (travaux) Oracle

Administration Oracle, Divers pas de Commentaire »
SQL> connect system/xxxx
SQL> select job, schema_user, next_date, what
from dba_jobs;

JOB SCHEMA_USER   NEXT_DATE
**** ************ **********
4001 FLOWS_030000 07/01/2008
4002 FLOWS_030000 07/01/2008
215  SYSTEM       07/01/2008

on récupère le no de Job dans la colonne ‘JOB’ de la table ‘DBA_JOBS’ et on supprime le Job choisi, grace au package PL/SQL fourni RDBMS_JOB

SQL> exec dbms_job.remove(215);
PL/SQL procedure successfully completed.

remarque : avec la console GRID 10g, qui surveille une base 9i (avec l’agent qui va bien) les jobs n’apparaissent pas dans la console, d’ou l’utilité de cette procédure manuelle.

Imprimer Imprimer

mode archivage (archivelog mode) et Oracle 10g

Administration Oracle, Divers 1 Commentaire »

Paramètres intéressants

LOG_ARCHIVE_START
est obsolète en 10g …et donc inutile (si précisé, provoque un Warning au démarrage de la base)
DB_RECOVERY_FILE_DEST
spécifie la zone de récupération (recovery area) et par défaut la zone d’archivage
LOG_ARCHIVE_DEST_n
destination de l’archivage des Redolog files (n allant de 1 ? 10, dans le sens croissant de la paranoïa)

La syntaxe est la suivante : LOG_ARCHIVE_DEST_n=”LOCATION=repertoire_archivage”

Vérification du mode actuel

SQL> archive log list
mode Database log mode Archive
Archivage automatique Active
Destination de l’archive USE_DB_RECOVERY_FILE_DEST
Sequence de journal en ligne la plus ancienne 65
Sequence de journal suivante a archiver 67
Sequence de journal courante 67
SQL>

on voit que l’ARCHIVE_DEST n’est pas positionné ici et que l’on utilise la recovery area par défaut, ce que l’on vérifie :

NAMETYPE VALUE
——– ——- ———-
log_archive_dest string
log_archive_dest_1 string
log_archive_dest_2 string

SQL> show parameters db_recovery

NAME TYPE VALUE
———————————— ———– ——————————
db_recovery_file_dest string /oracle/recovery_area
db_recovery_file_dest_size big integer 2G

Passage en mode archivage

on peut utiliser le script suivant (qui ne change guère des précédentes versions…)

#archive_mode.sql

set instance MA_BASE
connect sys/password as sysdba
shutdown
startup mount;
# Enable database ARCHIVELOG mode
alter database archivelog;
# Shut down and restart the database instance.
shutdown immediate
startup

Les process (Unix)
Ils sont par défaut au nombre de 2, lorsque l’archivage est activé, et s’appellent ora_arcN_ORACLE_SID :

$> ps -ef|grep arc

oracle? ? ? 6834? ? ? ? 1? 0 Aug13 ?? ? ? ? ? ? ? 00:00:00 ora_arc0_DBADE
oracle? ? ? 6836? ? ? ? 1? 0 Aug13 ?? ? ? ? ? ? ? 00:00:00 ora_arc1_DBADE