martedì 28 aprile 2009

Ubuntu e Oracle SQL Developer

Qualche giorno fa, stanco delle continue infezioni di Conficker e forte del fatto che il mio pc è una semplice workstation dalla quale mi collego sulle macchine vere e proprie con cui lavoro (un misto di ambienti Windows Server 2003 e GNU/Linux, reali e virtualizzati), ho pensato di formattare il mio pc che montava Windows XP per passare ad Ubuntu 8.10.

Uno strumento che uso ormai da qualche tempo e che mi dà le stesse soddisfazioni di Toad (ma in più è free e non richiede licenze) è Oracle SQL Developer. Questo software è realizzato in Java quindi è disponibile per diverse piattaforme, tra cui GNU/Linux, anche se non esiste un pacchetto deb per le distribuzioni Debian e Debian like. Volendo è possibile usufruire del tool Alien per convertire l'rpm in deb, oppure si può sempre scaricare un file zip contenente l'intero ambiente già pronto per l'uso.

La versione per GNU/Linux non viene fornita con il Java SDK, necessario per far girare l'interfaccia di SQL Developer, ma con Ubuntu 8.10, ad esempio, si può facilmente porre rimedio alla mancanza con:
$ sudo aptitude install sun-java6-jdk

Supponendo di voler utilizzare il file zip fornito da Oracle, lo si può scompattare, ad esempio, in /usr/src/:
$ tar xzf sqldeveloper-1.5.4.59.40-no-jre.zip
$ sudo mv sqldeveloper /usr/src/

Lo script da lanciare è contenuto in /usr/src/sqldeveloper (il path è da adattare a seconda della directory di installazione scelta):
$ cd /usr/src/sqldeveloper
$ ./sqldeveloper.sh

Tuttavia, si può notare la comparsa sul terminale di un messaggio di errore:
Oracle SQL Developer
Copyright (c) 2008, Oracle. All rights reserved.

Type the full pathname of a J2SE installation (or Ctrl-C to quit), the path will be stored in ~/.sqldeveloper/jdk

In questo caso, bisogna terminare la creazione dello script con Ctrl-C, quindi creare una directory chiamata .sqldeveloper (attenzione al punto prima del nome, in quanto si tratta di una directory nascosta) nella propria home e all'interno di tale directory creare un file chiamato jdk. Tale file deve contenere il path alla jvm quindi:
$ mkdir /home/username/.sqldeveloper
$ cd ~/.sqldeveloper
$ touch jdk
$ echo /usr/lib/jvm/java-6-sun > jdk

Fatto ciò si può avviare SQL Developer in tutta tranquillità!

Windows Vista e SP2-1503

Un mio collega ha appena acquistato il classico portatile con Microsoft Windows Vista Home Premium SP1 (eh vabbè...) e, dato che la sua attività routa attorno alla creazione di web apps che si interfacciano ad Oracle, ha provato ad installare, sul suddetto portatile, Oracle Instant Client 10.2.0.1. Ha seguito la procedura standard, optando per un'installazione da amministratore, impostato il tnsnames.ora con le entries corrette, eppure, lanciando un prompt di sqlplus, oppure Toad, ecc, si presenta il seguente errore:



Sul forum di OTN si consiglia di:

1) impostare correttamente le variabili d'ambiente ORACLE_HOME, TNS_ADMIN, LD_LIBRARY_PATH e PATH
2) controllare le impostazioni di protezione di Windows in quanto mancherebbe il permesso "create global objects"

Ora, la soluzione numero 1 non ha funzionato e, a quanto pare, in Windows Vista Home Premium SP1 non c'è la possibilità, o almeno io non l'ho trovata, di accedere alle policies locali di sicurezza, quindi non ho potuto verificare l'effettiva mancanza del privilegio "create global objects" per il mio utente.

