8. Amministrazione di MySQL Lezioni di web attivo 8. Amministrazione di MySQL 8.1 Architettura client/server Dal punto di vista strutturale il DBMS MySQL si comporta come un server standard TCP. Questo significa che su un host accessibile dalla rete Internet è in esecuzione una applicazione che accetta connessioni TCP da applicazioni client su una porta predefinita (well-known, la porta di default è la 3306). Una volta stabilita la connessione il client può interrogare il server inviando query sulla connessione usando un protocollo di comunicazione specifico del sistema MySql. Il server risponde alle interrogazioni elaborando i dati richiesti sul proprio file-system e fornendo i risultati attraverso la connessione. La connessione viene chiusa dal client quando ha terminato le operazioni di interrogazione. Il server è in grado di accettare più connessioni contemporaneamente. Per motivi di sicurezza l’accettazione delle connessioni può essere limitata secondo vari criteri: Solo da localhost: i clients devono trovarsi sullo stesso host su cui si trova il server. Questa è la situazione più comune; infatti questo non vuole dire che l’utente finale deve trovarsi su localhost ma vi si deve trovare lo script che interroga, ad esempio una pagina di web attivo che fa parte del sito e può essere interrogata da chiunque da Internet. Solo dall’interno del dominio: i clients possono trovarsi su altri hosts appartenenti allo stesso dominio del server. Questa situazione consente lo sviluppo di banche dati distribuite fra più host dello stesso dominio che potrebbero anche trovarsi fisicamente lontani Da host esterni al dominio: i clients possono trovarsi anche su host esterni al dominio (eventualmente anche tutti gli host di internet). Questa situazione è molto pericolosa perché lascia aperto il sistema ad intrusioni attraverso la porta di connessione. L’unica utilità che presenta è la possibilità di manutenzione remota usando una applicazione client Una volta ottenuta la connessione al server l’accesso ai databases gestiti dal server DBMS è limitato dal fatto che ogni database è accessibile solo dagli utenti MySql autorizzati ad accedervi. Gli utenti MySql non coincidono con gli utenti di sistema ma sono invece utenti che devono essere definiti al momento della generazione di un nuovo database. Un database quando nasce è proprietà di un particolare utente predefinito (root) che comunque rimane proprietario di tutti i database del DBMS. L’utente root può concedere diritti (lettura, inserimento, cancellazione, modifica, concessione) ad altri utenti eventualmente identificati da password. Solo gli utenti che possiedono un database lo possono interrogare nei limiti dei diritti che sono stati loro concessi. Esistono molti strumenti di manutenzione sia integrati nel pacchetto MySql che forniti da terze parti. Questi strumenti si possono riassumere in tre categorie: Client a riga di comando: sono comandi integrati nel pacchetto e residenti su localhost. Sono utili all’amministratore di DBMS per effettuare una rapida manutenzione locale in particolare usando script automatizzati. Applicazioni client visuali: sono applicazioni visuali che consentono una ricca manutenzione interattiva. In genere si trovano su un host diverso e quindi il DBMS deve consentire l’accesso ad host esterni (in genere nel dominio) Client web on-line: sono pagine attive collocate su localhost ed accessibili dall’esterno, combinando in questo modo i pregi delle due soluzioni precedenti (accesso sicuro e interfaccia interattiva) ma sono piuttosto lenti. ITIS “O.Belluzzi” – Laboratorio di Sistemi 1-10 Lezioni di web attivo 8. Amministrazione di MySQL 8.2 Client a riga di comando I client a riga di comando si invocano da una shell del sistema operativo che ospita il DBMS inserendo il comando, gli eventuali parametri e le eventuali redirezioni. E’ infatti possibile redirigere sia l’input standard (tastiera) sia l’output standard (monitor) a files in modo da trasformare l’azione del client da interattiva a batch. I comandi di uso più frequente sono: mysqladmin: esegue operazioni amministrative sul DBMS come creare, cancellare database, fermare e riavviare il server, fornire informazioni sul suo stato. mysql: è una console di comando che consente di effettuare interrogazioni ai database gestiti dal DBMS sia in modo interattivo che in modo batch. mysqlshow: questa utility mostra in formato testo la struttura dei databases. mysqldump: questa utility mostra in formato testo sia la struttura che i contenuti dei databases sotto forma di interrogazioni. Se usata in modo batch costituisce un strumento di backup di un database che si combina con mysql usato in modo batch come strumento di restore. mysqlimport: questa utility consente l’importazioni di dati da un file di testo (ad esempio un CSV) mysqlcheck: questa utility effettua il controllo di correttezza e la eventuale riparazione di banche dati. 8.3 Applicazioni client visuali Esistono molte applicazioni client visuali, tutte realizzate da terze parti, che integrano in un’unica finestra tutte le funzioni a riga di comando. Ne vengono citate alcune: mysqlyog: semplice client visuale per win32 mycc: client visuale multipiattaforma dbdesigner: ambiente multipiattaforma di sviluppo visuale dello schema. Può collegarsi anche ad altri DBMS oltre a MySql (via ODBC) e consente oltre alla progettazione anche l’analisi visuale dello schema. 8.4 Client web online Esistono molte applicazioni web on-line, tutte realizzate da terze parti, che integrano in un sito web attivo tutte le funzioni a riga di comando. Nel pacchetto MySql sia sulla piattaforma linux che win32 è integrata l’applicazione phpMyAdmin che consente, attraverso pagine autenticate, l’amministrazione del DBMS e la manipolazione delle banche dati attraverso una interfaccia grafica intuitiva. ITIS “O.Belluzzi” – Laboratorio di Sistemi 2-10 8. Amministrazione di MySQL Lezioni di web attivo 8.5 Amministrazione dei database Le operazioni di amministrazione dei database si possono realizzare in vari modi. Negli esempi che seguono si utilizzano gli strumenti a linea di comando per creare, progettare, popolare, proteggere e verificare un database. Tutte le informazioni che consentono di amministrare i vari DB sono a loro volta contenute in un DB predefinito denominato “mysql” accessibile sono all’amministratore. 8.5.1 Creazione di un database Il database deve essere generato dall'amministratore mysql invocato però dalla shell normale utente di sistema che conosce la password dell'amministratore mysql. un In questo esempio l'utente di sistema è "user" che dopo avere ottenuto la propria shell di sistema esegue il comando: mysqladmin -u <utente> -p create <nomedatabase> -u <utente> specifica l'utente che accede al comando. L'utente root è il root di mysql non il root del sistema ospite. -p specifica che il comando chiede interattivamente la password (non è sicuro fare script che contengano già la passoword in chiaro). In ambiente di sviluppo locale è comodo lasciare l’amministratore senza password (easyphp installa proprio in questo modo) ma su un host operativo la presenza della password di amministratore è inderogabile. Se l'utente non dispone dell'accesso come amministratore mysql deve chiedere la creazione della banca dati all'amministratore. Esempio: mysqladmin -u root -p create prova Il DBMS chiede la password e se accettata genera il DB di nome “prova”. Il DB al momento è vuoto nel senso che non contiene alcuna tabella ed è proprietà esclusiva di “root” 8.5.2 Verifica della esistenza del database Ora il DB esiste ma non contiene dati e non ha neppure uno schema. La verifica può essere fatta con il comando: mysqlshow -u root -p Il comando restituisce una lista di tutti i database gestiti dal DBMS del tipo: +-------------+ | Databases | +-------------+ | ... | | mysql | | ... | | prova | | ... | +-------------+ ITIS “O.Belluzzi” – Laboratorio di Sistemi 3-10 Lezioni di web attivo 8. Amministrazione di MySQL dove "..." sta per altri database eventualmente gestiti dallo stesso DBMS (la lista può variare in funzione dell'host) Rieseguendo il comando con il DB prova come parametro si ottengono ulteriori dettagli su quel DB: mysqlshow -u <utente> -p <nomedatabase> Nel caso in esempio: Mysqlshow -u root -p prova Viene mostrata la lista delle tabelle che compongono il database (in questo caso ancora vuota) Database: prova +--------+ | Tables | +--------+ +--------+ Per il momento solo l'amministratore mysql può fare questa operazione ma dopo aver concesso l'uso della banca dati "prova" all'utente mysql “user” anch'esso può visitare la banca dati che possiede. 8.5.3 Assegnazione dei privilegi di accesso al manutentore del database Il manutentore della banca dati è un utente mysql che possiede tutti i diritti di accesso alla banca dati e quindi su di essa può fare qualsiasi azione eccetto in genere concedere i propri diritti ad un altro utente mysql. L'utente mysql non è necessariamente coincidente con l'utente di sistema ma per motivi di comodità si può definire un utente mysql avente "nome utente" e "password" coincidenti con l'utente ldi sistema che farà la manutenzione. Per motivi di sicurezza l'accesso di questo utente alla banca dati è protetto da password, quindi ad ogni connessione con il DBMS questa password deve essere specificata. L'accesso come utente manutentore quindi può essere fatto solo dalla shell inserendo interattivamente la password o da una pagina web autenticata che acceda dinamicamente ad una banca dati di servizio contenente nomi utenti e password criptate accessibile in lettura senza password solo da localhost (vedi punto 7). In questo modo la password non compare staticamente in chiaro nella pagina web (sarebbe un fatale pericolo per la sicurezza). Non si può usare per l'autenticazione la banca dati mysql stessa perchè essa è a sua volta protetta dalla password di root. L'assegnazione dei previlegi al manutentore si effettua inserendo le informazioni nella banca dati di servizio "mysql" accessibile solo da shell da parte root mysql: mysql -u root -p mysql ITIS “O.Belluzzi” – Laboratorio di Sistemi 4-10 8. Amministrazione di MySQL Lezioni di web attivo Questo comando, che chiede interattivamente la password, porta al prompt della consolle mysql avendo connesso la banca dati di servizio mysql mysql> La banca dati "mysql" è una normale banca dati quindi tutti i comandi sql sono validi, ma esistono particolari comandi di servizio che facilitano la manutenzione: GRANT <privilegi> ON <database>.* TO <utente>@<host> IDENTIFIED BY '<pwd>'; REVOKE <privilegi> ON <database>.* FROM <utente>@<host>; In questo caso si vuole ottenere un utente che ha tutti i diritti su un particolare database ma che si deve connettere al motore dall'host locale (quindi o una shell dell'host locale oppure una pagina autenticata collocata sull'host locale). La query da eseguire è: GRANT ALL PRIVILEGES ON prova.* TO user@localhost IDENTIFIED BY '1QazXsW2'; ALL PRIVILEGES vuole dire che l'utente sul quel database può fare: SELECT: selezionare righe da tabelle INSERT: inserire righe in tabelle UPDATE: modificare righe in tabelle DELETE: cancellare righe da tabelle INDEX: modificare indici di tabelle ALTER: modificare la struttura di tabelle CREATE: creare tabelle DROP: cancellare tabelle GRANT: cedere diritti sul db ad altri utenti localhost vuole dire che l'utente è riconosciuto solo se si connette al motore dallo stesso host su cui si trova il motore mediante shell o pagina autenticata. La password compare in chiaro nel comando. La query GRANT provvede alla criptazione prima della memorizzazione nel database mysql. N.B. Non è sicuro mantenere in archivio files che contengono le password in chiaro. Poiché è comodo utilizzare scripts per queste operazioni di manutenzione questi scritps vanno rimossi dal file system dopo l'uso. 8.5.4 Privilegi del utente generico locale della banca dati L'utente generico locale è un utente fittizio che possiede i principali diritti di manipolazione della banca dati ma non può modificare la struttura della banca dati ne può cancellerla. Questo utente non protetto da password viene utilizzato per la generazione delle pagine web di visita, inserimento e cancellazione dati. Poichè le pagine web attive sono eseguite dal web server che si identifica come utente linux "nobody" è opportuno utilizzare questo nome per l'utente generico locale. L'assenza di password consente di creare pagine web locali che non contengono informazioni pericolose. Se si vuole limitare l'accesso alle pagine che contengono modifiche al contenuto della banca dati (questo utente comunque non riesce a modificarne la struttura) si possono proteggere le pagine con autenticazione mediante un altro data base contentente nomi utente e password criptate (vedi punto 7). ITIS “O.Belluzzi” – Laboratorio di Sistemi 5-10 Lezioni di web attivo 8. Amministrazione di MySQL Come nel caso precedente l'assegnazione dei diritti deve essere fatta da root accedendo alla banca dati "mysql". In questo caso si vuole ottenere un utente che ha solo i diritti di SELECT,INSERT,UPDATE su un particolare database ma che si deve connettere al motore dall'host locale (quindi o una shell linux dell'host locale oppure una pagina non necessariamente collocata sull'host locale). La query da eseguire è: GRANT SELECT,INSERT,UPDATE,DELETE ON prova.* TO nobody@localhost\g L'assenza di IDENTIFIED BY fa si che l'utente non sia protetto da password. 8.5.5 Privilegi del utente generico di dominio della banca dati L'utente generico di dominio è un utente fittizio che possiede solo diritti di consultazione sulla banca dati ma non può modificare ne contenuti ne struttura della banca dati ne può cancellarla. Questo utente non protetto da password viene utilizzato per la generazione delle pagine web di visita da un host che contiene le pagine web ad un altro host dello stesso dominio in modo da realizzare una banca dati distribuita. Poichè le pagine web attive sono eseguite dal web server che si identifica come utente linux "nobody" è opportuno utilizzare questo nome per l'utente generico di dominio. L'assenza di password consente di creare pagine web remote che non contengono informazioni pericolose. Come nel caso precedente l'assegnazione dei diritti deve essere fatta da root accedendo alla banca dati "mysql". In questo caso si vuole ottenere un utente che ha solo i diritti di SELECT su un particolare database e si deve connettere al motore da un host appartenente allo stesso dominio dell'host locale. La query da eseguire è: GRANT SELECT prova.* TO nobody@'%.scuole.bo.it'; Il simbolo % è una wildcard che consente l'accesso da qualsiasi host appartente al dominio scuole.bo.it L'assenza di IDENTIFIED BY fa si che l'utente non sia protetto da password. 8.5.6 Accessi da fuori del dominio Gli accessi da fuori del dominio falliscono perchè non esiste alcun utente che abbia accesso al motore da fuori del dominio. Questo non vuole dire che non si può consultare o modificare la banca dati accedendo da un host fuori dominio ma che per farlo si devono visitare pagina collocate nel dominio o in un particolare host del dominio per rispettivamente consultare e/o modificare la banca dati. Ciò che fallisce è la visita di pagine collocate fuori dominio che tentano di accedere al motore. A questo punto ci troviamo con tre tipi di utenti della banca dati: Manutentore: manut@localhost tutti i diritti Generico locale: nobody@localhost consultazione e modifica Generico remoto: [email protected] consultazione ITIS “O.Belluzzi” – Laboratorio di Sistemi 6-10 8. Amministrazione di MySQL Lezioni di web attivo 8.6. Generazione delle tabelle La generazione delle tabelle può essere fatta solo dal manutentore che ha i diritti di create e drop. Sebbene la generazione si possa fare anche mediante una pagina web poichè è una operazione occasionale è più rapido farla da una shell. Conviene produrre uno script da inviare allo standard input della consolle mysql mandando lo standard output ad un file di testo in modo da diagnosticare e correggere rapidamente gli inevitabili errori di progetto e digitazione. mysql -u utente -p banca_dati < file_script > file_log Gli elementi in grassetto sono parametri a cui si devono sostituire i valori attuali. Lo script è un file di testo contenente i comandi da inviare in consolle. Ad esempio: #cancella la tabella se esiste DROP TABLE IF EXISTS tab1; #crea la struttura della tabella CREATE TABLE tab1 ( ID INT NOT NULL AUTO_INCREMENT, Dato CHAR(80) NOT NULL, PRIMARY KEY Pk (ID), INDEX dt (Dato) ); Note: - Il simbolo # indica commento da non processare - La cancellazione prima della creazione serve per rieseguire un comando che era parzialmente fallito in precedenza - La cancellazione di una tabella cancella automaticamente anche tutti i dati contenuti - Il comando eseguito in questo modo torna immediatamente alla shell del sistema operativo in modo silente - I risultati ed eventuali fallimenti si vedono aprendo il file ris.txt - I valori sono sensibili al caso (maiuscolo/minuscolo) mentre i comandi sql no. Ora la banca dati contiene tabelle anche se vuote. Ripetendo il comando del punto 8.5.2, ora anche come utente "manut" si possono vedere le tabelle contenute in bd: mysqlshow -u manut -p prova Viene mostrata la lista delle tabelle che compongono il database (in questo caso ancora vuota) Database: prova +--------+ | Tables | +--------+ | tab1 | +--------+ ITIS “O.Belluzzi” – Laboratorio di Sistemi 7-10 Lezioni di web attivo 8. Amministrazione di MySQL Rieseguendo il comando con la banca dati e la tabella come parametro si ottengono ulteriori dettagli su quella tabella : mysqlshow -u <utente> -p <nomebancadati> <nometabella> Nel caso in esempio: mysqlshow -u manut -p prova tab1 Viene mostrata la struttura delle tabelle che compongono il database. Database: prova Table: tab1 Rows: 0 +-------+----------+------+-----+---------+----------------+---------------------------------+ | Field | Type | Null | Key | Default | Extra | Privileges | +-------+----------+------+-----+---------+----------------+---------------------------------+ | ID | int(11) | | PRI | | auto_increment | select,insert,update,references | | Dato | char(80) | | MUL | | | select,insert,update,references | +-------+----------+------+-----+---------+----------------+---------------------------------+ 8.7 Popolazione delle tabelle La popolazione delle tabelle serve per generare alcuni dati fittizi che consentano di verificare la correttezza della struttura di db prima di procedere alla generazione delle pagine attive. Se emergono dei difetti è opportuno modificare la struttura prima di andare troppo avanti nello sviluppo. Come nel caso della creazione conviene produrre uno script da inviare allo standard input della consolle mysql mandando lo standard output ad un file di testo in modo da diagnosticare e correggere rapidamente gli inevitabili errori di progetto e digitazione. mysql -u utente -p banca_dati < file_script > file_log Gli elementi in grassetto sono parametri a cui si devono sostituire i valori attuali. Lo script è un file di testo contenente i comandi da inviare in consolle. Ad esempio (popola.sql): #cancella il contenuto della tabella DELETE FROM tab1\p\g #dimmi l'ultimo id inserito SELECT LAST_INSERT_ID()\p\g #aggiungi una riga INSERT INTO tab1 (Dato) VALUES('Pippo')\p\g SELECT LAST_INSERT_ID()\p\g INSERT INTO tab1 (Dato) VALUES('Pluto')\p\g SELECT LAST_INSERT_ID()\p\g INSERT INTO tab1 (Dato) VALUES('Topolino')\p\g SELECT LAST_INSERT_ID()\g #mostra il risultato finale SELECT * FROM tab1\p\g ITIS “O.Belluzzi” – Laboratorio di Sistemi 8-10 8. Amministrazione di MySQL Lezioni di web attivo Il comando di creazione in questo caso quindi è: mysql -u manut -p accpriv < popola.sql > ris.txt Note: - Il simbolo # indica commento da non processare - La cancellazione prima dell'inserimento serve per svuotare la tabella e rieseguire un comando che era parzialmente fallito in precedenza - La estrazione dell'ultimo ID inserito serve solo per scopo informativo - L'inserimento viene fatto specificando solo il dato perchè l'ID viene automaticamente generato dal motore e il suo valore si vede nella richiesta di LAST_INSERT_ID successiva. - I risultati ed eventuali fallimenti si vedono aprendo il file ris.txt - I valori sono sensibili al caso (maiuscolo/minuscolo) mentre i comandi sql no. Ora la banca dati contiene tabelle popolate. Si può vedere il contenuto oltre che nel file ris.txt anche dalla consolle mysql: In questo esempio: mysql -u manut -p prova In questo modo si potranno fare tutte le operazioni su prova ma anche: mysql –u nobody prova In questo modo si potranno fare select,insert,update,delete su prova In ogni caso dal prompt mysql il comando di base per verificare il successo della popolazione è: mysql> SELECT * from tab1; Viene mostrato il contenuto della tabella selezionata +----+----------+ | ID | Dato | +----+----------+ | 1 | Pippo | | 2 | Pluto | | 3 | Topolino | +----+----------+ 3 rows in set (0.00 sec) ITIS “O.Belluzzi” – Laboratorio di Sistemi 9-10 Lezioni di web attivo 8. Amministrazione di MySQL E’ anche possibile manipolare la tabella: mysql> INSERT INTO tab1 (Dato) VALUES('Minni')\p\g ripetendo la select si ottiene: +----+----------+ | ID | Dato | +----+----------+ | 1 | Pippo | | 2 | Pluto | | 3 | Topolino | | 4 | Minni | +----+----------+ 4 rows in set (0.00 sec) 8.8 Esportazione/Backup della banca dati Una banca dati può essere esportata in un file di testo mediante il comando mysqldump. Lo scopo dell’esportazione è duplice: Trasferimento della banca dati in un altro motore di banca dati. Salvataggio di backup di una copia della banca dati. L’operazione di esportazione produce un file di testo (stile unix) che contiene i comandi di cancellazione, creazione e popolazione di una banca dati. In questo modo il file può essere usato come ingresso in uno script che carichi la banca dati nello stesso motore (restore da un backup) oppure in un diverso motore (importazione) La sintassi del comando è la seguente: mysqldump –u root –p –-add-drop-table nomebancadati > filediesportazione Note: - Il comando produce l’uscita su standard output quindi per ottenere un file si deve redirezionare. - L’opzione –-add-drop-table inserisce le cancellazioni delle tabelle 8.9 Importazione della banca dati Una banca dati può essere importata da un file di testo salvato o costruito nel modo indicato nel paragrafo precedente. E’ anche possibile importare singole tabelle da un file di testo ad esempio in formato CSV mediante il comando mysqlimport mysqlimport [options] database textfile1 Opzioni: --fields-terminated-by=... --fields-enclosed-by=... --fields-optionally-enclosed-by=... --fields-escaped-by=... --lines-terminated-by=... ITIS “O.Belluzzi” – Laboratorio di Sistemi 10-10