284 lines
8.9 KiB
TeX
284 lines
8.9 KiB
TeX
\chapter{MySQL}
|
|
~\\
|
|
Lien~: \url{http://www.mysql.com/}
|
|
~\\
|
|
\section{Présentation}
|
|
~\\
|
|
|
|
MySQL est un serveur de base de données relationnelles SQL (Structured Query Language) multi-thread et multi-utilisateur. MySQL est soumis à la licence GPL ( GNU General Public License) ou à une licence commerciale distribuée par l'entreprise Mysql AB (fondée par les développeurs de MySQL).\\
|
|
~\\
|
|
\section{Installation}
|
|
|
|
\subsection{À partir des sources}
|
|
~\\
|
|
Il est bien sûr possible de compiler MySQL à 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é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é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 à voir avec des utilisateurs UNIX.
|
|
~\\
|
|
La première fois, en root, taper~:\\
|
|
~\\
|
|
\texttt{\# mysql}\\
|
|
~\\
|
|
On obtient alors un message ressemblant à~:
|
|
\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 êtes donc connecté à votre serveur MySQL.\\
|
|
Dé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 à root (ou bien lui supprimer les droits, voir ci-aprè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é de créer un utilisateur MySQL nommé adminmysql avec
|
|
tous les droits pour é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ées est
|
|
opéré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é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é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 à 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ées que l'on ne désire pas dans cette table en fonction de sa politique de sécurité. On notera sous Debian la présence d'un utilisateur \texttt{debian-sys-maint} qui sert à certains scripts Debian~: il ne doit pas être supprimé~! Au niveau sécurité, le mot de passe est généré à l'installation (stocké 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 éviter de se connecter en root et faire:\\
|
|
~\\
|
|
\begin{verbatim}
|
|
# mysql -u adminmysql -p
|
|
Enter password:*****
|
|
mysql>
|
|
\end{verbatim}
|
|
~\\
|
|
Souvent la principale action à faire par un administreur MySQL est de créer une base de données et un utilisateur ayant tous les droits dessus. Ceci est assez courant pour faire une page en PHP/Mysql ou inté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éer un utilisateur en lecture seule sur une base donné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 également plusieurs outils dont le plus utilisé 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é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ées essai
|
|
\begin{verbatim}
|
|
mysql> create table test (nom type [options],..);
|
|
\end{verbatim}
|
|
-> créer une table nommé 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 à une table
|
|
\begin{verbatim}
|
|
mysql> alter table test drop nom;
|
|
\end{verbatim}
|
|
-> effacer un champ à 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ée
|
|
\begin{verbatim}
|
|
mysql> select * from test;
|
|
\end{verbatim}
|
|
-> sortir tous les champs de la table test
|
|
\begin{verbatim}
|
|
mysql> delete from test where (condition)
|
|
\end{verbatim}
|
|
-> effacer des données
|
|
\begin{verbatim}
|
|
mysql> delete from test;
|
|
\end{verbatim}
|
|
-> effacer toutes les donné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épandu que MySQL sur le web, mais qui propose certaines fonctionnalités
|
|
plus avancées (on le cite parfois en tant qu'alternative à
|
|
Oracle\footnote{\url{http://www.oracle.com/}}).
|
|
SQLite\footnote{\url{http://www.sqlite.org/}} est un autre système de
|
|
gestion de base données libre. SQLite est très léger et stocke ses bases
|
|
dans des fichiers binaires, il est intéressant (plus rapide, moins
|
|
lourd que les autres SGBD, etc.) pour des applications n'opérant que de
|
|
simples requêtes (select, insert etc.). \\
|
|
~\\
|
|
~\\
|
|
En conclusion, voici notre documentation avancée à propos de MySQL : \url{http://trac.evolix.net/infogerance/wiki/HowtoMySQL}
|
|
~\\
|
|
|
|
\newpage
|
|
|
|
% Replication
|