![]() |
|||||||||||||||||||||||||||||||||||||||||||||
|
Comment ? (je fais pour …) (Oracle) 123456789012345678901234567890
FAQ/DBAOu réponses à des questions qu’on se pose parfois. Copyright Radu Caulea, TAFORA, 2002 radu@caulea.com
TABLE DE MATIERES1. 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 LE CODE SOURCE DE CREDLL.CMD cl -I. /LD -Zi extern.c /link msvcrt.lib /nod:libcmt /DLL copy extern.dll \\sclavos\m$\cextlib\ pauseLa 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 oracleJ’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, etcPURGER 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) 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)’ |
||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||