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 😀

TopHost: Redistribuire Spazio tra i servizi Web MySql Mail

E’ già da qualche mese che il blog è online ( esattamente dal 24/10/2010 ) e deve dire che di solito mi “scoccio” abbastanza presto dei capricci che spesso mi vengono in mente, questa volta devo dire che la cosa mi appassiona e mi spiace per te, malcapitato lettore, ma dovrai sopportami per un bel pò 😛

Ritornando al titolo del post, senza divagare ulteriormente, ho fatto accesso al Pannello di Amministrazione di TopHost ( devo ammettere un servizio low-cost impeccabile fino ad ora ) per controllare lo stato dei servizi e la distribuzione dei 500 MB messi a disposizione dal provider ed ho notato che lo spazio del database MySql era in esaurimento

Guardando la linea rossa lampaggiante in basso alla schermata mi sono subito preoccupato credendo di aver esaurito lo spazio totale del mio Database. Infine facendo una piccolisissima ricerca sul web mi sono accorto che il provider permette la re-distribuzione dello spazio dei servizi ( di default lo spazio Mysql è 5000 KB pari a 5 MB ) e per tale motivo basta solo aumentare lo spazio dedicato al database, ovviamente rispettando sempre il limite totale dei 500 MB messi a disposizione per ogni host.

Leggi tutto “TopHost: Redistribuire Spazio tra i servizi Web MySql Mail”