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:
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
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).