San Google, come al solito, è venuto in mio aiuto con questo articolo di Christian Shay in cui l'autore indica che per Windows Vista è disponibile un pacchetto che consente di installare Oracle Client 10.2.0.3 direttamente, ossia senza la necessità, come avveniva in precedenza, di installare il client nella versione 10.2.0.1 per poi patcharla alla 10.2.0.3 che, di fatto, risolve il problema SP2-1503.
Riporto a mia volta il link per il download del client Oracle versione 10.2.0.3 per Windows Vista/windows 2008!

Installato questo pacchetto tutto è filato liscio, finchè non ho tentato una connessione al mio db di test con TOAD ritrovandomi con il seguente errore (bello Vista, sì sì):



Altra ricerca con Google ed approdo sul sito asktoad.com e più precisamente in questa FAQ; qui si legge che il problema è determinato da UAC: User Access Control, ossia il sistema di controllo degli accessi degli utenti di Windows Vista che, quando abilitato (e lo è per default), non consente ad un utente normale di accedere in scrittura alla directory Program Files. Sempre dalla FAQ si legge che quando Toad 9.5 viene installato crea un file chiamato lexlib.new che, nel momento in cui si lancia la GUI di Toad dovrebbe poter essere rinominato in lexlib.lxl, fatto non consentito proprio da UAC (a meno di eseguire Toad come utente Administrator).

Esistono due soluzioni:

* disabilitare UAC, ad esempio come indicato in questa guida
* eseguire Toad come utente amministratore

Io ho optato per la prima opzione, che è molto semplice da implementare!

giovedì 2 aprile 2009

Startup e shutdown

L'avvio e lo spegnimento di Oracle sono due procedure importanti che è necessario saper eseguire in modo corretto per garantire il funzionamento del DBMS stesso, nonchè l'integrità dei dati gestiti tramite esso.

I servizi (demoni in ambito GNU/Linux) da avviare prima di poter interagire con Oracle sono il listener e una o più istanze.
Con Microsoft Windows, i servizi a cui fare riferimento sono:

* OracleServiceSID: il servizio di bootstrap di oracle che permette l'avvio dell'istanza indicata dalla stringa "SID". Una volta avviato il servizio OracleServiceSID è possibile avviare/stoppare manualmente l'istanza
* OracleHOME_NAMETNSListener: è il servizio che si occupa di controllare il listener Oracle

Agli amministratori di Oracle su sistemi Microsoft Window consiglio di dare un'occhiata a questa descrizione (in inglese, ma molto chiara) dettagliata e completa dei servizi Oracle, delle variabili d'ambiente che è necessario impostare e delle chiavi di registro fondamentali per Oracle!

Se si predilige il sistema operativo GNU/Linux (come nel mio caso ;), Oracle mette a disposizione il comando "lsnrctl" per la gestione del listener e lo script "dbstart" per l'avvio di una o più istanze. Entrambi si trovano nella directory "$ORACLE_HOME/bin".
Al fine di automatizzare startup e shutdown di Oracle (listener + istanza/e, quindi), io utilizzo questo semplice script trovato in rete e che ho chiamato "gestoracle.sh":
#!/bin/bash
#
# Run-level Startup script for the Oracle Instance and Listener
#
# chkconfig: 345 91 19
# description: Startup/Shutdown Oracle listener and instance


#ORA_OWNR="oracle"

# if the executables do not exist -- display error

if [ ! -f $OH/bin/dbstart -o ! -d $OH ]
then
echo "Oracle startup: cannot start"
exit 1
fi

# depending on parameter -- startup, shutdown, restart
# of the instance and listener or usage display

case "$1" in
start)
# Oracle listener and instance startup
echo -n "Starting Oracle: "
$OH/bin/lsnrctl start
$OH/bin/dbstart $ORACLE_HOME
echo "OK"
;;
stop)
# Oracle listener and instance shutdown
echo -n "Shutdown Oracle: "
$OH/bin/lsnrctl stop
$OH/bin/dbshut $ORACLE_HOME
echo "OK"
;;
reload|restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 start|stop|restart|reload"
exit 1
esac
exit 0

Per lanciare lo script è sufficiente loggarsi sul db server con un utente appartenente al gruppo dba ed eseguire da command line:
$ ./gestoracle.sh start|stop|restart|reload

