Web Version
Print Version
Esercitazioni (Risposte)
Esempi di configurazioni

Sviluppare in PHP

Il corso è incentrato sulla implementazione e realizzazione di progetti Web in PHP su sistemi LAMP.

Scheda Corso

Programma- La storia di PHP
- Novità di PHP 5
- Risorse online di PHP
- Modalità di installazione
- Debugging e registro errori
- Configurazione di PHP
- Sintassi del codice PHP
- Variabili d'ambiente
- Costrutti Condizionali
- Costrutti iterativi
- Funzioni
- PHP per pagine web
- PHP come script shell
- Acquisire dati dal browser
- Interazione con il file system
- Attivare processi esterni
- PHP e interazione DBMS
- MySQL
- Interazione PHP con MySQL
- Principi di SQL
- PhpMyAdminGiorni3TargetIl corso è indirizzato a:
- Webmaster
- Programmatori orientati al web
- Operatori informatici che vogliono scoprire la realtà delle applicazioni web dinamichePrerequisitiConoscenza di base del linguaggio HTML
Conoscenza di base sulla amministrazione di un server Linux
Buona conoscenza generale dei computer e di Internet
Conoscenza di base dei principi di programmazioneObiettivo- Installare Apache+PHP+MySQL su Linux o Unix
- Utilizzare PhpMyAdmin
- Conoscere i fondamenti della programmazione PHP: variabili, cicli, oggetti, classi, strutture
- Utilizzare PHP per gestire dati di un database MySQL e generare pagine dinamicheMaterialiAi partecipanti del corso verranno forniti:
- CDROM con il software GPL usato durante il corso;
- Documentazione OpenSkills originale su cui è basato il corso;
- Accesso ad area riservata su OpenSkills;

Programma

Introduzione, installazione e configurazione ambiente LAMP

Creazione ambiente di sviluppo, installazione, configurazione e introduzione a PHP

Obiettivo:


Sintassi e programmazione di base di PHP

Iniziamo a lavorare con il linguaggio di programmazione PHP

Obiettivo:


Utilizzi di PHP (web, shell)

Utilizzare PHP in ambiente web o in shell

Obiettivo:


Usare PHP e MySQL

Installazione e interazione tra il modulo PHP di Apache e MySQL

Obiettivo:

Il modulo PHP per Apache

Principi, Installazione, configurazione.

Overview di MySQL

Breve overview sulle caratteristiche e funzionalità del database server MySQL

Installazione e configurazione di MySQL

Installazione, configurazione, gestione



Introduzione, installazione e configurazione ambiente LAMP


Sintassi e programmazione di base di PHP


Utilizzi di PHP (web, shell)


Usare PHP e MySQL


Il modulo PHP per Apache

Principi, Installazione, configurazione.

Installazione e configurazione di PHP

PHP è uno script language server side html embedded.
Viene spesso usato insieme ad Apache per il quale esiste un modulo apposito.
PHP a sua volta ha diversi moduli per gestire diverse funzionalità (interfacciamento con diversi database, supporto ldap, supporto snmp ecc).
L'installazione da pacchetto prevede l'inclusione del pacchetto base e quella di eventuali altri pacchetti per i moduli desiderati. A livello di configurazione di Apache è necessario istruire il web server di trattare le pagine php con l'apposita engine:
LoadModule php4_module libexec/libphp4.so
AddType application/x-httpd-php .php .php3
AddType application/x-httpd-php-source .phps


Per verificare se PHP funziona, ed avere molte informazioni sullo stato e la configurazione del modulo, usare la funzione phpinfo() all'interno di una pagina php e visualizzarla da un browser.

/etc/php.ini è il file di configurazione principale. Alcuni parametri possono anche essere impostati a livello di configurazione di Apache o direttamente in una pagina php.
I parametri più significativi per la gestione sistemistica:
register_globals = Off - I valori passati via GET/POST non sono direttamente associati a variabili con nomi arbitrari per migliorare la sicurezza. In php 3 questo parametro era impostato a ON e molto codice PHP non recente si aspetta che lo sia.
output_buffering = Off - Se impostato a ON la pagina viene servita dal server web solo quando tutto il codice PHP interno è stato eseguito.
safe_mode = Off - Permette di impostare, se attivato, permessi molto più stringenti su cosa possono fare le pagine php sul file system locale.
max_execution_time = 30 - Trempo massimo di esecuzione, in secondi, di una pagina/script php. Da aumentare se necessario.
memory_limit = 8M - Memoria massima utilizzata da una pagina/script php.
post_max_size = 8M -  Dimensione massima dei file che possono essere postati su una pagina php.
display_errors = On - Visualizza gli errori sulle pagine php (su siti in produzione è meglio evitarlo).
log_errors = On - Abilita il logging di errori su un file di log (tipo /var/log/php.log)
error_reporting = E_ALL & E_NOTICE - Gestione del livello di logging.
magic_quotes_gpc = On - Caratteri speciali com ' e "" presenti in stringhe passate in una query SQL vengono automaticamente "quotati".
file_uploads = On - Abilita la possibilità di uploadare file.
upload_max_filesize = 2M - Dimensione massima dei file uploadabili. Può essere necessario aumentarla.

Installazione e compilazione di PHP

Autore: maxgrante - Ultimo Aggiornamento: 2002-11-25 22:16:10 - Data di creazione: 2002-11-25 22:16:10
Tipo Infobox: DESCRIPTION - Skill: 3- INTERMEDIATE

Per poter procedere con l'installazione del modulo di PHP per Apache prima di tutto bisogna procurarsi dal sito ufficiale www.php.net l'ultima versione stabile di PHP.

Il passo successivo consiste nell'estrarre e scompattare l'archivio tar.gz appena scaricato.
Successivamente bisogna compilare PHP secondo le proprie esigenze e in base ai supporti desiderati.

Un esempio di compilazione standard può essere il seguente:
./configure --with-mysql --with-apxs=/usr/local/apache/bin --with-config-file-path=/usr/local/apache/conf
In sostanza dopo essersi posizionati nella cartella contenente l'archivio PHP scompattato si richiama il comando ./configure a cui vengono aggiunte le opzioni apxs=... in pratica viene detto a PHP dove risiede il binario apxs (cioè nella cartella bin di apache), --with-mysql ovvero viene compilato PHP con il supporto per il database server mySQL e dove risiedono i files di configurazione di Apache. Ovviamente è facile intuire che se si desidera utilizzare altre opzioni basta compilare i sorgenti con l'aggiunta dell'opzione desiderata (es. --with-imap per il supporto imap di php).
In seguito bisogna procedere con il make e il make install per completare l'installazione.

A questo punto dobbiamo "dire" ad Apache quali file deve parsare con il compilatore PHP, in pratica basta aggiungere in httpd.conf il seguente codice:
# Dynamic Shared Object (DSO) Support
LoadModule php4_module libexec/libphp4.so
AddModule mod_php4.c
AddType application/x-httpd-php .php .php3
AddType application/x-httpd-php-source .phps


Ultimi due passi da compiere sono la copia di php.ini-dist come php.ini nella directory conf di Apache e il riavvio del servizio web.

Installazione di PHP tramite rpm

