25 giugno 2007

Falcon alpha: vediamo se funziona

Installato Ubuntu server 64 bit, spacchettiamo mysql 6 alpha e configuriamo i sorgenti:
root@ubu642:~# ./configure --with-plugins=all
seguito da un make e make install. Consiglio di utilizzare --prefix=/usr/local/mysql per "inscatolare" la versione alpha di mysql in una sua directory particolare, altrimenti tutto va in /usr/local. Copiate la vostra versione preferita di my.cnf in /etc, create il database "starter" con mysql_install_db, cambiate i permessi del database con chmod, e impostate la password di root con mysqladmin; create poi un utente che ha tutti i grant sul database di test predisposto.

CREATE TABLE f (
fid int(11) NOT NULL,
descr varchar(32) DEFAULT NULL,
PRIMARY KEY (fid)
) ENGINE=Falcon;

Popoliamo la tabella:

insert into f values (1, 'uno');
insert into f values (2, 'due');
insert into f values (3, 'tre');
insert into f values (4, 'quattro');

Da un'altra sessione:

select * from f;
+-----+---------+
| fid | descr |
+-----+---------+
| 1 | uno |
| 2 | due |
| 3 | tre |
| 4 | quattro |
+-----+---------+
5 rows in set (0.00 sec)

Dalla prima sessione:

set autocommit=0;
update f set fid = 7 where fid = 4;

Dalla seconda sessione:

mysql> select * from f;
Empty set (0.00 sec)

Da qualche prova ulteriore, meno incomprensibile, è saltato fuori che bisogna committare anche la seconda sessione per vedere le modifiche della prima. Tutto questo in repeatable-read transaction isolation mode.
Ho provato anche in read-committed (la nostra preferita :-)) e non è un granché meglio.
Falcon fallisce inoltre il test di aggiornamento della chiave primaria:
update f set fid = fid+1;
dà una violazione di chiave primaria.

Bene. Aspettiamo ancora un po'. È meglio.

22 giugno 2007

Altro corso Oracle

La prossima settimana sarò alla Oracle di Sesto S. Giovanni per un altro corso Oracle:
Oracle Database 10g: New Features for Administrators Release 2.
Anche se lavoro già da un po' sulla 10g e ho letto qualche libro, non si finisce mai di imparare.

Chi fosse da quelle parti mi faccia sapere via e-mail.

Data pump exclude/include

Su Oracle Data Pump sono molto utili i parametri EXCLUDE e INCLUDE, mutuamente esclusivi, con cui si può specificare il tipo di oggetti che si vogliono escludere o includere nelle operazioni di export o import.
Ad esempio EXCLUDE=TABLE salverà tutto tranne le tabelle. Ma come facciamo ad escludere una tabella o un gruppo di tabelle? Usiamo la name clause, con cui specifichiamo un'espressione SQL a destra di un operatore:

EXCLUDE=TABLE:"IN ('EMP', 'DEPT')"
EXCLUDE=TABLE:" = 'EMP'"

Ora, se mettete tutto sulla command-line, Oracle si lamenta del fatto che l'espressione SQL non è corretta. Il problema è che le virgolette non arrivano all'interprete dei comandi, ma vengono interpretate dalla shell :-/

Le soluzioni sono due: una è fare l'escape delle virgolette:

EXCLUDE=TABLE:\"IN (\'EMP\', \'DEPT\')\"

Bisogna fare l'escape di tutte perché fatto delle prime, vengono interpretate le seconde.
L'altra soluzione è usare un parameter file (PARFILE='filename'), in cui gli escape ovviamente non vengono interpretati.

17 giugno 2007

Novità mysql: Falcon

Mysql ci stupisce con l'ennesimo motore di database: Falcon. Probabilmente dobbiamo questa novità all'acquisizione di InnoDB da parte di Oracle e al fatto che qualcosina che non andava molto c'era. Questo sospetto mi viene dal fatto che, come prima nuova feature, c'è un evidente MVCC. Anzi, TRUE MVCC. Viene anche evidenziata la data and index caching: ricordiamo che le "vecchie" versioni di mysql sfruttavano il buffering fatto dal sistema operativo sui device a blocchi come cache, ovvero non avevano cache di dati. Nel file di configurazione my.cnf vengono specificati nuovi parametri riguardo la memoria cache.
I dati relativi ad un singolo database (nel significato di mysql: un namespace) vengono scritti in un unico file; altri due file compongono il db: due log seriali. I metadati delle tabelle vengono scritti in un file frm, come il vecchio motore myisam.
A quanto pare i record modificati vengono tenuti in una memoria speciale chiamata record cache, mi pare di capire in maniera diversa da Oracle, che modifica direttamente i blocchi. I dati, gli indici e gli altri dati vengono scritti tutti insieme nello stesso tablespace; può avere senso in molti ambienti di produzione. C'è il log buffer, il log switch e il checkpoint, come Oracle. Interessante la presenza della compressione dei dati su disco.
Per ora non c'è ancora il backup online e il supporto per le foreign key. A quelli di mysql alcune cose non gli sono proprio simpatiche.
Ora si tratta di capire a quali feature presenti negli altri motori di mysql bisognerà rinunciare per potere avere le nuove funzionalità che Falcon offre, nonché quali cambiamenti bisognerà adottare nelle applicazioni scritte sapendo che mysql non offriva il multi-versioning e nemmeno la possibilità di fare rollback.
Io sono molto curioso, quindi ho subito approntato una macchina virtuale Ubuntu server 64 bit per provare il nuovo motore. Perché Ubuntu server? Perché la trovo minimale e molto ben fatta, a cominciare dal fatto che una volta installata manca persino l'ssh. Una configurazione ultraminimale che in ambito server non può che fare bene sia alle performance che alla sicurezza. Si ricordi poi che generalmente Ubuntu è molto ben supportata, ha sempre un'aggiornamento molto recente del kernel (anche troppo insistente), e un ambiente di sviluppo molto solido. Ho scelto la versione a 64 bit perché mysql 6 sembra intenzionato ad uscire a 64 bit come versione preferenziale.
Spero di avere presto un po' di tempo per fare prove col nuovo engine.

11 giugno 2007

Oracle a 64 bit

Nel finesettimana, per necessità lavorative, ho configurato il mio nuovo PC AMD64 con 4 GB di RAM, comprato per fare esperimenti su Oracle e Linux.
Ho tentato subito di utilizzare le versioni x86_64 sia del sistema operativo che di Oracle, ma mi sono trovato (prevedibilmente) subito in grande difficoltà, a cominciare dal riconoscimento delle periferiche. Ho provato Ubuntu 7.04, OpenSuSE 10.2, Fedora 7 e ho scaricato per ultimo SLES10, un po' disperato, ma ho lasciato perdere.
Domenica sera, dopo una giornata di relax a visitare castelli, ho avuto la giusta intuizione: ho risolto i problemi di installazione di OpenSuSE 10.2 e l'installazione di 10gR2 per x86_64 è andata a meraviglia, veramente senza problemi e velocissima. Nessun problema di package e compatibilità delle librerie, contrariamente ai problemi infiniti con le altre distribuzioni, parzialmente risolti.
Ho installato il db su ASM, a sua volta su raw devices a loro volta su logical volume LVM2. Spettacolare.
Ora il grosso della preparazione è finita, ho in cantiere altre attività sul db. Sono contento però di avere trovato la combinazione perfetta Linux/Oracle 64 bit, senza ricorrere alle distribuzioni commerciali.