!
!
!
!
!
!
!
!

Comment ?
(je fais pour …)
(Oracle)
123456789012345678901234567890
FAQ/DBA
Ou réponses à des questions qu’on se pose parfois.
Copyright Radu Caulea, TAFORA, 2002 radu@caulea.com
TABLE DE MATIERES
1. FAQ/DBA 2
1.1. Table de matiéres 2
1.2. Supprimer un job lancé avec dbms_job 3
1.3. Profiter du nologging 3
1.4. Comment j’utilise en PL/SQL une procédure externe écrite en C ? 3
1.4.1. Le code source de extern.c 4
1.4.2. Le code source de credlL.cmd 4
1.4.3. Le code de la préparation SQL 4
1.4.4. Configuration du listener 5
1.4.5. Configuration du TNSNAMES 5
1.4.6. Librairies 5
1.4.7. Test 6
1.5. Calculer la longueur d’un long raw. 6
1.6. Migrer une 9.0.1. en 9.2 6
1.7. Depister les instances Oracle (NT/2K) (08/09/2002) 7
1.8. Purger les logs (listener et snmp) (26/10/2002) 7
1.9. copier une grosse table 8
1.10. Depister les threads Oracle (NT/2K) (03/04/2003) 8
SUPPRIMER UN JOB LANCE AVEC DBMS_JOB
Utiliser dbms_job.remove(xx), ou xx est l’identifiant du job, trouvé avec :
select job, what, log_user from dba_jobs;
C’est le créateur du job qui doit le supprimer!

PROFITER DU NOLOGGING
Des redo logs il y en aura toujours, a moins que Oracle ne change l'architecture du noyau.
Une transaction est systématiquement fliquée dans les redos.
Ce qui n'est pas fliqué peut être un éventail de DETAILS d'actions sur plusieurs objets (par exemple, truncate ne génère pas (beaucoup) de redo.
unrecoverable (V7) ou nologging (v8+) sont des appellations differentes pour les mêmes phénomènes (a peu près) en fonction de la version d'Oracle.
Il est nécessaire également d'ajouter un hint dans les opérations (exemple:
INSERT /*+ APPEND */ ...
Une solution plus sioux est de mettre le tablespace qui contient la table en nologging: alter tablespace TBS nologging; Il y aura une information minimale dans les redo concernant les objets stockés. Petite vérification: select TABLESPACE_NAME, LOGGING from dba_tablespaces; (Vérifier la version ;-))
Le mode archivelog permet d'archiver les redo logs. Ne pas générer des entrées redo n'a rien a voir avec le mode d'archivage

COMMENT J’UTILISE EN PL/SQL UNE PROCEDURE EXTERNE ECRITE EN C ?
Très souvent on me demande comment lancer une commande OS à partir d’une procedure stockée. Voici une méthode:

LE CODE SOURCE DE EXTERN.C

#include 
 __declspec(dllexport) void execute_cmd( char* cmd )
 {
 system(cmd);
 }

LE CODE SOURCE DE CREDLL.CMD

cl -I. /LD -Zi extern.c /link msvcrt.lib /nod:libcmt /DLL
copy extern.dll \\sclavos\m$\cextlib\
pause
La copie du fichier le place dans un répertoire connu par Oracle. Quant au compilateur, un bon cl de Visual Studio est suffisant ;-)

LE CODE DE LA PREPARATION SQL

set echo on
connect sys/xxx@ulib as sysdba
CREATE OR REPLACE LIBRARY EXECUTE_CMDLIB IS 'M:\cextlib\extern.dll';
/
CREATE OR REPLACE PROCEDURE execute_cmd (
        p_cmd IN VARCHAR2)
        AS EXTERNAL
        LIBRARY execute_cmdlib
        NAME "execute_cmd"
        PARAMETERS (p_cmd STRING);
/
show errors
--
grant execute on sys.execute_cmd to public;
drop public synonym execute_cmd;
create public synonym execute_cmd for sys.execute_cmd;
    
CREATE OR REPLACE PROCEDURE oscommande (pcommande varchar2) as
       cmd varchar2(200);
BEGIN
    execute_cmd(pcommande);
    loglog('Executée' || pcommande);
exception
    when others then
    loglog (SQLERRM || ' !!! ' || pcommande);      
END;
/
show errors

CONFIGURATION DU LISTENER

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = gate-tafora)(PORT = 1521))
      )
    )
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = k:\oracle\oracle90)
      (PROGRAM = extproc)
      (SID_NAME = PLSExtProc)
      (ENVS="EXTPROC_DLLS=ANY") # 9.2
    )
    (SID_DESC =
      (GLOBAL_DBNAME = lib9)
      (ORACLE_HOME = k:\oracle\oracle90)
      (SID_NAME = lib9)
    )
  )