Autore: maxgrante - Ultimo Aggiornamento: 2005-06-11 12:02:58 - Data di creazione: 2002-11-25 22:13:16
Tipo Infobox: DESCRIPTION - Skill: 2- JUNIOR

L'alternativa per l'installazione del modulo di PHP su server web Apache è fornito dagli RPM, questa è una soluzione che comporta il vantaggio di una installazione più semplice a fronte di una minore possibilità di configurazione e customizzazione dell'installazione del modulo.
E' adatta a chi ha poca esperienza e soprattutto per chi ha fretta di preparare un server di test in breve tempo.

La prima cosa da fare è reperire sul web il pacchetto RPM desiderato, ad es. php-4.1.2-7.i386.rpm.
Successivamente non ci resta che installare PHP con il seguente comando:
rpm -iv php-4.1.2-7.i386.rpm
Riavviare apache dopo aver aggiunto le seguenti righe al file di configurazione di Apache httpd.conf (versione 1.3):
# Dynamic Shared Object (DSO) Support
LoadModule php4_module libexec/libphp4.so
AddModule mod_php4.c

AddType application/x-httpd-php .php .php3
AddType application/x-httpd-php-source .phps

PHP.INI - register_global disattivato

Autore: maxgrante - Ultimo Aggiornamento: 2003-03-07 00:29:40 - Data di creazione: 2003-03-07 00:29:40
Tipo Infobox: TIPS - Skill: 3- INTERMEDIATE

Dalla versione 4.2.0 gli sviluppatori di PHP hanno deciso di rivoluzionare la gestione delle variabili provenienti dall'utente e hanno deciso di impostare nel file di configurazione php.ini la variabile register_global = Off di default non permettendo più  il comodissimo ma insicuro sistema di assegnazione automatica ad una variabile del suo valore passato dall'esterno.

La comodità stava nel fatto che se passavo ad uno script “pippo.php?io=max” avevo direttamente disponibile la variabile $io che assumeva il valore “max”. Questo sistema era decisamente molto comodo e facilitava il compito del programmatore ma creava dei problemi di sicurezza per chè anche se nel php.ini era presente la configurazione variables_order che impostava la priorità con cui dovevano essere gestite le assegnazioni di una variabile da una GET, POST, COOKIE o SESSION c'era l'inconveniente che se un programmatore prevedeva un controllo su una variabile $control e un utente smaliziato passava allo script tramite GET control=qualcosa il controllo del programmatore veniva eluso e di conseguenza si apriva una falla gigantesca nell'applicazione.

Il problema è che tutte o quasi le applicazioni realizzate prima della versione 4.2.0 sono state sviluppate con l'impostazione delle variabili globali impostata ad On e per questa ragione chiunque offra hosting a webmaster esterni sarà costretto a mantenere questa configurazione per non compremettere la funzionalità delle applicazioni presenti sul proprio server web.
Comunque sia d'ora in avanti chi svilupperà software in PHP per mantenere una portabilità ed una longevità nonchè sicurezza intrinseca dovrà cercare di sviluppare considerando che register_global sia uguale ad Off perchè prima o poi gli sviluppatori di PHP forzeranno con una versione nuova gli hoster ad utilizzare la nuova configurazione.

Test installazione PHP

Autore: homer - Ultimo Aggiornamento: 2005-06-11 12:05:10 - Data di creazione: 2004-02-22 16:30:04
Tipo Infobox: TIPS - Skill: 2- JUNIOR

Una volta installato il modulo per il linguaggio PHP su un Web Server è possibile testarne il funzionamento scrivendo una semplice pagina web.

La pagina da creare è composta da un file con estensione .php, per esempio phpinfo.php, da inserire nella DocumentRoot del Web Server, la quale deve contenere al suo interno la chiamata a phpinfo(). Questa funzione restituisce in output tutta una serie di valori riguardanti l'installazione del motore PHP sul proprio server. Informazioni che vanno dai parametri di compilazione, alle variabili d'ambiente ed il sistema operativo del server, fino alla licenza del linguaggio.
<HTML>  <HEAD> <TITLE>Test PHP</TITLE> </HEAD>
<BODY>
<?php phpinfo(); ?>
</BODY> </HTML>


Per motivi di sicurezza è comunque opportuno, se questa pagina viene lasciata ai fini di test sul Web Server, assegnarle un nome non ovvio, e mantenerla in una posizione protetta in quanto potrebbe rivelare informazioni determinanti ai fini di un eventuale attacco.

php.ini

Autore: maxgrante - ( Revisione: maxgrante ) - Ultimo Aggiornamento: 2002-10-24 10:07:26 - Data di creazione: 2002-10-24 10:07:26
Tipo Infobox: PATH - Skill: 3- INTERMEDIATE

Per l'analisi delle configurazioni principali di php.ini prendiamo in esame il php.ini-dist che presenta un tipo di configurazione meno esasperata e più user friendly nonchè oggettivamente più utile per la programmazione.

Cominciamo con il dire che php.ini gestisce tutte le configurazioni possibili (eccezion fatta per le modalità di installazione e compilazione).
I settaggi che metterò negli esempi sono quelli di default
La logica è davvero molto semplice, in pratica corrisponde a questo esempio:
settaggio = value

Permette l'utilizzo dei tag abbreviati
short_open_tags = On
Permette l'utilizzo di tag ASP
asp_tags = Off
Il numero di cifre significative nei numeri a virgola mobile
precision = 12
Forza la compatibilità con l'anno 2000 (crea problemi con non-compliant browser)
y2k_compliance = Off
Abilitazione del buffering dell'output. Settando "On" questa configurazione permetterete a PHP di inviare la pagina al browser solo al termine dell'esecuzione di tutti gli script e tutte le varie funzioni di echo o print venrranno immagazzinate nel buffer. Questo ha il vantaggio di permettere l'invio di header lines anche dopo l'invio del body. Inoltre nel caso che nella maggioranza delle pagine ci sia commistione di html tradizionale e html generato da php attraverso echo() o print().
Oppure qualora si senta l'esigenza di comprimere l'output per velocizzare lo scaricamento delle pagine (attivando nel php.ini sia il buffering che la compressione). Lo svantaggio principale è di rallentare l'esecuzione del codice PHP nel caso che lo script non sfruttati appieno queste opportunità.
Nel caso che il server fornisca hosting a diversi clienti è preferibile lasciare queste opzioni disabilitate e lasciare la libertà ai programmatori di sfruttare il buffering con le funzioni ob_start etc...
output_buffering = Off
Puoi redirezionare l'output degli scripts verso una funzione. Ad esempio impostando output_handler a ob_gzhandler, l'output verrà trasparentemente compresso per i browser che supportano gzip o browser che scompattano il codice.
output_handler =
Rende trasparente la compressione tramite le librerie gzip. Le impostazioni valide sono 'Off' 'On' o specificando il buffer size da utilizzare per la compressione (default = 4 Kbyte)

