evoformations/support/mysql.tex

284 lines
8.9 KiB
TeX
Raw Normal View History

\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}
2014-10-14 18:38:56 +02:00
mysql> delete from test 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
2012-05-22 03:42:54 +02:00
simples requ<71>tes (select, insert etc.). \\
~\\
~\\
En conclusion, voici notre documentation avanc<6E>e <20> propos de MySQL : \url{http://trac.evolix.net/infogerance/wiki/HowtoMySQL}
~\\
\newpage
2012-05-22 03:42:54 +02:00
% Replication