Oracle: Creazione di un Database Link e di un Synonyms

Uno dei motivi per cui ho iniziato ad interessarmi al Database sviluppato da Oracle, è la sua semplicità nell’accesso agli schemi ed alle tabelle su sistemi distribuiti.

Vediamo subito un immagine che spero ci chiarirà subito lo scopo di questo articolo ( almeno spero :P).

Supponiamo di avere due database Oracle 11g, chiamati nel mio caso ( mi riferisco all’hostname ):

  1. oracle_dbschool
  2. oracle_db1
Lo scopo è quello di fare una partizione funzionale del database ( come potete vedere dal diagramma E-R), cioè suddividere le mie tabelle su due database fisici distinti in modo da ripartire il carico computazionale. Vi rimando al mio primo articolo sulla creazione manuale di un Database Oracle nel caso ne aveste bisogno.
Su oracle_dbschool avrò le tabelle: “utente”, “familiare”, “insegnamento” e “partecipazione”
Su oracle_db1 avrò solamente la tabella “bacheca”
Lo scopo del Database Link e della Synonyms è quello di rendere trasparente l’accesso alla tabella “bacheca” da parte di un utente che ha accesso solo al database oracle_dbschool ( database Master)
Dalla figura spero che lo scopo dell’articolo sia più chiaro, l’utente flavio ha accesso solo a oracle_dbschool, e da esso accede alla tabella “bacheca” che in realtà è  presente su un altro database oracle, il tutto avviene in modo trasparente rispetto all’utente, in quanto viene nascosto dal nodo Master ( oracle_dbschool ) il fatto che la tabella è distribuita.
Dopo questo piccolo preambolo vediamo i vari passi che ho eseguito per far si che la cosa funzionasse… decentemente 😀

I) Modifica di tnsnames.ora

Per prima cosa dobbiamo specificare gli hostname e gli indirizzi IP a loro associati, in modo tale da permettere loro di comunicare. Il file che andremo a modificare su entrambi i database è chiamato tnsnames.ora ed è possibile trovarlo nell path:  $ORACLE_HOME/network/admin

In oracle_dbschool:

[sourcecode language=”bash”]

unicondor@oracle_dbschool:~$ cat $ORACLE_HOME/network/admin/tnsnames.ora

REMOTE_DB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.103)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = db1)
)
)
[/sourcecode]

in questo caso ho specificato su oracle_dbschool che oracle_db1 ha un Database di nome db1 all’indirizzo 192.168.1.103 ed è in ascolto sulla porta 1521.

II) Creazione del Database Link

Il Database Link e’ un mezzo molto potente che Oracle ci mette a disposizione per accedere/inserire/cancellare  un oggetto su un altro database, per di piu’ tale database non deve per forza essere Oracle ma puo’ essere qualsiasi altro database ( Ex. mysql ).

Tramite l’utility sqlplus su oracle_dbschool

[sourcecode language=”bash”]
SQL> create public database link remote_db connect to flavio identified by flavio using ‘remote_db’;
Database link created.
[/sourcecode]

grazie a questo semplice comando, stiamo dicendo al nostro database (oracle_dbschool) di creare un link simbolico ad oracle_db1, e tale link sara’ chiamato “remote_db”.

ora potremmo effettuare le query sulle tabelle di oracle_db1 direttamente da oracle_dbschool . Supposto che tu oracle_db1 abbiamo una tabella di nome “t1″:

In oracle_dbschool:

[sourcecode language=”bash”]
SQL> select * from t1@remote_db;

A
———-
3
1
2
[/sourcecode]

III) Creazione di un Synonyms

Potremmo fermarci anche a questo punto, ma essendo dei cinici possiamo spingerci oltre ed usare anche i Synonyms 😛

Lo scopo dei Synonyms e’ quello di usare un nome alternativo per l’accesso a tabelle, schemi ecc.. che possono risiedere anche su database remote ( come nel nostro caso).

In oracle_dbschool:

[sourcecode language=”bash”]
SQL> create public synonym t1 for t1@remote_db;

Synonym created.

[/sourcecode]

Abbiamo creato un alias chiamato “t1” per la tabella “t1” che era presente sul database remoto oracle_db1 e che in precedenza abbiamo creato un Database Link chiamato “remote_db“. Spero sia tutto chiaro… nonostante la mia intrinseca mal predisposizione all’italiano 😛