Importante: se si imposta questa configurazione ad 'On' output_handler DEVE essere settata 'On'
zlib.output_compressed = Off
Implicit flush è una opzion che deve essere settata Off, al massimo deve essere utilizzata solamente in fase di debugging in quanto ha gravi conseguenze sulle performance
implicit_flush = Off
Impostando "on" si forza a passare per reference gli argomenti quando viene chiamata la funzione. Questo metodo è deprecato (anche se di default è settato On) e viene consigliato di sistemare gli script per funzionare anche se questa configurazione è settata ad "on" in quanto in futuro verrà cancellata.
allow_call_time_pass_reference = On
Safe mode effettua un rigido controllo sugli utenti che "girano" nello spazio web in cui vengono eseguiti script php.
Normalmente tutti gli script ereditano i permessi di Apache (che con certe configurazioni del server possono rivelarsi troppo ampi), invece dal momento in cui viene attivato safe_mode, gli script agiranno strettamente con i permessi dell'utente che li ha uplodati (cioè, in uno spazio in hosting, l'utente ftp), quindi, ad esempio, non potranno andare a leggere un file creato con php nello spazio WEb di un altro utente (revisionato da Fabio Heller)
safe_mode = Off
Di default safe mode quando viene aperto un file fa un UID compare. Se vuoi "rilassare" il tuo script ad un GID compare bisogna impostare la seguente impostazione ad "On"
safe_mode_gid = Off
Quando il safe mode è impostato su "On" il controllo UID/GID è bypassato quando viene incluso un file da quella directory e dalle sue sottodirectory
safe_mode_include_dir =
Se si imposta "On" dice a PHP di dichiararsi presente sul server
expose_php = On
Limiti risorse:
Tempo massimo di esecuzione di uno script PHP
max_execution_time = 30
Massima quantità di memoria che uno script PHP può occupare per la sua esecuzione
memory_limit = 8M
Gestione degli errori (per maggiori dettagli in php.ini vengono spiegati i vari livelli di visualizzazione degli errori)
Questa configurazione mostra tutti gli errori eccetto le notifiche
error_reporting = E_ALL & E_NOTICE
Visualizzazione errori come parte dell'output della pagina. Questa opzione deve essere impostata "On" SOLO per siti in sviluppo, per server in produzione è vivamente consigliato di spegnere questa configurazione e di utilizzare il logging interno di PHP (più avanti spiegato) perchè potrebbe visualizzare informazioni critiche come il path dei file
display_errors = On
Anche quando display_errors = On, gli errori occorsi durante la sequenza di startup di PHP non vengono visualizzati. E' fortemente raccomandato per server in produzione di disattivare questa funzionalità
display_startup_errors = Off
Logging degli errori in un file di log. Il team di php.net avvisa di attivare questa opzione per server in produzione
log_errors = Off
Memorizza l'ultimo errore/warning in $php_errormsg (boolean)
track_errors = Off
Disabilita l'inclusione di tag HTML negli errori
html_errors = Off
Log errors in uno specifico file (valido se log_errors = On)
error_log = filename
IMPORTANTE! la configurazione di questo parametro è molto importante perchè definisce la compatibilità con vecchie versioni di PHP in qui era impostata di default ad "On" mentre ora per motivi di sicurezza è consigliato settare ad "Off" Regiter Globals.
In breve questa funzione permette di non dover richiedere una variabile passata in un URL come GET o come POST ma di averla già disponibile.
Se register_globals = On nel caso di un url del tipo: http://www.dominio.com/pippo.php?ID=56 se nella pagina successiva printo $ID il PHP visualizzerà 56, nel caso di register globals = Off la variabile sarà disponibile solamente in $_GET["ID"] o con le vecchie variabile in $HTTP_GET_VARS["ID"] e non come $ID
register_globals = On
Questa direttiva dice a PHP di dichiarare le variabili argv&argc (quelle contanenti le informazioni GET). Se non si usano queste variabili si può spegnere questa configurazione per ottenere maggiori performance.
register_argv = On
Massima dimensione di un POST di dati che PHP accetti
post_max_size = 8M
Questa direttiva è deprecata e php.net consiglia di utilizzare l'altra variabile di ordinamento dei GET POST COOKIE spiegata precedentemente
gpc_order = "GPC"
Importante: Magic quotes
Magic quotes per variabili in ingresso GET/POST/COOKIE: Vuol dire che a tutte le variabili in incoming come GPC vengono aggiunti gli slashes. Es. ' = \' " = \"
magic_quotes_gpc = On
Magic quotes per dati runtime (Es. dati da SQL, da exec etc...)
magic_quotes_runtime = Off
Utilizza magic quotes stile sybase (escape per ' con '' anzichè \')
magic_quotes_sybase = Off

Directory dove risiedono le estensioni
extension_dir = ./
Configurazione per enablare o meno le dl() function che non funzionano correttamente su multithread server, IIS e Zeus e vengono automaticamente disabilitate in questi server
enable_dl = On

File Uploads
Impostare il permesso di HTTP upload di files
file_uploads = On
Directory dei file temporanei in fase di upload (se commentate questa configurazione verrà utilizzata quella di default del S.O.)
upload_tmp_dir
Massima dimensione di un file accettata da PHP
upload_max_filesize = 2M

File Opening
Configurazione per concedere la possibilità del trattamento con fopen di URL file
allow_url_fopen = On

Dinamic extension
Windows extensions (se commentata non viene caricata) un esempio:
extension = php_cpdf.dll

Module settings
Configurazione per attivazione dei syslog (disabilitare questa opzione permette un incremento delle performance di PHP)
define_syslog_variables = Off
Funzioni email per windows
Impostazione SMTP server
SMTP = localhost
Invio email da:
sendmail_from = [email protected]
Funzioni email per unix
Path di sendmail
;sendmail_path = (commentata di default)

Configurazioni database
SQL
sql.safe_mode
ODBC
Permette o previene connessioni persistenti
odbc.allow_persistent = ON
Controlla che la connessione persistente sia valida prima di utilizzarla
odbc.check_persistent = On
Massimo numero di connessioni persistenti (-1 equivale ad infinite)
odbc.links = -1
MYSQL
Per eventuali configurazioni del tipo mysql.allow_persistent = On valgono le spiegazioni date per ODBC e così per i database supportati. (tratterò esclusivamente i casi specifici di ogni DB).
Porta di default di mySQL. Se lasciata blank viene utilizzata la porta di default 3306
mysql.default_port =
Nome socket per connessioni locali a mySQL. Se vuota viene utilizzata quella di default
mysql.default_socket = On
Default host per mysql_connect() (non applicabile in safe mode)
mysql.default_host
Default user per mysql_connect() (non applicabile in safe mode)
mysql.default_user =
Default password per mysql_connect() (non applicabile in safe mode). E' assolutamente sconsigliabile utilizzare una password di default!!
mysql.default_password =
POSTGRESQL
Individua connessioni persistenti broken con pg_connect(). Necessita di un piccolo overhead
pgsql.auto_reset_persistent = Off
SYBASE
Error severity minimo visualizzato
sybase.min_error_severity = 10
Si forza la compatibilità con versioni vecchie di PHP (3.0) in caso di settaggio ad On forza PHP a assegnare tipi di risultati del tipo di quelli di sybase.
Questa compatibilità non rimarrà a lungo
sybase.compatibility_mode = Off
SYBASE-CT
Massimo numero di connessioni (persistenti e non) accettate da sybase (-1 senza limiti)
sybct.max_links = -1

N.b.Non mi dilungherò ulteriormente sui database in quanto indicativamente per tutti i database le configurazioni sono simili, ci sono altri casi eccezionali comunque descritti ampiamente in PHP.INI

SESSIONI
Handler utilizzato per lo store ed il retrieve dei dati
session.save_handler = files
Path dove vengono immagazzinati i files delle sessioni
session.save_handler = /tmp
Se usare i cookies
session.use_cookies = 1
Nome della sessione (usato come cookie name)
session.name = PHPSESSID
Inizializzazione sessioni alla richiesta di startup
session.auto_start = 0
Tempo di vita del cookie (se 0 finchè il browser non viene restartato)
session.cookie_lifetime = 0
Path per il quale il cookie è valido
session.cookie_path = /
Handler utilizzato per la serializzazione dei dati (lo standard è PHP)
session.serialize_handler = php
Percentuale di possibilità che la "Garbage Collection" venga iniziata quando la sessione viene inizializzata
session.gc_probability = 1
Importante: Numero di secondi dopo il quale la sessione viene considerata scaduta (importante in caso di carrelli della spesa)
session.gc_maxlifetime = 1440
Controlla l'HTTP referer per la validazione di stored URL che contengono l'ids
session.referer_check =
Quanti bytes vengono letti dal file
session.entropy_lenght = 0
Specifica dove creare il session ID
session.entropy_file =
Setta il no cache
session.cache_limiter = nocache
Tempo di espirazione del documeto in N minuti
session.cache_expire = 180
E' molto rischioso abilitare il trans sid perchè permette di accedere ad una sessione tramite vecchi bookmarks o url stored e perchè l'utente può inviare l'URL contenente la sessione via mail, irc etc...
sessione.use_trans_sid = 0

E con questa ultima spiegazione ho terminato di trattare le configurazioni principali di php.ini
Esempio di configurazione per un sito in produzione (da prendere con le molle e da customizzare in base alle proprie esigenze) PHP.INI


Overview di MySQL

Breve overview sulle caratteristiche e funzionalità del database server MySQL

Limiti di MySQL

Autore: mario-online - Ultimo Aggiornamento: 2005-06-11 13:44:02 - Data di creazione: 2004-08-27 15:11:45
Tipo Infobox: DESCRIPTION - Skill: 2- JUNIOR

Dopo aver affrontato gli aspetti favoreli di mySQL è giusto parlare anche dei limiti che mySQL ha in questo momento, parlo di “questo” momento perchè nei piani di sviluppo della mySQL AB è in previsione l'uscita delle versioni 4.1.x e 5.0.x che copriranno completamente o almeno in grande quantità il gap di features che attualmente ha mySQL nei confronti dei database server considerati di livello Enterprise (Es. Oracle, Informix ecc...).
Alcune delle limitazioni principali sono elencate di seguito:

Integrità referenziale:
Questa era senza dubbio la mancanza principale di mySQL rispetto ad altri database (tra cui anche Access) che però è stata sopperita mediante l'implementazione delle tabelle INNODB (seguiranno approfondimenti) che supportano le chiavi esterne.
Ve ne parlo perchè ritengo personalmente che il supporto ad INNODB (tipo di tabella che studieremo tra poco) sia ancora abbastanza instabile sia dal punto di vista delle performance che si ottengono utilizzando questi tipi di tabelle, sia per l'impossibilità ad utilizzare gli indici FULLTEXT (tipo di indice, seguiranno approfondimenti).

In sostanza prima dell'introduzione di questi tipi di tabelle l'utilizzo e il mantenimento delle chiavi esterne era affidato esclusivamente allo sviluppatore e di conseguenza il relazionamento tra le tabelle era garantito a livello logico e di implementazione dell'applicazione.

ESEMPIO PRATICO:

TABELLA PERSONA
IDpersona                              Nome                                          Cognome
1                                                Massimo                                      Caselli
2                                                Paolo                                            Pippo

TABELLA TELEFONO
IDtelefono                               IDpersona                                   Telefono
1                                                   1                                                  039/393030
2                                                   2                                                  039/393930

Supponiamo di eliminare il record numero 1 della tabella PERSONA, con mySQL senza utilizzo di INNODB bisogna provvedere, lato applicazione,ad eliminare dalla tabella TELEFONO anche il record in cui Idpersona vale 1.
In caso contrario si avrebbe nella tabella TELEFONO un record “orfano” della propria relazione con la tabella PERSONA.

Transazioni:
Quando si lavora con i database relazionali ci si trova in alcune situazioni a dover eseguire una serie di query di inserimento su diverse tabelle del database server, prendiamo come esempio l'aggiunta di una persona e di un numero di telefono alla nostra semplice rubrica dei contatti.
In questo caso dovremo eseguire queste operazioni:
- Inserimento nella tabella PERSONA
- Recupero dell'ID del nuovo record inserito in PERSONA
- Inserimento del numero di telefono precedentemente immesso da applicazione, con relativa associazione all'ID della persona appena aggiunta
Se durante uno di questi passaggi il DB andasse in crash, rischieremmo di avere nel database una nuova persona senza un numero di telefono associato.
Per ovviare a queste problematiche alcuni DB server gestiscono i gruppi di comandi SQL tramite transazioni, in sostanza l'inserimento reale dei dati avviene SOLO se tutte le istruzioni sono state eseguite correttamente.
In realtà anche questa problematica è stata risolta da mySQL con l'introduzione delle tabelle di tipo INNODB.

Stored procedures:
I server considerati di livello enterprise consentono di inserire all'interno del database stesso del codice procedurale.
Il che consente prima di tutto di semplificare il codice a livello applicativo ed in seconda battuta di migliorare le performance in quanto il DB server gestisce al meglio il codice da eseguire.

Introduzione a MySQL

Autore: mario-online - Ultimo Aggiornamento: 2005-06-11 13:52:03 - Data di creazione: 2004-10-01 16:05:35
Tipo Infobox: DESCRIPTION - Skill: 2- JUNIOR

MySQL dalle origini ad oggi

Il progenitore di MySQL è mSQL (miniSQL), sviluppato da Hughes Tecnology (australiana).
Nei primi anni '90 Michael "Monty" Widenius, uno sviluppatore svedese della società TcX utilizza la versione 1.x di mSQL
che però non supportava gli indici, decide quindi di aggiungere delle funzionalità ralizzando nel 1995 MySQL 1.0
(my deriva dal fatto che la moglie si chiamava My e che le tabelle utilizzavano my come suffisso).

MySQL AB è una società virtuale (decine di paesi comunicazioni via internet) svedese con David Axmark e Allan Larsson.
Vogliono promuovere la filosofia Open Source e nel 2000 utilizzano la GPL (Gnu Public License) per MySQL

MySQL è classificabile come un "database relazionale" permettendo la conservazione dei dati in tabelle separate piuttosto che in una unica grande entità. Questo, oltre ad aggiungere flessibilità e velocità nell'accesso ai dati, permette una più efficace modellazione delle basi di dati.
Il sistema si presenta con una struttura client/server, dove il server SQL, scritto in C e C++, utilizza una architettura multithread e offre una completa raccolta di API (Application Programming Interfaces) utilizzabili sia tramite i client forniti nella distribuzione sia da applicazioni scritte in una notevole varietà di linguaggi: C, C++, Eiffel, Java, Perl, PHP, Python, Ruby e TCL.
Il fatto di essere Open Source ha inoltre favorito lo sviluppo di interfacce, rilasciate ovviamente sotto GPL, in pressoché tutti i linguaggi maggiormente utilizzati, soprattutto nello sviluppo di applicazioni web ma non solo: in PHP ad esempio viene fornita in modo nativo al linguaggio la connettività al database server, in Perl la connessione è possibile grazie ai moduli DBI e DBD::MySql, utilizzando MySQL Connector/ODBC (MyODBC) è possibile connettersi al database utilizzando applicazioni come ad esempio Microsoft Access, Microsoft Excel o linguaggi di programmazione come Delphi Borland o ASP e Visual Basic, viene inoltre fornito supporto ai client Java, sia in ambiente Windows che Unix, tramite l'interfaccia Connector/JDBC.
L'accesso ai dati è reso possibile dall'utilizzo di SQL (Structured Query Language), in particolare viene garantito il supporto alla versione corrente dello standard definito nel ANSI/ISO SQL Standard.

Punti di forza di mySQL

Autore: mario-online - Ultimo Aggiornamento: 2005-06-11 13:52:24 - Data di creazione: 2004-08-27 15:11:15
Tipo Infobox: DESCRIPTION - Skill: 2- JUNIOR

Opensource e gratuito:
Il database server mySQL è rilasciato dalla società che lo sviluppa, la mySQL AB, prima di tutto secondo la filosofia dell'Opensource, in secondo luogo in forma gratuita (Supporto tecnico a parte).
I vantaggi di avvalersi di prodotti Opensource sono molteplici, di seguito ne elencherò alcuni:
- Rilascio del codice sorgente:
    - In questo modo si ha la garanzia che il software sia controllato e testato dall'intera  
      comunità Opensource e non solo dagli sviluppatori e debugger.
      Un altro aspetto positivo è che se un giorno la mySQL AB fallisse o semplicemente      
      interrompesse lo sviluppo del prodotto questo molto probabilmente sarebbe    
      sviluppato direttamente dalla comunità Opensource.
- Gratis:
    - Un'altro enorme vantaggio è il rilascio di mySQL a costo 0$
- Continui miglioramenti e features:
    -  Grazie al supporto della comunità la società che mantiene lo sviluppo di mySQL è  
       in grado di rilasciare nuove versioni con una velocità davvero impressionante,  
       queste nuove versioni solitamente contengono bug fix, nuove features, migliorie    
       ecc...


Installazione e configurazione di MySQL

Installazione, configurazione, gestione

Amministrazione di MySQL

L'installazione di MySQL comprende generalmente l'uso di diversi pacchetti (o compilazione delle relative componenti):
mysql-server - Il server vero e proprio
mysql-client - Il client a riga di comando
mysql-devel - Librerie. Da installare solo se si devono compilare software che si appoggiano a MySQL

Il file di configurazione è /etc/my.cnf.
Il comandi fondamentali sono:
mysqld - Il server MySQL
mysql - Il client a riga di comando. Per usarlo bisogna conoscere i principi di SQL.
mysqladmin - Tool di gestione e amministrazione del sistema
mysqldump - mysqlhotcopy - Strumenti per il backup di un database

La gestione dei permessi sui database di MySQL è fondamentale.
Di default esiste l'utente root senza password che da localhost può gestire completamente MySQL. Notare che questo utente NON è l'utente root di sistema, le sue credenziali, come quelle di tutti gli altri utenti di MySQL, sono presente nel database predefinito mysql.
In termini di gestione delle password e degli accessi si consiglia:
- Impostare una password per l'utnete root.
- Impostare login/password diverse per ogni applicativo o sito web che lavora su un singolo database, in modo che questo utente possa lavorare solo su quello specifico db.
- Se da applicativo o interfaccia web si devono solo interrogare dati, bastano i permessi di SELECT, se si devono poterli modificare, dovrebbero bastare permessi di SELECT, UPDATE, INSERT, DELETE. Gli altri permessi servono per modificare la struttura di un database, impostare indici, impostare permessi ecc. e generalmente non è necessario attivarli, salvo quando l'applicazione lo richieda esplicitamente.
- La porta su cui ascolta MySQL (TCP 3306) non dovrebbe mai essere esposta ad Internet, è sufficiente che sia accessibile dall'host su cui gira l'applicativo che usa il DB server (esempio un server web con pagine php).

Esistono diversi metodi per eseguire il baclup dei dati di un database.
Se questi non sono troppi, uno dei più comodi è usare mysqldump:
mysqldump --all-database > backup.sql -u root -p
Il file backup.sql contiene tutte le query necessarie per ristabilire un database:
mysql < backup.sql -u root -p

E' possibile abilitare interessanti funzioni di logging operando su /etc/mycnf:
log=/var/log/mysql/mysqld.log - Log generale
log-error=/var/log/mysql/mysqld-error.log - Errori
log-slow-queries=/var/log/mysql/mysqld-slow.log - Query lente

Installazione di MySQL

Autore: homer - Ultimo Aggiornamento: 2004-01-06 11:39:19 - Data di creazione: 2004-01-06 11:39:19
Tipo Infobox: DESCRIPTION - Skill: 3- INTERMEDIATE

Installazione di MySQL tramite RPM e compilazione dei sorgenti.

E' possibile effettuare il download di MySQL, sia in formato RPM che in formato sorgente disponibile per diverse piattaforme, presso il sito del produttore www.mysql.com oppure tramite uno dei suo mirror.

INSTALLAZIONE TRAMITE COMPILAZIONE DEI SORGENTI  
L'installazione di MySql tramite sorgenti consiste nell'effettuare i tre classici step configure, make e make install. Prima di procedere è necessario creare l'utente ed il relativo gruppo che verrà utilizzato per fare girare il server:  
root@Joker:/software# groupadd mysql  
Creazione del gruppo  
root@Joker:/software# useradd -g mysql mysql
  
Creazione dell'utente  

SCOMPATTAZIONE  
Per prima cosa si procede alla scompattazione dei sorgenti:  
root@Joker:/software# tar -xzvf mysql-4.0.15a.tar.gz  
mysql-4.0.15a/  
mysql-4.0.15a/bdb/  
mysql-4.0.15a/bdb/db/  
mysql-4.0.15a/bdb/db/db_upg.c  
[...]


CONFIGURAZIONE
Una volta scompattati i sorgenti è possibile configurare le opzioni di installazione tramite lo script configure:  
root@Joker:/software# cd mysql-4.0.15a  
root@Joker:/software/mysql-4.0.15a# ./configure --help
  
Tramite l'opzione help è possibile visualizzare quali sono le opzioni disponibili per personalizzare al meglio l'installazione del server   
root@Joker:/software/mysql-4.0.15a# ./configure --prefix=/usr/bin  
checking build system type... i586-pc-linux  
checking host system type... i586-pc-linux
  
In questo caso viene indicato di utilizzare il percorso /usr/bin per installare gli eseguibili del server

COMPILAZIONE  
Una volta eseguita la configurazione è necessario compilare i sorgenti:  
root@Joker:/software/mysql-4.0.15a# make  
cd libmysql; make link_sources  
make[1]: Entering directory `/software/mysql-4.0.15a/libmysql'  
[...]  


INSTALLAZIONE  
L'ultimo passo da compiere è infine l'installazione:  
root@Joker:/software/mysql-4.0.15a# make install   

Una volta installato il software si devono creare le tabelle di grant, contententi i permessi per gli utenti che devono accedere al MySql:  
root@Joker:/# mysql_install_db  
Preparing host table  
Preparing user table  
Preparing func table  
Preparing tables_priv table  
Preparing columns_priv table  
Installing all prepared tables  


INSTALLAZIONE TRAMITE RPM
I pacchetti disponibili per il download e l'installazione sono diversi, ma quelli strettamente necessari all'installazione di un server sono sostanzialmente due: il server vero e proprio ed un client per la gestione di MySQL da command line.

Per evitare problemi di dipendenze, si procede prima con l'installazione del software client:  
[root@vagante software]# rpm -ivh MySQL-client-4.0.17-0.i386.rpm  
Preparing... ########################################### [100%]    
1:MySQL-client         ########################################### [100%]

Installazione del client

Successivamene si prosegue con l'installazione del server:  
[root@vagante software]# rpm -ivh
MySQL-server-4.0.17-0.i386.rpm
  Preparing...                
########################################### [100%]     1:MySQL-server        
  ########################################### [100%]  Preparing db table  
Preparing host table  
Preparing user table  
Preparing func table  
Preparing tables_priv table  
Preparing columns_priv table  
Installing all prepared tables  
Vengono inizializzate le tabelle di GRANT (quelle riguardanti i permessi di accesso ai database) e creato l'utente amministratore di MySQL. NOTA: L'installazione tramite RPM a partire dalla versione 4 di MySQL esegue questa operazione automaticamente. Installando la versione 3.23 e' ancora necessario eseguirla manualmente.

031224 20:26:35  /usr/sbin/mysqld: Shutdown Complete  

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !  
This is done with:  
/usr/bin/mysqladmin -u root password 'new-password'  
/usr/bin/mysqladmin -u root -h vagante password 'new-password'  
See the manual for more instructions.  
Ci viene ricordato di assegnare una password all'utente di root di MySQL  
Please report any problems with the /usr/bin/mysqlbug script!

The latest information about MySQL is available on the web at http://www.mysql.com  
Support MySQL by buying support/licenses at https://order.mysql.com
  

Durante l'installazione viene creata anche la directory dati di MySQL /var/lib/mysql, la quale deve essere di proprietà dell'account utente utilizzato per far girare il server. E' buona norma che solo questo utente abbia l'accesso a questa directory e che i relativi permessi siano settati a 700 al fine di evitare possibili problemi di sicurezza.

CONFIGURAZIONE POST INSTALLAZIONE
Una volta avviato il server tramite /etc/rc.d/init.d/mysql start oppure tramite l'utilty service, se presente, con service mysql start è necessario collegarsi ad esso per assegnare una password all'utente root. L'utente root di MySQL ha i diritti per amministrare ogni componente del server, e di default viene creato senza password.  

E' possibile settare la password di root grazie al tool mysqladmin:  
[root@vagante software]# mysqladmin -u root password db3mendo

E' possibile utilizzare anche un secondo metodo per assegnare la password di root del server:  [root@vagante software]# mysql -u root  
Welcome to the MySQL monitor.  Commands end with ; or \g.  
Your MySQL connection id is 6 to server version: 4.0.17-standard  
                                                                              
                                                Type 'help;' or '\h' for help.
Type '\c' to clear the buffer.  
                                          
                                                                                
  mysql> set PASSWORD FOR root = PASSWORD("db3mendo");  
  Query
OK, 0 rows affected (0.00 sec)  
                                          
                                                                                
  mysql>
  
In questo secondo modo, si comunica in modo interattivo con MySQL tramite una console appositamente creata

Una volta terminata la configurazione post installazione non resta settare a seconda del sistema la modalita' di avvio del server.

MySQL Root Password Recovery

Autore: franz - Ultimo Aggiornamento: 2005-06-11 13:43:27 - Data di creazione: 2004-06-09 12:56:05
Tipo Infobox: TIPS - Skill: 3- INTERMEDIATE

Seguono le istruzioni per resettare una password di root di mysql:
# stoppare mysqld
#killall mysqld

# lanciare mysqld con l'opzione skip-grant-tables, che evita di caricare le tabelle di sistema (tra cui anche quella degli accessi) fornendo libero accesso al servizio mysqld
# /usr/libexec/mysqld -Sg --user=root &

/usr/libexec/mysqld: ready for connections

# entrare in modalità client
# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.23.56

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

#collegarsi al db mysql e inserire la query di update di cambio password
mysql> USE mysql
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("mianuovapassword")
    -> WHERE user="root";

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

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit

Gestione permessi su MySQL con Grant e Revoke

Autore: ken - Ultimo Aggiornamento: 2005-06-11 13:53:04 - Data di creazione: 2004-06-18 17:14:53
Tipo Infobox: DESCRIPTION - Skill: 3- INTERMEDIATE

MySQL dispone di una gestione dei permessi di accesso molto avanzata e facilmente gestibile.
In moltissimi casi chi sviluppa su mySQL non gestisce i permessi in quanto è normalmente compito del sistemista o DBA (Database Administrator), però ritengo sia fondamentale capire come funzionano i permessi su mySQL perchè questa conoscenza aiuta a individuare molto rapidamente eventuali problematiche che dovessero insorgere.

Come è facile intuire dai nomi stessi GRANT concede privilegi, REVOKE li elimina.

CONCESSIONE PERMESSI CON GRANT

Esempio di sintassi per GRANT:

GRANT  ON database.tabella/e TO user@host;

Analizzando nel dettaglio la sintassi di GRANT possiamo dire che con  intendiamo i permessi di SELECT, INSERT, UPDATE ecc... successivamente vi verrà proposta una semplice tabellina dove vengono sintetizzati tutti i tipi di permessi assegnabili agli utenti.
Dopo “ON” bisogna dire per quale database ed eventualmente quale/i tabella/e vale il GRANT che si vuole eseguire sul DB.
Se si volesse assegnare dei permessi su tutte le tabelle di un database “rubrica” il comando da eseguire sarà: ON rubrica.*
Da ciò è facile dedurre che per * si intende tutte le tabelle.

A seguito del comando TO devono essere passati al comando GRANT l'utente che si vuole creare e l'host dal quale è possibile accedere al database server.

Se si desidera assegnare ad un utente certi permessi da parte di tutti gli host possibili bisogna utilizzare il carattere jolly: %
Un'altra opzione FONDAMENTALE per rendere sicuro il database server è di assegnare anche una password per l'utente, semplicemente aggiungendo:

IDENTIFIED BY 'password';

Come regola di massima la tendenza da parte di un sistemista che amministra una base dati mySQL è quella di restringere al massimo i permessi sul proprio DB e di concedere privilegi solo in caso di reale necessità.
In fase di sviluppo normalmente un programmatore non si interessa di queste problematiche ma ciò è sbagliato perchè si rischia che quando si va in produzione ci siano dei problemi.

REVOCA DI PRIVILEGI TRAMITE REVOKE

Per rimuovere permessi precedentemente assegnati si utilizza il comando REVOKE, il quale ha la stessa identica sintassi di GRANT:

REVOKE  ON database.tabella/e TO user@host;

NOTA PER CHI VUOLE APPROFONDIRE
Questi sono i comandi base e più che sufficienti per amministrare gli accessi ad un DB mySQL tramite GRANT e REVOKE, comunque per la documentazione completa vi rimando al sito ufficiale:
http://dev.mysql.com/doc/mysql/en/GRANT.html

AUTORIZZAZIONI ASSEGNABILI CON L'ISTRUZIONE GRANT (Le principali) (da leggere)

PRIVILEGIO             DESCRIZIONE
ALL PRIVILEGES      Consente all'utente di eseguire TUTTO sulla base dati
FILE                           Importazione/Esportazione dati da un file su disco
RELOAD                    Ricaricamente tabelle di GRANT e svuotamento LOG
ALTER                       Modifica struttura delle tabelle
INDEX                        Aggiunta e rimozione di indici
SELECT                     Esecuzione query di estrazione dati
CREATE                     Consente di creare database, tabelle e indici
INSERT                      Inserimento nuovi record
DELETE                     Cancellazione record nelle tabelle
SHUTDOWN              Spegnimento servizio mySQL
PROCESS                  Consente di eseguire “processlist” e “kill” per la gestione dei  
                                   thread del server
USAGE                      Sinonimo di INSERT, UPDATE e DELETE
UPDATE                    Aggiornamento dati nel DB
DROP                        Possibilità di eliminazione fisica di tabelle o database



Quando si amministrano i permessi bisogna stare particolarmente attenti a diversi privilegi che devono essere lasciati esclusivamente all'utente amministratore ROOT o ad altri power user assolutamente fidati. I privilegi in questione sono i seguenti:

PERMESSI PERICOLOSI DA ASSEGNARE AD UTENTI NON FIDATI (da leggere con attenzione)

PRIVILEGIO          PERICOLO
FILE                        Consente all'utente di leggere qualunque file leggibile da    
                                qualunque parte del mondo sul proprio server (compresi altri DB
                                mySQL) importando i dati in una tabella
PROCESS              Permette di trovare password e dati importanti soprattutto per la
                                sicurezza
ALTER                    Permette di rinominare tabelle e di bypassare quindi i controlli di    
                                accesso
SHUTDOWN          Consente lo spegnimento! del server

Log delle query di MySQL e recupero dati istantaneo

Autore: roberto - Ultimo Aggiornamento: 2004-03-23 22:02:56 - Data di creazione: 2004-03-23 22:02:56
Tipo Infobox: TIPS - Skill: 4- ADVANCED

E' possibile far sì che MySQL tenga traccia di tutte le query di comando eseguite su ogni database. Accoppiando questa feature con un meccanismo di backup, è possibile ripristinare un database danneggiato per riportarlo al momento presente.

Innanzitutto si prevede di effettuare un backup periodico dei databases; questo può essere eseguito da cron, garantendo così il salvataggio dei dati almeno fino all'ultimo backup.
Quando viene installato di default, MySQL prevede di eseguire un log esclusivamente delle fasi di avvio e fermata, e di eventuali errori del server. In genere, questi log vengono salvati in /var/lib/mysql/mysqld.log.
Una volta installato MySQL, si modifichi il file /etc/my.cnf come segue:
[mysqld]
datadir=/var/lib/mysql
  socket=/var/lib/mysql/mysql.sock
    
log-update=/var/log/mysql/queries
log-long-format

...

[mysql.server]
  ...  
  
[safe_mysqld]
  err-log=/var/log/mysql/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
  ...

Sono evidenziate nello script le parti da modificare. Come si vede, si è preferito far scrivere i log di MySQL su una cartella a parte, /var/log/mysql, un po' per analogia con altri server "importanti", come Samba o Apache, ma anche per il numero di logs che MySQL creerà, come vedremo tra poco.
Occorre ora creare la cartella e darle i permessi necessari:
mkdir /var/log/mysql
  chown mysql:mysql /var/log/mysql
  chmod 775 /var/log/mysql

Poichè abbiamo spostato la directory dei logs, dovremo cambiare anche il file che MySQL crea per la rotazione dei suoi log standard; la sua posizione dipende dalla distribuzione. Se MySQL è stato installato da pacchetti RPM, si troverà in /etc/logrotate.d/mysql. Basterà cambiare la riga che indica la posizione del file di log, da
  ...
/var/lib/mysql/mysqld.log {
    ....
a
...
/var/log/mysql/mysqld.log {
   ....

(N.B. magari, se avete impostato una password per l'utente root di MySQL, modificate anche la riga più oltre che esegue lo scarico dei logs, inserendovi anche la password:
  if test -n "`ps acx|grep mysqld`"; then
      /usr/bin/mysqladmin
--password=pwd_di_root flush-logs
fi

)
Ora provate a lanciare il server MySQL (o a fermalo e riavviarlo, se già attivo) ed eseguire alcune query di comando (INSERT, DELETE, UPDATE...) sui databases. Nella cartella /var/log/mysql si creerà un file queries.001 con un contenuto di questo genere:
  # /usr/sbin/mysqld, Version: 4.0.15-standard-log at 040301 14:17:16
  # Time: 040301 18:38:28
  # User@Host: pippo[pippo] @ localhost []
  USE dbProva;
  UPDATE Download SET IDuser=149, Descrizione="Inserimento automatico dati ", Updated="04-2-20" WHERE IDDown=7;
  # Time: 040301 18:50:59
  # User@Host: root[root] @ localhost []
  ALTER TABLE Download ADD vrs CHAR(10);
  # Time: 040301 19:02:13
  # User@Host: pippo[pippo] @ localhost []
  UPDATE Download SET IDuser=149, Descrizione="Aggiornamento database", Updated="04-2-28", vrs="1.0.5" WHERE IDDown=8;
  # Time: 040301 19:02:43
  # User@Host: rt[rt] @ localhost []
  DELETE FROM Download WHERE IDDown=7;
  .....

Ecco quindi il meccanismo di recupero fino al tempo presente: da un backup recuperate la situazione dei databases fino ad un certo momento; quindi fate eseguire a MySQL queste query per aggiungere i comandi che riportano il database fino all'ultima modifica eseguita. Per questo è  sufficiente
mysql -p < /var/log/queries.00n
dove n è il numero del log di query da eseguire.
  E' opportuno sincronizzare da cron i backups e l'aggiornamento dei log: questo può essere fatto con uno script che:  
1. Arresti il server MySQL (per impedire modifiche dagli utenti durante il backup);  
2. Esegua il backup dei dati;  
3. Rilanci il server MySQL.
In tal modo l'ultimo backup, seguito dall'esecuzione dell'ultimo log delle query, ripristinerà integralmente i databases.
C'è un'ultima cosa: ad ogni riavvio, MySQL crea un file di log queries.00n con n numero progressivo. Se non si vuole mantenere traccia di tutti questi logs (e si vuole evitare l'affollamento del disco), è bene creare una rotazione di questi. Farlo con logrotate è un po' un problema, perchè la numerazione progressiva di logrotate rischia di creare conflitto con quella di MySQL. Si può allora fare uno script in bash di questo tipo:
file /usr/bin/mysqlrotate:
  #!/bin/bash
  MYPATH="/var/log/mysql/queries"
  MAX=9

  if [ -e $MYPATH.00$MAX ]
 then
    rm $MYPATH.001
    N=2
    while [ $N -le $MAX ]
     do
       M=`expr $N - 1`
       mv $MYPATH.00$N $MYPATH.00$M
       N=`expr $N + 1`
     done
 fi

Questo script mantiene fino a 9 logs successivi; basta modificare la variabile MAX per averne di più. Poichè MySQL crea un nuovo log ad ogni riavvio, può essere opportuno inserirlo direttamente nello script di avvio di MySQL stesso, in genere /etc/init.d/mysql; basterà cercare il punto del case di start, ed aggiungere prima di ogni altra cosa la chiamata allo script di rotazione dei log:
....
  case "$mode" in
   'start')
# Start daemon

     /usr/bin/mysqlrotate
     if test -x $bindir/mysqld_safe
       then
  ...

Gestione accessi da tabelle del DB “MySQL”

Autore: ken - Ultimo Aggiornamento: 2005-06-11 13:54:50 - Data di creazione: 2004-06-18 17:26:07
Tipo Infobox: DESCRIPTION - Skill: 3- INTERMEDIATE

Ora vedremo come gestire il controllo degli accessi poichè nella gestione del server questo argomento è di fondamentale importanza.

Di seguito trovate la struttura completa delle tabelle USER e DB che sono quelle principalmente utilizzate:

DESCRIBE USER
I permessi che ci interessano sono solo quelli che abbiamo già studiato nel capitolo relativo a GRANT e REVOKE, gli altri che vedete (Es. ssl_type, ssl_cipher ecc...) sono permessi che non vengono praticamente mai associati ad altri utenti se non all'amministratore (root) e quindi di fatto li possiamo ignorare.
Come sempre si può fare riferimento al manuale ufficiale di mySQL che li descrive in modo molto dettagliato.

SICUREZZA
Per la sicurezza del proprio sistema database è fondamentale non dare MAI permessi globali (validi per tutti i database presenti sul server) ad un utente, ma assegnargli i giusti privilegi dalla tabella DB.

APPROFONDIMENTO
Analizzando bene tutte le tabelle del DB mySQL con il comando show tables; e describe table; possiamo notare come in mySQL si possa assegnare permessi precisi e limitativi utilizzando anche le tabelle “tables_priv” e “columns_priv”.
In sostanza è sufficiente negare tutti i permessi ad un utente e dargli permessi solo sulle singole tabelle o addirittura alle colonne. Sinceramente capita molto raramente di doversi avvalere di queste features di sicurezza.

MySQL: Backup e Restore

Autore: homer - Ultimo Aggiornamento: 2005-02-26 23:27:15 - Data di creazione: 2004-04-23 23:21:43
Tipo Infobox: DESCRIPTION - Skill: 3- INTERMEDIATE

Come effettuare il backup ed il restore dei database gestiti con MySQL.

BACKUP  
I principali tool messi a disposizione all'amministratore di MySQL per effettuare il backup dei propri dati sono due: mysqlhotcopy e mysqldump.

mysqlhotcopy
mysqlhotcopy è uno script, scritto in linguaggio Perl, che, basandosi sul comando cp, effettua la copia "grezza" di un database, semplicemente copiando il contenuto della relativa directory dati, in un altro luogo sullo stesso sistema. La sua caratteristica principale è la velocità.  
Esempio:  
[root@vagante /]# mysqlhotcopy arnaldoz /backup-db/

In questo esempio il contenuto del database arnaldoz presente in /var/lib/mysql/arnaldoz viene copiato nella directory /backup-db   

mysqldump
Mysqldump è un'utility che presenta alcuni vantaggi rispetto a mysqlhotcopy, ed quindi è maggiormente utilizzata. Essa genera un file ASCII contentente istruzioni SQL (CREATE TABLE, CREATE DATABASE ecc.) che permettono di ricreare completamente un database. Questo metodo permette di utilizzare lo script su qualsiasi piattaforma, ottenendo quindi una soluzione portabile. La seconda importante caratteristica è la flessibilità, modificando lo script prodotto, è possibile il ripristino anche di una sola tabella. Infine mysqldump permette di effetture il dump di un database da remoto.  
Esempi:
[root@vagante backup-db]# mysqldump arnaldoz > arnaldoz_dump_db.sql -u root -p  
Enter password: db3mendo
  
In questo caso viene eseguito il dump del database arnaldoz generando le relative instruzioni nel file arnaldo_dump_db.sql. E' necessario comunicare a mysqldump che si utilizzerà l'utente amministratore -u root con la relativa password -p  
[root@vagante backup-db]# mysqldump --database arnaldoz mysql > arnaldoz_mysql_new_db.sql -u root -p  
Enter password: db3mendo
  
Utilizzando l'opzione --database si esegue il dump dei detabase indicati, in questo caso arnaldoz e mysql   
[root@vagante backup-db]# mysqldump --all-database > arnaldoz_new_db.sql -u root -p  
Enter password: db3mendo
  
Con l'opzione --all-database viene generato lo script per la creazione di tutti i database presenti sul server  

E' importante notare che utilizzando l'opzione --database o --all-database nello script sql generato vengono incluse anche le istruzioni per creare il database (CREATE DATABASE), mentre negli altri casi, si presuppone che il database sia gia' esistente, di conseguenza viene generato uno script SQL che si occupa solamente di ricreare le tabelle.

Per effettuare la copia di un database nel modo più veloce ed affidabile possibile, è consigliato di utilizzare l'opzione di mysqldump --opt, la quale abilita automaticamente diverse altre opzioni quali --quick, --add-drop-table,--add-locks,--extended-insert, e--locktables:  
[root@vagante backup-db]# mysqldump --opt arnaldoz > arnaldoz_dump_db.sql -u root -p  
Enter password: db3mendo
  
--quick: effettua il dump direttamente sullo standard output;  
--add-drop-table: inserisce le istruzioni di eliminare le tabelle esistenti prima di ricrearle;  
--add-locks: blocca momentaneamente gli eventuali inserimenti;  
--extended-insert: utilizza un metodo per velocizzare l'inserimento dei dati;  
--lock-tables: blocca momentanteamente le tabelle in lettura;  


RESTORE  
Qualora il backup del database sia stato fatto con mysqlhotcopy, il restore avviene, dopo aver fermato il server, copiando il contenuto del file di backup nella directory dati di MySQL:  
[root@vagante /]# cp -R /backup-db/arnaldoz /var/lib/mysql

Per il restore di un database di cui si è fatto il backup con mysqldump è possibile utilizzare l'utility di console mysql.

Alcuni esempi:  
[root@vagante backup-db]# mysql < arnaldoz_dump_db.sql -u root -p  
Enter password: db3mendo
  
Come utente root, si passa a mysql in input lo script che permette di ripristinare il contenuto del database  
[root@vagante backup-db]# mysql --one-database arnaldoz < all_db_joker.sql -u root -p   
In questo caso sebbene lo script serva per ripristinare un elenco di database, tramite l'opzione --one-database viene specificato solo un database

Privacy Policy