Ajouter une date à votre fichier de log Oracle

Comment ajouter une date à votre fichier résultat Oracle ?

Ce fichier sera généré suite à une requête lancée sous sqlplus.

Quand vous exécutez une requête ou plusieurs d’ailleurs, vous souhaitez stocker le résultat dans un fichier de log. Vous voulez ajouter une date à votre nom de fichier. J’ai recherché sur le net, j’ai trouvé un script sur le forum developpez.net et je l’ai simplifié. En quelques lignes vous avez :

column log_file new_value log_file
select '/tmp/' || to_char( sysdate , 'DDMMYY_HH24MISS' ) 
||  '_resultats.log' log_file from dual;
spool &log_file

Cela vous donne comme nom de fichier : 041116_083022_resultats.log

N’oubliez pas le spool off à la fin du script bien sûr.

Sources :

Oracle : Grant update on toutes les tables d’un schéma

Comment faire pour accorder à un utilisateur donné un privilège UPDATE ou DELETE sur toutes les tables d’un schéma ?
Voilà un petit bout de code que j’ai trouvé sur un forum du côté de chez Oracle et que j’ai testé sur Oracle SQL Developer. Il fonctionne à merveille !

C’est une boucle en PL/SQL qui fait tout le travail :)
declare
cursor c1 is select table_name from user_tables;
cmd varchar2(200);
begin
for c in c1 loop
cmd := 'GRANT UPDATE ON '||c.table_name||' TO MYUSER';
execute immediate cmd;
end loop;
end;

Source : https://community.oracle.com/ideas/2333

Oracle : différence entre CPU Time et Elapsed Time

J’ai lancé une requête sur la vue v$SQLAREA et je vois deux champs qui se ressemblent grandement : CPU time et Elapsed Time. Par contre les données renvoyées sont totalement différentes.

vue v$sqlarea

En lisant la documentation Oracle, on n’en apprend pas plus…à part l’unité utilisée (microsecondes). Ci-dessous un extrait.

2 champs de la vue v$sqlarea

Source : documentation officielle Oracle 

Du coup, j’ai fait une petite recherche Google et j’ai trouvé ceci :

Extrait n°1 : sur stackoverflow

The CPU time is the time your query actually needed; the rest is waiting for resources.

Extrait n°2 : difference between CPU time and elapsed time

CPU time is the time for which the CPU was busy executing the task. It does not take into account the time spent in waiting for I/O (disk IO or network IO). Since I/O operations, such as reading files from disk, are performed by the OS, these operations may involve noticeable amount of time in waiting for I/O subsystems to complete their operations. This waiting time will be included in the elapsed time, but not CPU time. Hence CPU time is usually less than the elapsed time.

Ce que je comprends c’est que le temps de traitement réel de la requête est du CPU Time auquel on ajoute le temps lié aux I/O, disponibilités des ressources (Wait time). C’est ce que dit justement un expert sur le forum developpez.com :

Extrait n°3 :

 

Chaque session utilisateur a un process côté serveur pour traiter ses demandes.

Ce process est:
– soit en train d’attendre d’avoir quelque chose à faire -> en Idle Wait
– soit en train d’exécuter du code oracle -> en CPU
– soit en train d’attendre sur un appel système (i/o par exemple), sur un verrou,… -> en Active Wait

On peut donc compter le temps passé dans chaque état: Idle Wait, CPU time, Active Wait

La totalité du temps actif en base de donné est appelé DB time = CPU time + Active Wait Time

Et pour une session, un temps elapsed est la durée entre 2 mesures durant laquelle il peut y avoir du DB time (actif) ou du Idle Wait time.

Si on a 2 sessions, vu de la base de donnée, on additionne les temps de chacunes. Par exemple, si la base a 2 sessions qui travaillent tout le temps en CPU pendant 5 secondes, alors le DB time au niveau système sera de 4 secondes. Par contre le temps elapsed sera toujours de 2 secondes.

C’est pour cela qu’en divisant DB time / elapsed time on a le nombre de sessions actives en moyenne en base de données – soit la charge de la base.

J’espère que ces explications vous ont aidé, pour ma part cela m’a permis de comprendre ces deux métriques. La prochaine étape étant de comprendre les métriques figurant dans un fichier AWR, du haut niveau pour moi :(

DBMS_STATS : Lancement de stats sous Oracle 10g RAC

A des fins de performance, il est utile de lancer des statistiques sur la base de données Oracle. Cela permet au moteur Oracle de choisir le meilleur plan d’exécution pour les requêtes.

Vérifiez d’abord depuis combien de temps vos tables n’ont pas été analysées :
select TABLE_NAME, OWNER, LAST_ANALYZED from DBA_TABLES order by LAST_ANALYZED asc;
Vous pouvez filtrer selon le nom de la table. J’ai ajouté un tri croissant afin de voir immédiatement les tables qui n’ont pas été analysées depuis longtemps.

Ensuite, si vous souhaitez forcer le lancement des stats, il  vous suffit de lancer la commande ci-dessous :

exec DBMS_STATS.gather_schema_stats(ownname=>'OWNER',cascade=>TRUE);

Relancez ensuite la première requête SELECT, vous verrez que la valeur contenue dans la colonne LAST_ANALYZED a changé.

Sources :

MySQL : l’option REPLACE dans la commande LOAD DATA INFILE

Quand vous lancez un « LOAD DATA INFILE » sous MySQL et que vous avez une erreur SQL de ce genre :

« ERROR 1062 (23000) at line 1: Duplicate entry……… for key PRIMARY« 

Soit vous la corrigez en supprimant la ligne en doublon, soit vous l’évitez en ajoutant l’option REPLACE à la commande LOAD DATA INFILE. C’est cette dernière option que j’ai choisie.

Plus d’infos sur l’option REPLACE.