Récupérer un paramètre oracle sur plusieurs serveurs en ksh sous Linux

En mode sysadmin

Etant dans une équipe d’intégration, j’ai besoin de lancer souvent de petits scripts maison, telle une sysadmin. Je ne fais pas de dev à proprement parler, j’ai juste besoin d’un résultat rapide et efficace. Mon script n’a pas besoin d’être générique ou d’avoir un max de contrôles, c’est du « ONE SHOT » en quelque sorte.

Comment je procède ?

Dans un premier temps, comme tout sysadmin, je teste d’abord le script sql en local sur les machines.

Dans un second temps, je lance le script à distance toujours en ligne de commande.

Enfin, je crée un script ksh de quelques lignes qui contiendra tout ce dont j’ai besoin : liste des serveurs, script SQL, résultat affiché sur la console.

Je vous laisse découvrir le script ci-dessous, testé et approuvé sur des bases Oracle 11g :)

#!/usr/bin/ksh

for i in server1 server2 server3 server4 server5
do
ssh -T $i <<EOF
echo $i
#amélioration de l'affichage, 200 caractères par ligne
echo "set linesize 200 " > /tmp/scriptOracle.sql
echo "show parameter parallel_max_servers" >> /tmp/scriptOracle.sql
#se déconnecter de la base
echo "exit" >> /tmp/scriptOracle.sql
#sourcer le ficher d'environnement Oracle, lancer le  script sql créé juste en haut et récupérer uniquement la ligne qui nous intéresse
        su - oracle -c ". /chemin/fichierParamOracle  ; sqlplus / as sysdba @/tmp/scriptOracle.sql" 2>/dev/null | grep parallel_max_servers
EOF
done

Résultat : 
monPrompt> ./scriptOracle.ksh
server1
parallel_max_servers                 integer                          xxx
server2
parallel_max_servers                 integer                          xxx
server3
parallel_max_servers                 integer                          xxx
server4
parallel_max_servers                 integer                          xxx
server5
parallel_max_servers                 integer                          xxx
Petit script de sysadmin

Désactiver le mode archivelog sous Oracle 11g

Souvent on a besoin de trouver rapidement, très rapidement une réponse à notre question. Ma question du jour est : comment désactiver le mode archive log ? Cela peut être utile de le désactiver sur un environnement de développement par exemple ou encore pendant l’import de données. La commande est hyper simple, la voici :

alter database noarchivelog;

Attention, il ne  faut lancer cette commande qu’à l’état MOUNT de votre base de données Oracle. Il faut pour cela stopper votre base, passer à l’état MOUNT, lancer la commande ALTER puis passer à l’état OPEN de la base :

shutdown immediate;

startup mount;

alter database noarchivelog;

alter database open;

Pour vérifier le statut du mode archive log, vous pouvez lancer la commande :

archive log list;

Attention, quand vous faîtes une recherche rapide sur le net, du genre « comment désactiver le mode archivelog pendant l’import », on vous indique une option qui n’est valable qu’en oracle 12c !

transform=disable_archive_logging:y

Quand vous faîtes une recherche sur Oracle, indiquez bien la version : 10g, 11g, 12c… et indiquez aussi si c’est du RAC ou pas.

Source : 

It blogger tips

ORA-31623: aucun travail n’est attaché à cette session via le descripteur indiqué

Erreur lors d’un import DataPump Oracle 11g RAC

UDI-31623: l'opération a généré l'erreur ORACLE 31623
ORA-31623: aucun travail n'est attaché à cette session 
via le descripteur indiqué
ORA-06512: à "SYS.DBMS_DATAPUMP", ligne 3326
ORA-06512: à "SYS.DBMS_DATAPUMP", ligne 4551
ORA-06512: à ligne 1

Je viens d’avoir cette erreur lors d’un import Datapump Oracle via la commande impdp, je n’ai aucune idée du type de correction à apporter. Du coup, j’effectue une recherche sur Google, je tombe sur un forum qui ne m’aide pas beaucoup. Puis je tombe sur un blog qui m’apporte exactement la réponse que je recherche. J’applique aussitôt la correction proposée et cela fonctionne.

SQL> show parameter stream

NAME TYPE  VALUE
------------------------------
streams_pool_size big integer 0

SQL> alter system set streams_pool_size=40M scope=spfile;

Système modifié.

SQL> shutdown immediate
Base de données fermée.
Base de données démontée.
Instance ORACLE arrêtée.
SQL> startup
Instance ORACLE lancée.

Source :

Blog de MZH

Pour en savoir plus :

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