279 lines
8.7 KiB
TeX
279 lines
8.7 KiB
TeX
|
\chapter{MySQL}
|
|||
|
~\\
|
|||
|
Lien~: \url{http://www.mysql.com/}
|
|||
|
~\\
|
|||
|
\section{Pr<EFBFBD>sentation}
|
|||
|
~\\
|
|||
|
|
|||
|
MySQL est un serveur de base de donn<6E>es relationnelles SQL (Structured Query Language) multi-thread et multi-utilisateur. MySQL est soumis <20> la licence GPL ( GNU General Public License) ou <20> une licence commerciale distribu<62>e par l'entreprise Mysql AB (fond<6E>e par les d<>veloppeurs de MySQL).\\
|
|||
|
~\\
|
|||
|
\section{Installation}
|
|||
|
|
|||
|
\subsection{<EFBFBD> partir des sources}
|
|||
|
~\\
|
|||
|
Il est bien s<>r possible de compiler MySQL <20> partir des sources. Cela permet de compiler uniquement avec les options que l'on a besoin et d'obtenir des binaires pour sa machine. On rappelle la proc<6F>dure~:\\
|
|||
|
~\\
|
|||
|
\texttt{
|
|||
|
./configure [options]\\
|
|||
|
make\\
|
|||
|
make install\\
|
|||
|
}
|
|||
|
~\\
|
|||
|
\subsection{Par paquet}
|
|||
|
~\\
|
|||
|
Dans la plupart des cas, on utilisera des paquets pour installer MySQL.\\
|
|||
|
|
|||
|
|
|||
|
\emph{Paquets principaux~:}\\
|
|||
|
~\\
|
|||
|
\textbf{mysql-common~:} fichiers communs pour MySQL\\
|
|||
|
\textbf{php5-mysql~:} module MySQL pour PHP\\
|
|||
|
~\\
|
|||
|
\emph{D<EFBFBD>pendances directes~:}\\
|
|||
|
~\\
|
|||
|
libc6 : librairies "GNU C"\\
|
|||
|
libmysqlclient10 : librairie client mysql\\
|
|||
|
zlib1g : librairies de compression gzip\\
|
|||
|
php4-common : fichiers courants pour php4\\
|
|||
|
|
|||
|
\section{Administration}
|
|||
|
|
|||
|
On note bien que les utilisateurs MySQL n'ont rien <20> voir avec des utilisateurs UNIX.
|
|||
|
~\\
|
|||
|
La premi<6D>re fois, en root, taper~:\\
|
|||
|
~\\
|
|||
|
\texttt{\# mysql}\\
|
|||
|
~\\
|
|||
|
On obtient alors un message ressemblant <20>~:
|
|||
|
\begin{verbatim}
|
|||
|
Welcome to the MySQL monitor. Commands end with ; or \g.
|
|||
|
Your MySQL connection id is 133 to server version: 3.23.49-log
|
|||
|
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
|
|||
|
mysql>
|
|||
|
\end{verbatim}
|
|||
|
~\\
|
|||
|
Vous <20>tes donc connect<63> <20> votre serveur MySQL.\\
|
|||
|
D<EFBFBD>connectez vous rapidement~:\\
|
|||
|
~\\
|
|||
|
\begin{verbatim}
|
|||
|
mysql> quit
|
|||
|
Bye
|
|||
|
\end{verbatim}
|
|||
|
~\\
|
|||
|
|
|||
|
On retrouve la main en ligne de commande.\\
|
|||
|
Il faut ABSOLUMENT mettre un mot de passe <20> root (ou bien lui supprimer les droits, voir ci-apr<70>s)~:\\
|
|||
|
|
|||
|
\texttt{\# mysqladmin password "motdepasse"}\\
|
|||
|
~\\
|
|||
|
On peut maintenant se connecter a la base mysql en root sous~:
|
|||
|
|
|||
|
\begin{verbatim}
|
|||
|
#mysql -p
|
|||
|
Enter password:*****
|
|||
|
mysql>
|
|||
|
\end{verbatim}
|
|||
|
|
|||
|
Il est conseill<6C> de cr<63>er un utilisateur MySQL nomm<6D> adminmysql avec
|
|||
|
tous les droits pour <20>viter d'utiliser root.\\
|
|||
|
La gestion des permissions des utilisateurs (en fonction de l'h<>te de
|
|||
|
connexion) se trouve donc dans la table "user" de la base mysql.
|
|||
|
|
|||
|
\begin{verbatim}
|
|||
|
| Host | char(60) binary
|
|||
|
| User | char(16) binary
|
|||
|
| Password | char(16) binary
|
|||
|
| Select_priv | enum('N','Y')
|
|||
|
| Insert_priv | enum('N','Y')
|
|||
|
| Update_priv | enum('N','Y')
|
|||
|
| Delete_priv | enum('N','Y')
|
|||
|
| Create_priv | enum('N','Y')
|
|||
|
| Drop_priv | enum('N','Y')
|
|||
|
| Reload_priv | enum('N','Y')
|
|||
|
| Shutdown_priv | enum('N','Y')
|
|||
|
| Process_priv | enum('N','Y')
|
|||
|
| File_priv | enum('N','Y')
|
|||
|
| Grant_priv | enum('N','Y')
|
|||
|
| References_priv | enum('N','Y')
|
|||
|
| Index_priv | enum('N','Y')
|
|||
|
| Alter_priv | enum('N','Y')
|
|||
|
\end{verbatim}
|
|||
|
|
|||
|
La gestion des droits des utilisateurs sur des bases de donn<6E>es est
|
|||
|
op<EFBFBD>r<EFBFBD>e dans la table db~:
|
|||
|
|
|||
|
\begin{verbatim}
|
|||
|
| Host | char(60) binary
|
|||
|
| Db | char(64) binary
|
|||
|
| User | char(16) binary
|
|||
|
| Select_priv | enum('N','Y')
|
|||
|
| Insert_priv | enum('N','Y')
|
|||
|
| Update_priv | enum('N','Y')
|
|||
|
| Delete_priv | enum('N','Y')
|
|||
|
| Create_priv | enum('N','Y')
|
|||
|
| Drop_priv | enum('N','Y')
|
|||
|
| Grant_priv | enum('N','Y')
|
|||
|
| References_priv | enum('N','Y')
|
|||
|
| Index_priv | enum('N','Y')
|
|||
|
| Alter_priv | enum('N','Y')
|
|||
|
\end{verbatim}
|
|||
|
|
|||
|
D'autres tables (host, tables\_priv, columns\_priv) permettent d'ajuster plus finement les droits...\\
|
|||
|
|
|||
|
~\\
|
|||
|
Donc pour cr<63>er un utilisateur \texttt{adminmysql} qui a tous les
|
|||
|
droits, on se connecte avec un utilisateur qui a les droits n<>cessaires
|
|||
|
~:\\
|
|||
|
\begin{verbatim}
|
|||
|
mysql> use mysql
|
|||
|
mysql> GRANT ALL PRIVILEGES ON *.* TO adminmysql@localhost
|
|||
|
-> IDENTIFIED BY 'mot2passe' WITH GRANT OPTION;}
|
|||
|
\end{verbatim}
|
|||
|
~\\
|
|||
|
|
|||
|
On v<>rifie~:
|
|||
|
\begin{verbatim}
|
|||
|
mysql> select * from user where User='adminmysql';}\\
|
|||
|
\end{verbatim}
|
|||
|
|
|||
|
~\\
|
|||
|
On pourrait m<>me ins<6E>rer des utilisateurs "manuellement"~:
|
|||
|
\begin{verbatim}
|
|||
|
INSERT INTO user VALUES ('localhost','login',password('motdepasse'),
|
|||
|
'N','N','N','N','N','N','N','N','N','N','N','N','N','N');
|
|||
|
\end{verbatim}
|
|||
|
~\\
|
|||
|
Lors d'interventions sur ces tables de gestion des droits MySQL, on pensera <20> lancer la commande~:
|
|||
|
\begin{verbatim}
|
|||
|
mysql> FLUSH PRIVILEGES;
|
|||
|
\end{verbatim}
|
|||
|
|
|||
|
Ou encore effacer des utilisateurs~:
|
|||
|
|
|||
|
\begin{verbatim}
|
|||
|
mysql> delete from user where Host='vilain';}
|
|||
|
\end{verbatim}
|
|||
|
|
|||
|
~\\
|
|||
|
On effacera les entr<74>es que l'on ne d<>sire pas dans cette table en fonction de sa politique de s<>curit<69>. On notera sous Debian la pr<70>sence d'un utilisateur \texttt{debian-sys-maint} qui sert <20> certains scripts Debian~: il ne doit pas <20>tre supprim<69>~! Au niveau s<>curit<69>, le mot de passe est g<>n<EFBFBD>r<EFBFBD> <20> l'installation (stock<63> dans \texttt{/etc/mysql/debian.cnf}) par la commande~:
|
|||
|
\begin{verbatim}
|
|||
|
perl -e 'print map{("a".."z","A".."Z",0..9)[int(rand(62))]}(1..16)'
|
|||
|
\end{verbatim}
|
|||
|
|
|||
|
~\\
|
|||
|
Notons qu'il est bien s<>r primordial d'interdire la lecture du fichier
|
|||
|
\texttt{/etc/mysql/debian.cnf} Bref, pour administrer notre base MySQL,
|
|||
|
on peut d<>sormais <20>viter de se connecter en root et faire:\\
|
|||
|
~\\
|
|||
|
\begin{verbatim}
|
|||
|
# mysql -u adminmysql -p
|
|||
|
Enter password:*****
|
|||
|
mysql>
|
|||
|
\end{verbatim}
|
|||
|
~\\
|
|||
|
Souvent la principale action <20> faire par un administreur MySQL est de cr<63>er une base de donn<6E>es et un utilisateur ayant tous les droits dessus. Ceci est assez courant pour faire une page en PHP/Mysql ou int<6E>grer un logiciel "tout fait" (forum, chat, etc.)\\
|
|||
|
Pour faire cela, nous allons donc faire en tant qu'adminmysql~:\\
|
|||
|
~\\
|
|||
|
\begin{verbatim}
|
|||
|
mysql> create database forum;
|
|||
|
mysql> grant all privileges on forum.* to moderateur@localhost
|
|||
|
mysql> identified by 'mot_de_passe_du_moderateur';
|
|||
|
\end{verbatim}
|
|||
|
~\\
|
|||
|
Pour cr<63>er un utilisateur en lecture seule sur une base donn<6E>e~:
|
|||
|
|
|||
|
\begin{verbatim}
|
|||
|
mysql> INSERT INTO user (Host,User,Password) VALUES('localhost','readprod',PASSWORD('xxx'))
|
|||
|
mysql> insert into db (Host,Db,User,Select_priv) values ('localhost','production','readprod','Y')
|
|||
|
\end{verbatim}
|
|||
|
|
|||
|
\section{Sauvegarde}
|
|||
|
~\\
|
|||
|
Il existe diverses m<>thodes de sauvegarde. On peut par exemple sauvegarder le r<>pertoire contenant les bases : /var/lib/mysql par d<>faut sous Debian. Il existe <20>galement plusieurs outils dont le plus utilis<69> est le programme \texttt{mysqldump}\footnote{\url{http://www.nexen.net/docs/mysql/annotee/mysqldump.php}}\\
|
|||
|
~\\
|
|||
|
Sauvegarde d'une base :\\
|
|||
|
\begin{verbatim}
|
|||
|
$ mysqldump --opt BASE -u mysqladmin -p > database.sql
|
|||
|
$ mysql -u mysqladmin -p BASE < database.sql
|
|||
|
\end{verbatim}
|
|||
|
Sauvegarde g<>n<EFBFBD>rale~:\\
|
|||
|
\begin{verbatim}
|
|||
|
$ mysqldump --opt --all-databases -u mysqladmin -p > all_databases.sql
|
|||
|
$ mysql -u mysqladmin -p < all\_databases.sql
|
|||
|
\end{verbatim}
|
|||
|
\textit{Lien~:}
|
|||
|
\url{http://www.nexen.net/docs/mysql/annotee/backup.php}\\
|
|||
|
~\\
|
|||
|
|
|||
|
\section{Base de programmation}
|
|||
|
~\\
|
|||
|
Voici quelques commandes SQL de base~:
|
|||
|
~\\
|
|||
|
\begin{verbatim}
|
|||
|
mysql> use essai ;
|
|||
|
\end{verbatim}
|
|||
|
-> utiliser la base de donn<6E>es essai
|
|||
|
\begin{verbatim}
|
|||
|
mysql> create table test (nom type [options],..);
|
|||
|
\end{verbatim}
|
|||
|
-> cr<63>er une table nomm<6D> test\\
|
|||
|
~\\
|
|||
|
\textbf{Exemple : }
|
|||
|
\begin{verbatim}
|
|||
|
CREATE TABLE clients_tbl (id INT not null AUTO_INCREMENT, prenom VARCHAR
|
|||
|
(50) not null , nom VARCHAR (50) not null , ne_le DATE not null ,
|
|||
|
ville VARCHAR (90) not null , enfants INT not null , PRIMARY KEY (id))
|
|||
|
\end{verbatim}
|
|||
|
\begin{verbatim}
|
|||
|
mysql> alter table test add nom type [-options];
|
|||
|
\end{verbatim}
|
|||
|
-> ajouter un champ <20> une table
|
|||
|
\begin{verbatim}
|
|||
|
mysql> alter table test drop nom;
|
|||
|
\end{verbatim}
|
|||
|
-> effacer un champ <20> une table
|
|||
|
\begin{verbatim}
|
|||
|
mysql> desc test;
|
|||
|
\end{verbatim}
|
|||
|
-> d<>crire la table test
|
|||
|
\begin{verbatim}
|
|||
|
mysql> insert into test values ('a','b',...);
|
|||
|
\end{verbatim}
|
|||
|
-> remplir la base de donn<6E>e
|
|||
|
\begin{verbatim}
|
|||
|
mysql> select * from test;
|
|||
|
\end{verbatim}
|
|||
|
-> sortir tous les champs de la table test
|
|||
|
\begin{verbatim}
|
|||
|
mysql> delete from teste where (condition)
|
|||
|
\end{verbatim}
|
|||
|
-> effacer des donn<6E>es
|
|||
|
\begin{verbatim}
|
|||
|
mysql> delete from test;
|
|||
|
\end{verbatim}
|
|||
|
-> effacer toutes les donn<6E>es de test
|
|||
|
\begin{verbatim}
|
|||
|
mysql> drop table test ;
|
|||
|
\end{verbatim}
|
|||
|
-> effacer la table test
|
|||
|
~\\
|
|||
|
\textit{Liens~:}\\
|
|||
|
\url{http://nexen.net/docs/mysql/}\\
|
|||
|
\url{http://www.mysql.com/}\\
|
|||
|
~\\
|
|||
|
|
|||
|
\section{Autres SGBD libres}
|
|||
|
~\\
|
|||
|
Il existe PostGreSQL\footnote{\url{http://www.postgresql.org/}}, moins
|
|||
|
r<EFBFBD>pandu que MySQL sur le web, mais qui propose certaines fonctionnalit<69>s
|
|||
|
plus avanc<6E>es (on le cite parfois en tant qu'alternative <20>
|
|||
|
Oracle\footnote{\url{http://www.oracle.com/}}).
|
|||
|
SQLite\footnote{\url{http://www.sqlite.org/}} est un autre syst<73>me de
|
|||
|
gestion de base donn<6E>es libre. SQLite est tr<74>s l<>ger et stocke ses bases
|
|||
|
dans des fichiers binaires, il est int<6E>ressant (plus rapide, moins
|
|||
|
lourd que les autres SGBD, etc.) pour des applications n'op<6F>rant que de
|
|||
|
simples requ<71>tes (select, insert etc.).
|
|||
|
|
|||
|
\newpage
|
|||
|
|