A seconda del parametro passato, gestoracle.sh avvia o stoppa il listener e lo script di gestione del'istanza da avviare.
Il risultato dell'esecuzione di gestoracle.sh è questo:
oracle@debiandb:~$ gestoracle.sh start
Starting Oracle:
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 02-APR-2009 08:58:14

Copyright (c) 1991, 2007, Oracle. All rights reserved.

Avvio di /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: attendere...

TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Il file dei parametri di sistema è /u01/app/oracle/product/10.2.0/db_1/network/
admin/listener.ora
Messaggi di log registrati in /u01/app/oracle/product/10.2.0/db_1/
network/log/listener.log
Ascolto su: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Ascolto su: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=debiandb)(PORT=1521)))

Connessione a (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATO del LISTENER
------------------------
Alias LISTENER
Versione TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Data di inizio 02-APR-2009 08:58:14
Tempo di attività 0 giorni 0 ore 0 min. 0 sec.
Livello trace off
Sicurezza ON: Local OS Authentication
SNMP OFF
File di parametri listener/u01/app/oracle/product/10.2.0/db_1/network/admin/
listener.ora
File di log listener /u01/app/oracle/product/10.2.0/db_1/network/log/
listener.log
Summary table degli endpoint di ascolto...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=debiandb)(PORT=1521)))
Summary table dei servizi...
Il servizio "PLSExtProc" ha 1 istanze.
L'istanza "PLSExtProc", stato UNKNOWN, ha 1 handler per questo servizio...
Il comando è stato eseguito
OK

Ora che il DBMS è attivo è possibile avviare l'istanza desiderata (assicurarsi sempre che la variabile di sistema ORACLE_SID sia correttamente impostata):
oracle@debiandb:~$ export ORACLE_SID=TEST
oracle@debiandb:~$ sqlplus /nolog

SQL*Plus: Release 10.2.0.4.0 - Production on Gio Apr 2 08:58:39 2009
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

SQL> conn/as sysdba
Connesso a un'istanza sospesa.

SQL> startup
Istanza ORACLE avviata.

Total System Global Area 1174405120 bytes
Fixed Size 1267116 bytes
Variable Size 620759636 bytes
Database Buffers 536870912 bytes
Redo Buffers 15507456 bytes
MOUNT del database eseguito.
Database aperto

La procedura di "apertura" di un database è composta da più livelli:

* LIVELLO 0 - database chiuso: l'istanza è spenta e gli utenti non possono eseguire login, accedere ai dati contenuti nel db, ecc.
* LIVELLO 1 - NOMOUNT: lanciando il comando
SQL> startup nomount
Oracle legge il contenuto del spfile che contiene le informazioni essenziali per l'avvio dell'istanza specificata dalla variabile di sistema ORACLE_SID (ad esempio, la dimensione delle varie aree di memoria RAM da riservare all'istanza, la dimensione dei blocchi di dati, il character set, ecc), quindi avviene l'avvio dell'istanza mediante allocazione di una certa quantità di memoria RAM e l'avvio dei background processes.
Il database non è ancora accessibile per gli utenti.
* LIVELLO 2 - MOUNT: raggiungibile dal livello 0 con il comando:
SQL> startup mount
oppure dal livello 1 con il comando
SQL> alter database mount;

In questo livello Oracle legge il contenuto del/i control file, la cui posizione su file system è indicata nel spfile, per determinare la posizione, sempre su file system, dei datafile di cui, tuttavia, non viene eseguita l'apertura.
* LIVELLO 3 - OPEN: lo stato di database aperto può essere raggiunto dal livello 0 direttamente con il comando
SQL> startup
oppure dai livelli 1 e 2 con il comando
SQL> alter database open

Oracle monta in sola lettura, o in lettura/scrittura i datafile, quindi i dati contenuti nel db diventano accessibili per gli utenti.

Come al solito, potete liberamente scaricare l'immagine di inizio post in quanto rilasciata con licenza Creative Commons Attribution-Noncommercial 2.0 Generic ;)