Tramite il Synonyms possiamo eseguire la query della tabella t1 come se fosse fisicamente presente sul database oracle_dbschool ( in realta’ e’ presente solo su oracle_db1).

Esempio su oracle_dbschool:

[sourcecode language=”bash”]
SQL> select * from t1;

A
———-
3
1
2

SQL> insert into t1 values(30);
SQL> commit;

[/sourcecode]

In questo caso, dopo aver fatto una select, abbiamo effettuato anche un inserimento nella tabella.. il tutto come se fosse fisicamente presente nel Db.
Per gli approfondimenti, vi rimando alle guide ufficiali che potete trovare sul sito di Oracle che sono molto piu’ complete e chiare dei miei articoli 😀

Oracle: Creazione Manuale di un Database

Oracle 11g - Database manual Creation

Da buoni smanettoni, figli della Slackware Philosophy , dei “veri” Sistemi Operativi UNIX-Like  e della Command- Shell, non potevamo certo usare l’utility dbca messa a disposizione da Oracle per la creazione tramite interfaccia grafica del nostro nuovo Database Oracle 11g.

A noi piace complicarci la vita… le scelte più semplice le lasciamo agli altri 😀

Per l’esame di Sistemi Distribuiti assieme al mio efficientissimo ed affiatatissimo gruppo di lavoro ( Cara Angela, Maddalena, Mario e Rita non fate caso alle mie divagazioni …. di solito sono una persona normale, che fa cose normali 😀 ) abbiamo deciso di estendere/enhanced il progetto presentato in Laboratorio di Ingegneria del Software, implementando una Struttura del sistema a 3 livelli con:

  • La distribuzione del Database ( tramite Oracle e l’uso della Synonyms e dei Database Link )
  • il Load Balancing del carico dal Web-Server ( Apache ) verso il Servlet-Engine ( Tomcat ) utilizzando JK ,
  • La suddivisione dei vari Servizi su più macchine Host.

… dopo questo preambolo sembra (quasi) un progetto serio 😛

Ho sempre avuto una “insana” debolezza per i Database Distribuiti, per questo motivo, non avendo prima d’ora visto nulla, ho deciso di cimentarmi nella creazione di uno di essi…. e sembra quasi che ci sia riuscito 😀

Vabbè… credo di avervi già annoiato troppo, magari siete alla ricerca di qualche utile comando… ed io vi stò costringendo a leggere queste stupidaggini 😛

I Step:

Iniziamo con il download della Macchina Virtuale che Oracle ci mette già a disposizione con all’interno il Database e gli strumenti di sviluppo pronti per essere utilizzati ( P.s. l’utility dbca in questa versione non funziona 😛 )

http://www.oracle.com/technetwork/database/enterprise-edition/databaseappdev-vm-161299.html

prima di procedere con il prossimo passo specifichiamo per i For-Dummies, come me,  alcuni concetti base dei Database Oracle.

La variabile d’ambiente ORACLE_SID deve contenere il nome del Db che vogliamo creare/utilizzare. Nel mio caso il Database avrà il nome “db1“, per cui…

[sourcecode language=”bash”]

[oracle@localhost ~]$ export ORACLE_SID=db1

[/sourcecode]

II Step

Passiamo alla creazione del SPFILE, il file responsabile dell’inizializzazione dei parametri del nostro nuovo Database( da posizione in %ORACLE_HOME/dbs ), esso deve essere posizionato nella seguente Directory:

[sourcecode language=”bash”]

[oracle@localhost ~]$ echo $ORACLE_HOME/dbs

/home/oracle/app/oracle/product/11.2.0/dbhome_2/dbs

[/sourcecode]

il nome deve essere formato da init$ORACLE_SID.ora, nel mio caso e’:    initdb1.ora

[sourcecode language=”bash”]

control_files = (/home/oracle/app/oracle/oradata/db1/control1.ctl,/home/oracle/app/oracle/oradata/db1/control2.ctl,/home/oracle/app/oracle/oradata/db1/control3.ctl)
undo_management = AUTO
undo_tablespace = UNDOTBS1
db_name = db1
db_block_size = 8192
sga_max_size = 1073741824 #one gig
sga_target = 1073741824 #one gig

[/sourcecode]

III Step

Creiamo il file con la password di accesso al Db

[sourcecode language=”bash”]

[oracle@localhost ~]$ $ORACLE_HOME/bin/orapwd file=$ORACLE_HOME/dbs/pwddb1.ora password=flavio entries=5