Le PLSExtProc doit être saisi tel que décrit ! Ne pas choisir un autre nom.

CONFIGURATION DU TNSNAMES

#
EXTPROC_CONNECTION_DATA.tafora =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )
#

LIBRAIRIES

SET
EXTPROC_DLLS=d :\cextlib\extern.dll
…

TEST

execute oscommande('mkdir c:\toto');
voir %ORACLE_HOME%/rdbms/extproc pour plus de détails.

CALCULER LA LONGUEUR D’UN LONG RAW.
Comment calculer la longueur d’une colonne long raw ?
Passer par un champ intermédiaire (dans une table crée spécialement dans ce but) :
set serveroutput on;
CREATE TABLE blob_tab(blob_col BLOB);
INSERT INTO blob_tab (to_lob(colonne_long_raw) FROM testraw);
commit;
(Le champ colonne_long_raw de la la table testraw est de type long raw).
begin
  for x in (select blob_col from blob_tab) loop
    dbms_output.put_line(dbms_lob.getlength(x.blob_col));
  end loop;
end;
/

MIGRER UNE 9.0.1. EN 9.2
Comment migrer une base 9i v1 en 9i v2 ?
Sujet vaste, pas traité ici !
DEPISTER LES INSTANCES ORACLE (NT/2K) (08/09/2002)
Comment dépister les noms des instances Oracle qui tournent, vu que je trouve uniquement des exécutables oracle.exe ?
J’utilise Windows Ressource Kit (TLIST) :
Pour lister les exécutables:
tlist | findstr oracle
J’obtiens par exemple :
D:\>tlist | findstr oracle
2356 oracle.exe
D:\>
Ensuite :
D:\>tlist 2356
2356 oracle.exe
   CWD:     M:\orahome90\DATABASE\
   CmdLine: m:\orahome90\bin\ORACLE.EXE lib9
   VirtualSize:   591228 KB   PeakVirtualSize:   607568 KB
   WorkingSetSize:403032 KB   PeakWorkingSetSize:486036 KB
   NumberOfThreads: 16
      0 Win32StartAddr:0x00000000 LastErr:0x00000000 State:
. . . etc.
Vous pouvez rediriger la sortie pour rechercher, etc
PURGER LES LOGS (LISTENER ET SNMP) (26/10/2002)
Mon fichier nmi.log a la taille de 1 Go, listener.log est également énorme.
Jean-François ECREPONT disait très pertinemment :
‘Comme tous fichier de log, quand on ne les a pas et que sa plante, on aimerait bien les avoir et quand on les a, ils ne servent a rien et ça ne plante pas ...’

Arreter les listeners, flinguer les fichiers, redémarrer les listeners.
COPIER UNE GROSSE TABLE
(8+) create tablex nologging as select * from tabley; 
DEPISTER LES THREADS ORACLE (NT/2K) (03/04/2003)
A quoi correspondent les threads de Oracle.exe sous Windows ?
Tlist et plus spécifiquement pviewer livrés avec le kit des ressources trechniques (nt,2k) livrent les informations sur les threads. Le thread 0 est un dispatcher de service, le thread 1 est un handler du service, à partir du thread suivre le résultat de la requête sql présentée (#thread = sid+1) (2 pmon, 3 dbwr, etc)
 
A partir d'oracle (sqlplus)
SQL>SQL> column program for A15 word_wrapSQL> set echo onSQL> select vbgproc.name, vproc.program, vproc.spid thread, vsess.sid  2  from v$session vsess , v$process vproc, v$bgprocess vbgproc  3  where vbgproc.paddr <> '00' and  4        vbgproc.paddr = vproc.addr and  5        vproc.addr = vsess.paddr;
 
NAME  PROGRAM         THREAD              SID----- --------------- ------------ ----------PMON  ORACLE.EXE      148                   1DBW0  ORACLE.EXE      2896                  2LGWR  ORACLE.EXE      2668                  3CKPT  ORACLE.EXE      2884                  4SMON  ORACLE.EXE      2892                  5RECO  ORACLE.EXE      2880                  6CJQ0  ORACLE.EXE      2888                  7QMN0  ORACLE.EXE      2900                  8ARC0  ORACLE.EXE      2596                  9ARC1  ORACLE.EXE      2704                 10
 
10 rows selected.
Voir aussi ‘Dépister les instances Oracle (NT/2K)’


Copyright © 1998-2002 Radu Caulea, TAFORA MAJ 06/11/2006 !
Commentaires et suggestions radu[CHEZ]tafora.fr