Premier Training & Business Partner Red Hat

MySysUtl – Come avvicinarsi a MySQL provenendo dal mondo Oracle

Enrico Cairo
Ti piacerebbe diventare anche tu uno di noi e
pubblicare i tuoi articoli nel blog degli RHCE italiani?

 

Premessa

Ho maturato un’esperienza più che decennale come dba Oracle (a partire dalla rel. 8i) e, quando mi sono avvicinato per la prima volta a MySQL, ho affrontato notevoli problemi di ambientamento, dovuti principalmente alla diversa filosofia che è alla base di questo motore relazionale, per cui ho deciso di creare una collezione di procedure che permettano ad un dba Oracle di approcciare questo database più facilmente.

Il progetto è nato inizialmente come unico file .sql, ma mi sono presto reso conto che la complessità e, soprattutto, la lunghezza del codice aumentava giorno dopo giorno, portandomi a scegliere di suddividerlo per argomento.

Potete scaricare il tool dal seguente url:

GitHub

Importante: il tool e’ attualmente in beta quindi, benché non sia invasivo, nel senso che non modifica impostazioni e/o dati esistenti, consiglio caldamente di non installarlo in ambienti di produzione.

Moduli

Init

E’ il file indispensabile per ogni successive modulo, in quanto crea i database e gli utenti.

Ho ritenuto utile creare due database distinti: il primo contenente funzioni di carattere generale (mysysutl), il secondo relativo al porting (e relativo adattamento) di specificità di Oracle (sysaux).

General

Contiene tabelle, funzioni e procedure “general purpose”, che sono cioè richiamate dai moduli successivi

Release

Si limita a mostrare la versione del tool

mysql> select `mysysutl`.`version`();
+---------------------------------------+
| `mysysutl`.` version `()              |
+---------------------------------------+
| MySysUtl rel. 1.0  Alpha - 03-14-2015 |
+---------------------------------------+

Memory usage

Restituisce la quantita’ di memoria utilizzata

mysql> select `mysysutl`.`mem_usage`();
+--------------------------+
| `mysysutl`.`mem_usage`() |
+--------------------------+
| 0.301                    |
+--------------------------+

Regex replace

 

Get string

Ho scritto questa funzione per emulare il passaggio di valori nelle chiamate a funzione tipico di Oracle, cioè nel formato “funzione (variabile=>valore)”
A questa funzione viene passata la stringa contenente una o più variabili e, nel caso non trovi la variabile cercata, restituisce un eventuale valore di default.
mysql> select `mysysutl`.`get_str`('ACTION=>create,PROFILE=>default,MAX_QUERIES_PER_HOUR=>0,MAX_UPDATES_PER_HOUR=>0,MAX_CONNECTIONS_PER_HOUR=>0,MAX_USER_CONNECTIONS=>0','ACTION','') as test\G
*************************** 1. row ***************************
test: create
1 row in set (0.00 sec)

tipicamente, è usata dalle altre funzioni per acquisire i valori in input

SET @vAction = `mysysutl`.`get_str`(iStr, 'ACTION','');

Get int

Identica alla precedente, con l’unica differenza di restituire un valore numerico.

mysql> select `mysysutl`.`get_str`('ACTION=>create,PROFILE=>default,MAX_QUERIES_PER_HOUR=>0,MAX_UPDATES_PER_HOUR=>0,MAX_CONNECTIONS_PER_HOUR=>0,MAX_USER_CONNECTIONS=>0','MAX_USER_CONNECTIONS','') as test\G
*************************** 1. row ***************************
test: 0
1 row in set (0.00 sec)

 

Debug

DB Size

Tale modulo schedula l’analisi giornaliera delle tabelle ed inserisce in una tabella apposita la dimensione dei database, cosi’ da storicizzare la loro crescita.

Benché non ancora presente, ho programmato di scrivere una funzione per estrarre i dati di crescita di uno specifico schema, ovvero di tutti quelli presenti sul database.

Audit

Quota

Questo modulo nasce con l’intento di gestire l’incremento dei database, evitando che si incorra nell’esaurimento dello spazio disco.

MySQL, nativamente, non possiede un simile meccanismo, come ad esempio Oracle, e ho quindi provveduto ad inserire nello scheduler un evento che controlli ogni 15 minuti la size dei database in relazione alla soglia massima eventualmente inserita in un’apposita tabella.

Verificato lo sforamento, il check provvede a revocare i diritti di inserimento, modifica e cancellazione fino a quando non si intervenga manualmente.

Profile

Una caratteristica molto utile di Oracle è la possibilità di profilare l’utenza, cioè creare diverse tipologie di account con differente accesso alle risorse di sistema.

Tale opzione, inutile a dirsi, manca su MySQL e, benché basti ripetere ogni volta il settaggio dei parametri per ogni utente, risulta più conveniente creare specifiche tipologie da “agganciare” agli account, come nel seguente esempio.

mysql> SELECT `mysysutl`.`profile_man`('ACTION=>create,PROFILE=>default,MAX_QUERIES_PER_HOUR=>0,MAX_UPDATES_PER_HOUR=>0,MAX_CONNECTIONS_PER_HOUR=>0,MAX_USER_CONNECTIONS=>0');
mysql> SELECT `mysysutl`.`profile_man`('ACTION=>create,PROFILE=>guest,MAX_QUERIES_PER_HOUR=>5,MAX_UPDATES_PER_HOUR=>1,MAX_CONNECTIONS_PER_HOUR=>1,MAX_USER_CONNECTIONS=>1');
mysql>
mysql> SELECT `mysysutl`.`profile_man`('ACTION=>set,PROFILE=>guest,USER=web);

Da notare come il profilo sia aggiornato su tutti gli host da cui può accedere l’account (nel precedente esempio è “web”); questo perché su Oracle non non è possibile creare 2 account con nome identico ma differente host di provenienza.

AWR

Exp

Benché già esista un client per effettuare il dump di uno o più database (mysqldump), se non si effettua l’export completo di tutti i database in unico file, non siamo in grado di risalire agli account che hanno accesso ai dati, ne’ alla/e rispettiva/e modalità.

Per sopperire, ho creato questo modulo che, oltre ai metadati salvati da mysqldump, inserisce anche account e grant.

MViews

Un elemento di cui ho sentito la mancanza è rappresentato dalle materialized views, che possiamo immaginare come la fotografia del risultato di una query, invece di doverla rieseguire ogni volta che si voglia accedere ai dati, come avviene invece nelle comuni viste, in quanto sono risolte dinamicamente ogni volta.

In questo modulo, il refresh dei dati avviene solo in modalità completa ma non escludo di implementare, in futuro, anche il fast refresh.

mysql> select `mysysutl`.`mviews_man`('ACTION=>create,SCHEMA=>mysql,MVIEW=>prova_mv,QUERY=>select user, host from mysql,user');

Sicuramente, la prima modifica al tool interesserà questo modulo, in quanto devo finalizzare la parte relativa alla schedulazione dei refresh.

In sostanza, si tratta di inserire l’intervallo di refresh nella tabella contenente tutti gli altri dati e fare in modo che un singolo job vi acceda regolarmente per stabilire quali materialized views ricreare (in questo caso, si tratterebbe di una truncate, più che di una drop).

Info about author

Enrico Cairo