[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 607.   MySQL: gestione del DBMS

Una volta superata la fase della configurazione del servizio di MySQL; una volta compreso come utilizzare gli strumenti essenziali per interagire con questo, si può passare alla gestione del DBMS, che implica l'amministrazione delle utenze e delle basi di dati.

607.1   Controllo delle utenze e degli accessi

Il modo normale per creare un'utenza con MySQL è quello di concedere dei privilegi di accesso, attraverso l'istruzione GRANT; se poi quell'utenza esiste già, i privilegi in questione vengono solo aggiunti a quelli già esistenti. Per eliminare un'utenza, invece, non è sufficiente privarla di tutti i privilegi con l'istruzione REVOKE, perché occorre anche eliminare la tupla corrispondente all'utenza nella relazione user della base di dati mysql.

Il comportamento di MySQL è abbastanza diverso rispetto allo standard ANSI, per quanto riguarda l'identificazione delle utenze e l'attribuzione o l'eliminazione dei privilegi relativi. In particolare, è importante il fatto che MySQL distingua le utenze in base al nodo di provenienza; inoltre è possibile concedere privilegi complessivi: per una base di dati completa, o anche per tutte le basi di dati esistenti. A questo si aggiunga che è possibile fare riferimento a una relazione di una base di dati indicando esplicitamente la base di dati relativa, con la forma: base_di_dati.relazione.

Gli schemi seguenti mostrano la sintassi semplificata per l'uso delle istruzioni GRANT e REVOKE con MySQL:

GRANT privilegio [, privilegio]...
    ON {relazione|*|base_di_dati.*|*.*}
    TO utenza [IDENTIFIED BY [PASSWORD] 'parola_d'ordine']
        [, utenza [IDENTIFIED BY [PASSWORD] 'parola_d'ordine']]...
    [WITH GRANT OPTION]
REVOKE privilegio [, privilegio]...
    ON {relazione|*|base_di_dati.*|*.*}
    FROM utenza [, utenza]...

I privilegi che possono essere concessi o revocati sono espressi attraverso una parola chiave. Alcuni di questi privilegi sono descritti nell'elenco seguente:

Privilegio Descrizione
ALL [PRIVILEGES]
concede tutti i privilegi disponibili;
ALTER
consente la modifica delle relazioni;
CREATE
consente la creazione delle relazioni;
DELETE
consente la cancellazione dei dati contenuti nelle relazioni;
DROP
consente l'eliminazione delle relazioni;
INDEX
consente di creare ed eliminare degli indici;
INSERT
consente l'inserimento di dati nelle relazioni;
SELECT
consente la lettura dei dati nelle relazioni;
UPDATE
consente la modifica dei dati all'interno delle relazioni;
USAGE
serve solo a creare un utente senza privilegi;
GRANT OPTION
consente di dare ad altri i propri privilegi.

Si osservi che MySQL prevede anche privilegi «particolari», che dipendono dalle proprie specificità rispetto allo standard ANSI. In generale, si può considerare che l'utente root deve possedere tutti i privilegi, mentre possono esistere delle utenze amministrative fittizie (come nel caso di debian-sys-maint) con privilegi particolari legati alla possibilità di arrestare il funzionamento del servente MySQL.

Lo standard ANSI prevede la concessione di privilegi su relazioni singole, mentre MySQL permette di fare riferimento a basi di dati complete. Pertanto, nel modello sintattico mostrato sono apparse delle notazioni speciali:

Modello Descrizione
relazione
rappresenta una relazione singola, che può contenere anche l'indicazione della basi di dati che la contiene, nella forma base_di_dati.relazione;
*
l'asterisco rappresenta tutte le relazioni della basi di dati attiva, ma se non è stata selezionata una base di dati in precedenza, si fa riferimento a tutte le basi di dati;
base_di_dati.*
l'indicazione di una base di dati con un asterisco al posto del nome della relazione, serve a fare riferimento a tutta la base di dati nel complesso;
*.*
l'indicazione di due asterischi separati da un punto serve a fare riferimento esplicito a tutte le relazioni di tutte le basi di dati.

Quando si utilizza l'istruzione GRANT è consentito l'uso dei caratteri jolly _ e %, con il significato comune nell'ambito del linguaggio SQL. Ciò consente di fare riferimento a gruppi di relazioni e a gruppi di basi di dati, secondo la corrispondenza del modello. Tuttavia, nel caso questi simboli debbano essere usati in modo letterale, è necessario proteggerli con la barra obliqua inversa: \_ e \% (in generale, è improbabile che si dia un nome a una base di dati o a una relazione che contenga il simbolo di percentuale, ma è più probabile che si pensi invece di usare il trattino basso).

Come già accennato altre volte, l'utenza tiene conto anche della provenienza dell'accesso, secondo la forma seguente:

nominativo_utente[@nodo_di_provenienza]

Pertanto, l'indicazione del nominativo è obbligatoria, mentre si può omettere la specificazione del nodo di provenienza, se si vuole fare riferimento a qualunque origine.

Sono già stati descritti i modi in cui si può rappresentare un utente secondo il modello utente@nodo; in particolare è già stato descritto l'utilizzo dei caratteri jolly (anche se sono stati mostrati soltanto esempi con il simbolo %).

Si ricorda comunque che si possono usare i caratteri jolly soltanto nella parte che descrive i nodi di provenienza

Infine, è già stata indicata la necessità di usare gli apici singoli per delimitare separatamente il nominativo e la specificazione del nodo di provenienza quando questi nomi contengono caratteri «particolari», compresi i caratteri jolly % e _.

Si possono presentare delle ambiguità nell'individuazione dei privilegi delle utenze. Per esempio, può esistere l'utente anonimo ''@dinkel.brot.gd, l'utente tizio@'%' e l'utente tizio@dinkel.brot.gd: quando un utente accede valgono per lui i privilegi più specifici che gli si possono individuare, altrimenti, in presenza di utenze anonime, i privilegi di queste prenderebbero il sopravvento.

Come si vede dal modello sintattico dell'istruzione GRANT, è possibile specificare una parola d'ordine. Quando si concedono dei privilegi a un utente che non è ancora stato definito e non si stabilisce la parola d'ordine, l'utenza in questione rimane priva di parola d'ordine; pertanto, per accedere non deve essere fornita. Se invece l'utenza esiste già, i privilegi vengono aggiunti e la presenza di una parola d'ordine eventuale serve solo per cambiare quella preesistente. Tuttavia, è possibile cambiare una parola d'ordine anche con l'istruzione SET PASSWORD, se si tratta della propria o se si hanno i privilegi dell'amministratore:

SET PASSWORD FOR utenza = PASSWORD('parola_d'ordine')

In alternativa, è anche possibile usare il comando mysqladmin (dal sistema operativo), ma solo per cambiare la propria parola d'ordine:

mysqladmin password 'supersegreta'[Invio]

Se si utilizza l'opzione GRANT OPTION, o WITH GRANT OPTION, si permette all'utenza a cui si fa riferimento di concedere ad altri gli stessi privilegi di cui si dispone.

Come accennato, l'eliminazione di un'utenza richiede prima l'eliminazione di tutti i privilegi e quindi la cancellazione dalla relazione user della base di dati mysql.

Nel seguito vengono descritti alcuni esempi attraverso una sequenza lineare di operazioni, a cominciare dall'avvio del programma mysql per interagire con il servente.

mysql -u root -p[Invio]

Enter password: parola_d'ordine[Invio]

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6 to server version: 4.0.13-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

Si crea una base di dati nuova:

mysql> CREATE DATABASE Magazzino;[Invio]

Query OK, 1 row affected (0.26 sec)

Si crea un utente amministratore per la base di dati appena creata, che può accedere da dove vuole:

mysql> GRANT ALL ON Magazzino.* TO amministratore@'%' \
  \     IDENTIFIED BY 'segreta' WITH GRANT OPTION;
[Invio]

Query OK, 0 rows affected (0.35 sec)

Si osservi che se esiste un'utenza anonima riferita al nodo locale (utenza che verrebbe indicata come ''@localhost), se l'utente appena creato volesse accedere localmente, non verrebbe identificato come amministratore, ma solo come utente anonimo. Per risolvere il problema si potrebbe aggiungere l'utente amministratore@localhost, ma in questo caso si preferisce eliminare l'utenza anonima che interferisce e non si vuole mantenere:

mysql> REVOKE ALL ON *.* FROM ''@localhost;[Invio]

Query OK, 0 rows affected (0.15 sec)

mysql> USE mysql;[Invio]

Database changed

mysql> DELETE FROM user WHERE user = '' AND host = 'localhost';[Invio]

Query OK, 0 rows affected (0.15 sec)

Si crea un'altra utenza in grado di consultare e di modificare i dati delle relazioni che deve contenere la base di dati Magazzino; anche in questo caso si consente l'accesso da qualunque nodo:

mysql> GRANT DELETE, INSERT, SELECT, UPDATE ON Magazzino.* \
  \     TO tizio@'%' IDENTIFIED BY 'ottimo';
[Invio]

Query OK, 0 rows affected (0.05 sec)

Supponendo di avere installato MySQL nell'elaboratore dinkel.brot.dg, dovrebbero essere presenti anche le utenze ''@dinkel e root@dinkel, che si preferisce eliminare:

mysql> REVOKE ALL ON *.* FROM ''@dinkel;[Invio]

Query OK, 0 rows affected (0.15 sec)

mysql> REVOKE ALL ON *.* FROM root@dinkel;[Invio]

Query OK, 0 rows affected (0.15 sec)

mysql> USE mysql;[Invio]

Database changed

mysql> DELETE FROM user WHERE user = '' AND host = 'dinkel';[Invio]

Query OK, 0 rows affected (0.15 sec)

mysql> DELETE FROM user WHERE user = 'root' AND host = 'dinkel';[Invio]

Query OK, 0 rows affected (0.15 sec)

mysql> \q[Invio]

Bye

La documentazione di MySQL descrive anche come compiere tutte queste operazioni amministrative intervenendo esclusivamente nella base di dati mysql. Nel caso si preferisca intervenire in quel modo, è necessario concludere le operazioni di modifica o aggiornamento delle relazioni amministrative con l'istruzione FLUSH PRIVILEGES.

607.2   Amministrazioni varie attraverso il sistema operativo

In questo capitolo si è fatto riferimento più volte al programma mysqladmin a proposito della possibilità di assegnare e modificare la parola d'ordine di un utente. Questo programma ha anche altre funzionalità; in particolare consente di creare ed eliminare una base di dati e di arrestare il funzionamento del servente MySQL, senza bisogno di utilizzare istruzioni SQL. Vengono sintetizzate le sintassi da utilizzare per le varie occasioni:

Comando Descrizione
mysqladmin [-u root] [-p] [-h nodo] \
  \create database base_di_dati
crea la base di dati indicata;
mysqladmin [-u root] [-p] [-h nodo] \
  \drop database base_di_dati
elimina la base di dati indicata con tutto il suo contenuto;
mysqladmin [-u utente] [-p] [-h nodo] \
  \password parola_d'ordine
assegna o cambia la parola d'ordine per accedere;
mysqladmin [-u root] [-p] [-h nodo] shutdown
arresta il funzionamento del servente.

607.3   Ripristino della parola d'ordine dell'amministratore

Nel caso fosse necessario modificare la parola d'ordine dell'amministratore del DBMS (root), senza poter conoscere quella precedente, esiste un procedimento che è bene annotare. Per prima cosa si deve arrestare il servente, nel caso questo fosse in funzione; dovrebbe essere possibile farlo così:

/etc/init.d/mysql stop[Invio]

Successivamente si deve avviare mysqld_safe, con l'opzione --skip-grant-tables, in modo da ignorare completamente il controllo dei privilegi concessi (o negati) agli utenti del DBMS:

mysqld_safe --skip-grant-tables &[Invio]

Se il servizio si avvia regolarmente, è possibile accedere alle basi di dati senza vincoli; pertanto è possibile cambiare parola d'ordine intervenendo direttamente nella base di dati amministrativa mysql:

mysql -u root[Invio]

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 4.0.24_Debian-10-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> USE mysql;[Invio]

Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> UPDATE user SET password=password("supersegreta") \
  \     WHERE user="root";
[Invio]

Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> \q[Invio]

Bye

Un modo alternativo, ma drastico, di ripristinare l'utenza dell'amministratore senza parola d'ordine, consiste nell'eliminazione «manuale» della base di dati mysql, da ricostruire con l'aiuto di mysql_install_db. Naturalmente, in questo modo si perdono le informazioni su tutti gli altri utenti del DBMS.

607.4   Archiviazione e recupero delle basi di dati

MySQL gestisce le sue basi di dati come sottodirectory di ~mysql/, che di solito corrisponde a /var/lib/mysql/. Per esempio, la base di dati prova corrisponde alla struttura che si articola a partire da ~mysql/prova/.

Per archiviare una base di dati è sufficiente fare una copia della struttura che la riguarda; per ripristinare una base di dati è sufficiente rimpiazzare la struttura esistente con la sua copia fatta in precedenza; per duplicare una base di dati è sufficiente fare la copia della struttura di origine, utilizzando un nome differente. Per esempio, disponendo della base di dati prova, è possibile creare un'altra identica, ma con nome differente, così:

cp -dpRv ~mysql/prova ~mysql/prova2[Invio]

In base all'esempio si ottiene una seconda base di dati con il nome prova2, con lo stesso contenuto di prova.

Tuttavia, con il procedere dello sviluppo di MySQL bisogna considerare la possibilità che il formato dei file usati per descrivere le relazioni delle basi di dati cambi nel tempo. Pertanto, per archiviare una base di dati in modo abbastanza duraturo, è necessario creare un file di testo contenente comandi SQL. Si ottiene questo con il programma mysqldump:

mysqldump -u root -p prova > prova.sql[Invio]

L'esempio mostra in che modo archiviare la base di dati prova nel file prova.sql. Per fare questo, logicamente, ci si identifica in qualità di amministratore (con il nominativo root) e nell'esempio si usa l'opzione -p, per richiedere l'inserimento della parola d'ordine, supponendo che ciò sia necessario.

Per ripristinare un file ottenuto in questo modo, occorre prima creare o ricreare la base di dati; nell'esempio seguente si cancella prima la base di dati prova, quindi la si ricrea vuota:

mysql -u root -p[Invio]

Enter password: digitazione_all'oscuro[Invio]

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6 to server version: 4.0.13-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> DROP DATABASE prova;[Invio]

Query OK, 0 rows affected (0.00 sec)

mysql> CREATE DATABASE prova;[Invio]

Query OK, 1 row affected (0.00 sec)

mysql> \q[Invio]

Bye

Per recuperare la base di dati archiviata in forma di comandi SQL, dopo un controllo visivo del suo contenuto, si può procedere così:

mysql -u root -p prova < prova.sql[Invio]

Enter password: digitazione_all'oscuro[Invio]

In questo modo, si fa leggere a mysql il contenuto del file prova.sql, che dovrebbe contenere le istruzioni per la rigenerazione delle relazioni della base di dati originaria.

Si osservi che nella riga di comando di mysql appare l'indicazione della base di dati di destinazione; pertanto, si potrebbe benissimo ricreare una base di dati con un nome differente da quello che aveva nel momento dell'archiviazione in forma di comandi SQL. Di conseguenza, questa tecnica di archiviazione e recupero è anche quella più appropriata per duplicare una base di dati.

607.5   Riferimenti

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome mysql_gestione_del_dbms.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!