[/sourcecode]

Bene… ora non ci resta altro che lanciare l’istanza ( con l’opzione nomount )  del Database ed incrociare le dita che tutto vada bene 😀

IV Step

Attenzione: controllare sempre che la variabile ORACLE_SID abbia sempre il valore del vostro Database

Logghiamoci tramite l’utility sqlplus come sysdba, e lanciamo l’istanza senza montare il Database

[sourcecode language=”bash”]

[oracle@localhost ~]$ sqlplus / as sysdba

SQL > startup nomount

[/sourcecode]

A questo punto la macchina virtuale potrebbe darvi questo errore (almeno nel mio caso mi restituisce questo)

[sourcecode language=”bash”]

ORA-00119: invalid specification for system parameter LOCAL_LISTENER
ORA-00130: invalid listener address ‘(ADDRESS=(PROTOCOL=TCP)(HOST=new-host)(PORT=1521))’

[/sourcecode]

basta solamente aggiungere in /etc/hosts il dns new-host all’indirizzo IP 127.0.0.1, dato che il Listener non riconosce hostname

V Step

Passiamo alla creazione vera e proprio del Database inserendo direttamente in sqlplus i seguenti comandi

[sourcecode language=”bash”]

SQL> create database db1
logfile group 1 (‘/home/oracle/app/oracle/oradata/db1/redo1.log’) size 100M,
group 2 (‘/home/oracle/app/oracle/oradata/db1/redo2.log’) size 100M,
group 3 (‘/home/oracle/app/oracle/oradata/db1/redo3.log’) size 100M
character set WE8ISO8859P1
national character set utf8
datafile ‘/home/oracle/app/oracle/oradata/db1/system.dbf’ size 500M autoextend on next 10M maxsize unlimited extent management local
sysaux datafile ‘/home/oracle/app/oracle/oradata/db1/sysaux.dbf’ size 100M autoextend on next 10M maxsize unlimited
undo tablespace undotbs1 datafile ‘/home/oracle/app/oracle/oradata/db1/undotbs1.dbf’ size 100M
default temporary tablespace temp tempfile ‘/home/oracle/app/oracle/oradata/db1/temp01.dbf’ size 100M;

[/sourcecode]

Anche in questo caso potrebbe restiturvi il seguente errore, causato dalla mancata creazione della cartella dove saranno posizionati i redofile

[sourcecode language=”bash”]

ERROR at line 1:
ORA-01501: CREATE DATABASE failed
ORA-00200: control file could not be created
ORA-00202: control file: ‘/home/oracle/app/oracle/oradata/db1/control1.ctl’
ORA-27040: file create error, unable to create file
Linux Error: 2: No such file or directory

[/sourcecode]

Per risolvere, basta creare la cartella:

[sourcecode language=”bash”]

[oracle@new-host ~]$ mkdir /home/oracle/app/oracle/oradata/db1

[/sourcecode]

VI Step

Per completare l’installazione del Database lanciamo i seguenti script che Oracle ci mette a disposizione per la creazione delle views di default , synonyms e PL/SQL packeges

[sourcecode language=”bash”]

SQL> @?/rdbms/admin/catalog.sql

SQL> @?/rdbms/admin/catproc.sql

[/sourcecode]

VII Step

Creazione del tablespace
[sourcecode language=”bash”]
SQL> create tablespace school20
datafile ‘/home/oracle/app/oracle/oradata/db1/school20_01.dbf’
size 50m;

[/sourcecode]

dell’utente che avra’ accesso ad esso e dei permessi per accedervi
[sourcecode language=”bash”]
SQL> create user flavio identified by flavio default tablespace school20 quota unlimited on school20;
SQL> grant all privilege to flavio;
[/sourcecode]

VIII Step

Se tutto sara’ andato per il meglio, lanciamo l’istanza del Database e poi proviamo a collegarci ( Ricordate sempre che ORACLE_SID abbia come valore il nome del vostro Db)

[sourcecode language=”bash”]
SQL> startup

[/sourcecode]

[sourcecode language=”bash”]
[oracle@localhost root]$ sqlplus flavio/flavio
[/sourcecode]

Buon smanettamento con il vostro Database Oracle 😀

Reference:

http://docs.oracle.com/cd/B10501_01/server.920/a96521/create.htm#1000691

http://www.adp-gmbh.ch/ora/admin/creatingdbmanually.html

http://www.dba-oracle.com/oracle_create_database.htm