====== Mysql ======
Doc : http://dev.mysql.com/doc/mysql/en/index.html
http://dev.mysql.com/doc/mysql/fr/index.html
FAQ : http://mysql.developpez.com/faq/
Portail PHP/MySQL : http://www.nexen.net/
Installation du serveur
***********************
# urpmi mysql
Voir les notes d'installation dans /usr/share/doc/mysql/README.urpmi
Vérifier si le service mysqld fonctionne, le lancer, l'arrêter ...
****************************************
# service mysqld status
start
restart
stop
Fichier de configuration
************************
/etc/my.cnf
Première connexion
******************
$ mysql
il n'y a aucun mot de passe !
Les créer d'urgence pour root (= l'administrateur MySQL, n'a rien à voir avec le root linux !) et au moins un utilisateur :
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MotDePassePourRoot');
mysql> GRANT ALL PRIVILEGES ON *.* TO 'utilisateur'@'localhost' IDENTIFIED BY 'MotDePasseDeCetUtilisateur' WITH GRANT OPTION;
Vérifier (facultatif) le résulat :
mysql> SELECT Host, User FROM mysql.user;
mysql> quit
Se connecter
************
$ mysql -h localhost -u joe -p
$ mysql -p
NB : -h localhost et -u joe sont facultatifs : en leur absence c'est localhost et l'utilisateur qui lance la commande mysql qui sont pris par défaut.
- p pour qu'au démarrage de mysql le mot de passe soit demandé
Version, aide en ligne
**********************
Lancer simplement mysql :
$ mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 4.1.5-gamma
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> SHOW DATABASES; liste les DB
$ mysqlshow -u root -p "
mysql> SELECT DATABASE(); affiche la DB actuellement sélectionnée (NULL si aucune DB est sélectionnée)
mysql> CREATE DATABASE toto; Crée la DB toto
mysql> USE toto Sélectionne la DB toto
CREATE TABLE `tb1` (
`id_tb1` int(11) NOT NULL auto_increment,
`nom` text NOT NULL,
....
PRIMARY KEY (`id_tb1`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
mysql> SHOW TABLES FROM toto; liste les tables contenues dans la DB toto
mysql> DESCRIBE tb1; Affiche la structure de la table tb1
mysql> DROP DATABASE tb1; Supprime la DB tb1
Sécurité
********
Afficher les utilisateurs : mysql> SELECT Host, User FROM mysql.user;
---------------------------
mysql> SELECT Host, User FROM mysql.user;
+-----------+------+
| Host | User |
+-----------+------+
| localhost | |
| localhost | root |
+-----------+------+
La ligne où user est vide correspond à un accès anonyme avec les pleins droits !
=> supprimer le compte anonyme :
--------------------------------
mysql> DELETE FROM mysql.user WHERE User = ''; suppression
mysql> FLUSH PRIVILEGES; mise à jour
Assigner un mot de passe chiffré :
----------------------------------
Plusieurs commandes possibles :
- SET PASSWORD
..............
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('mot_de_passe');
- mysqladmin
............
$ mysqladmin -u root password "mot_de_passe"
$ mysqladmin -u root -h nom_ou_IP_machine password "mot_de_passe"
- UPDATE
........
mysql> UPDATE mysql.user SET Password = PASSWORD('mot_de_passe')
-> WHERE User = 'root';
mysql> FLUSH PRIVILEGES;
Vérifier la mise en place du mot de passe
-----------------------------------------
mysql> SELECT Host, User, password FROM mysql.user;
Se connecter apès avoir mis un mdp
----------------------------------
$ mysql -h host -u user -p Se connecter après voir mis un mdp
Enter password:
Ajouter un utilisateur
----------------------
Utilisateur pouvant se connecter à partir de localhost avec tous les droits :
mysql> GRANT ALL PRIVILEGES ON *.* TO 'utilisateur'@'localhost'
-> IDENTIFIED BY 'mot_de_passe' WITH GRANT OPTION;
Utilisateur pouvant se connecter à partir de n'importe où avec tous les droits :
remplacer TO 'utilisateur'@'localhost' par TO 'utilisateur'@'%'
Autres mesures de sécurité
**************************
http://www.securityfocus.com/infocus/1726
Activer /désactiver l'accès par le réseau
*****************************************
Editer /etc/my.cnf
Désactiver = skip-networking (existe par défaut dans le fichier)
Activer = mettre "skip-networking" en commentaire
Messages d'erreur
*****************
$ mysql -u joe -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
=> Vérifier si mysqld est lancé
# service mysqld status
mysqld is stopped
# service mysqld start
Starting MySQL: [OK]
Installation de phpMyAdmin
=========================
Voir documentation phpMyAdmin
Configuration de la version stable (rpm)
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
MDV installe phpMyadmin dans /var/www/html/admin/phpMyAdmin
La documentation locale est dans :
http://localhost/admin/phpMyAdmin/Documentation.html
Pour lancer phpMyAdmin :
http://localhost/admin/phpMyAdmin/
En cas de message d'erreur :
cannot load mysql extension;
please check PHP configuration
installer les fonctions nécessaires à PHP pour se connecter au servfeur Mysql :
php-mysql-x.x.x-xmdk
Mire phpMyAdmin, mais message d'erreur :
The configuration file now needs a secret passphrase (blowfish_secret).
=> editer le fichier /var/www/html/admin/phpMyAdmin/config.inc.php :
chercher la ligne $cfg['blowfish_secret'] = '' et entrer une phrase quelconque qui servira à coder les mots de passe.
Autres messages d'erreur
- The mbstring PHP extension was not found and you seem to be using a multibyte charset. Without the mbstring extension phpMyAdmin is unable to split strings correctly and it may result in unexpected results.
=> probablement une fausse alerte. Installer php4-mbstring-x.x.x-xmdk
Se déloger
Redémarrer le serveur mysql
# service mysqld stop
# service mysqld start
Relancer phpMyAdmin
Le message d'erreur persiste !! A voir.
Création des tables nécessaires au "whole set of new features (bookmarks, comments, SQL-history, PDF-generation, field contents transformation, etc."
----------------------------------------------------------------------------------------------------------
Documentation, voir :
http://localhost/admin/phpMyAdmin/Documentation.html
/var/www/html/admin/phpMyAdmin/scripts/create_tables_mysql_4_1_2+.sql
- Créer un utilisateur 'pma' (par userdrake par exemple) et lui attribuer un mot de passe quelconque
- Mettre ce nom d'utilisateur et ce mot de passe dans le fichier de configuration de phpMyAdmin /var/www/html/admin/phpMyAdmin/config.inc.php :
$cfg['Servers'][$i]['controluser'] = 'pma'; // MySQL control user settings
// (this user must have read-only
$cfg['Servers'][$i]['controlpass'] = 'mot de passe pour pma'; // access to the "mysql/user"
Indiquer dans ce même fichier de configuration les services voulus ; pas de service si la variable correspondante n'est pas initialisée :
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
// Database used for Relation, Bookmark and PDF Features
// (see scripts/create_tables.sql)
// - leave blank for no support
// DEFAULT: 'phpmyadmin'
$cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark';
// Bookmark table
// - leave blank for no bookmark support
// DEFAULT: 'pma_bookmark'
$cfg['Servers'][$i]['relation'] = 'pma_relation';
$cfg['Servers'][$i]['table_info'] = 'pma_table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma_table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma_pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma_column_info';
$cfg['Servers'][$i]['history'] = 'pma_history';
Configurer correctement les droits du controluser pma : cf http://localhost/admin/phpMyAdmin/Documentation.html au paragraphe "Using authentication modes"
GRANT USAGE ON mysql.* TO 'pma'@'localhost' IDENTIFIED BY 'mot de passe pour pma';
GRANT SELECT (
Host, User, Select_priv, Insert_priv, Update_priv, Delete_priv,
Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv,
File_priv, Grant_priv, References_priv, Index_priv, Alter_priv,
Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv,
Execute_priv, Repl_slave_priv, Repl_client_priv
) ON mysql.user TO 'pma'@'localhost';
GRANT SELECT ON mysql.db TO 'pma'@'localhost';
GRANT SELECT ON mysql.host TO 'pma'@'localhost';
GRANT SELECT (Host, Db, User, Table_name, Table_priv, Column_priv)
ON mysql.tables_priv TO 'pma'@'localhost';
- Créer les tables nécessaires à l'aide du script fourni dans phpMyAdmin/scripts :
$ mysql -ulogin -p -vv /etc/phpMyAdmin/config.default.php
Placer une copie de ce fichier (ou un lien) dans le répertoire principal de phpMyAdmin (celui contenant le fichier index.php, en principe /var/www/phpMyAdmin ou tout autre endroit où l'on a installé phpMyAdmin) ; nommer cette copie config.inc.php.
Seule chose à modifier (pour commencer) :
$cfg['Servers'][$i]['auth_type'] = 'cookie'; // Authentication method (config, http or cookie based)?
=> remplacer 'cookie' par 'http'
Script de configuration : /usr/share/doc/phpMyAdmin-2.8.0.3/scripts/setup.php : intérêt? Fonctionnemnet ?
En cas de login/mot de passe rejeté : vérifier qu'Apache et msql sont bien démarrés !
# service httpd status|start
# service mysqld status|start
Sécurisation
°°°°°°°°°°°°
Pour qu'apache présente une fenêtre login/password :
1 - fichier config.inc.php : remplacer config par http:
$cfg['Servers'][$i]['auth_type'] = 'http';
2 - Créer un fichier de mots de passe utilisable par apache :
cf. documentation apache : file:/usr/share/doc/apache2-manual-2.0.50/howto/auth.html
Créer le fichier de mots de passe n'importe où (éviter de le mettre sous /var/www/html qui est la racine du serveur web sous Mandrake, lisible sauf précautions particuliéres (.htaccess) par tout le monde). Le placer par exemple dans la zone de fichiers de configuration d'apache (/etc/httpd). Créer par exemple un dossier spécial :
# mkdir /etc/httpd/passwd
Puis créer (-c) avec l'utilitaire (apache) htpasswd un fichier de mots de passe avec un nom quelconque (ici par exemple .htpasswd). Ici pour l'utilisateur root :
# htpasswd -c /etc/httpd/passwd/.htpasswd root
répondre par le mot de passe à utiliser pour root
(NB : pour que le nouvel utilisateur soit pris en compte par apache il est nécessaire de redémarrer apache (service httpd restart). Ici ce n'est pas utile : il sera redémarré au point 4
Pour ajouter un nouvel utilisateur, même commande, mais ATTENTION ! sans -c, sinon le fichier de mots de passe est effacé)
3 - Indiquer à apache où se trouve ce fichier de mots de passe :
Dans le fichier de configuration d'apache /etc/httpd/conf/commonhttpd.conf, rajouter dans la partie concernant phpMyAdmin les directives suivantes :
...
AuthType Basic
AuthName "phpMyAdmin"
AuthUserFile /etc/httpd/passwd/.htpasswd
Require user toto
Explication :
indique quel répertoire est concerné (celui
qui contient phpMyAdmin)
AuthType Basic type d'identification
Basic : le mot de passe circule en clair
Digest : le mot de passe est transmis crypté : n'est
supporté que par les clients web les plus récents :
OK avec konqueror
Ne fonctionne pas avec Mozilla 1.7.2 et Firefor 0.9.3
AuthName "phpMyAdmin" Invite affichée dans la fenêtre de demande de login/mot de passe
AuthUserFile /etc/httpd/passwd/.htpasswd /path/vers/le/fichier_de_mots_de_passe
Require user root utilisateur autorisé
4 - Relancer apache (service httpd restart) pour que les nouvelles directives soient prises en compte
5 - Si on veut indiquer non plus un utilisateur, mais un (ou des) groupes d'utilisateurs
AuthType Digest
AuthName "Accès à phpMyAdmin"
AuthUserFile /etc/httpd/passwd/.htpasswd
AuthGroupFile /etc/httpd/passwd/groups
Require group Nom_du_groupe
Explication :
AuthGroupFile /etc/httpd/passwd/groups groups : nom du fichier (il peut être quelconque)
où sont définis un (ou des) groupe(s)
Dans le fichier texte "groups" définir les groupes de la facon suivante :
Nom_du_groupe: user4 user6 user25
Pour d'autres possibilités de sécuriser l'accès au serveur web, voir la documentation apache : file:/usr/share/doc/apache2-manual-2.0.50/howto/auth.html plutôt bien faite.
phpMyadmin-2.10.0.2 sous MDV 2008.0
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
phpMyadmin est maintenant installé dans /var/www/ (/var/www/phpmyadmin). On peut le déplacer ailleurs.
Documentation : /usr/share/doc/phpmyadmin-2.10.0.2/Documentation.txt
/var/www/phpmyadmin/Documentation.html
Configuration : /etc/phpmyadmin/config.default.php (/var/www/phpmyadmin/libraries/config.default.php -> /etc/phpmyadmin/config.default.php)
La doc précise
- de copier config.default.php dans config.inc.php
- d'éditer et de compléter ce dernier (voir plus loin)
- de le copier dans la racine de phpmyadmin (phpmyadmin/libraries/config.default.php est d'abord lu puis phpmyadmin/config.inc.php.
# cp /var/www/phpmyadmin/libraries/config.default.php /var/www/phpmyadmin/config.inc.php
Configuration de phpmyadmin
---------------------------
Voir plus haut "Installation de phpMyAdmin-2.8.0.3 (à partir de cooker)"
Configuration du serveur Apache
-------------------------------
Les modifications ne sont pas apportées dans /etc/httpd/conf/httpd.conf, mais dans /etc/httpd/conf/webapps.d/phpmyadmin.conf
Modifier ce fichier en conséquence en particulier
Alias /phpmyadmin /var/www/phpmyadmin si on a modifié l'emùplacement de phpmyadmin
et
Allow from All
pour renforcer la sécurité
puis redémarrer httpd
Quelques problèmes
°°°°°°°°°°°°°°°°°°
couldn't perform authentication. AuthType not set!
--------------------------------------------------
"Require user" non précédé de la façon dont doit se faire l'authentification de l'utilisateur.
=> voir "Authtype" dans le paragraphe "Sécurisation" ci-dessus
Permission denied: Could not open password file: /etc/httpd/passwd/htpasswd
access to // failed, reason: verification of user id 'toto' not configured
-------------------------------------------------------------------------------------
=> Apache doit pouvoir lire le fichier htpasswd. Tester où ça bloque avec :
# su - apache
Mettre les droits d'accès corrects et de lecture corrects :
# chmod 755 /etc/httpd/passwd
# chmod 644 /etc/httpd/passwd/htpass
ou de préférence (droits plus restreints) :
ou bien les 2 commandes :
# chown root:apache /etc/httpd/passwd
# chown root:apache /etc/httpd/passwd/htpass
# chmod 750 /etc/httpd/passwd
# chmod 640 /etc/httpd/passwd/htpass
Existing configuration file (./config.inc.php) is not readable
--------------------------------------------------------------
Apache ne peut pas le lire. Appartient probablement à root:root)
# ll /var/www/phpmyadmin/config.inc.php
-rw-r----- 1 root root /var/www/phpmyadmin/config.inc.php
# chown root:apache /var/www/phpmyadmin/config.inc.php
MySQL - ODBC - OpenOffice
=========================
Cf. http://support.openoffice.org/index.html, cliquer sur "Free: OpenOffice.org, ODBC,and MySQL How-To"
(fichier OOoMySQL9.pdf)
- Installer MySQL
- Installer MyODBC
- Configurer /etc/odbcinst.ini et /etc/odbc.ini comme indiqué dans la doc ci-dessus
$ cat /etc/odbc.ini
[MySQL-test]
Description = MySQL database test
Driver = MySQL
Server = localhost
Database = test
Port = 3306
$ cat /etc/odbcinst.ini (à rajouter dans ce fichier, il y a probablement deja un paragraphe [PostgreSQL])
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/libmyodbc3.so.1.0.0
Setup = = /usr/lib/libmyodbc3S.so.1.0.0
FileUsage = 1
- Voir la version et la config d'ODBC :
$ odbcinst -j
- Tester la configuration :
$ isql -v MySQL-test login MotDePasse
Problèmes
---------
1 :
$ isql -v MySQL-test test
[IM004][unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV fail
ed
[ISQL]ERROR: Could not SQLConnect
=> dans /etc/odbcinst.ini
Driver = /usr/lib/libmyodbc3S.so.1.0.0
le driver indiqué n'est pas le bon : "S" est seulement pour le setup
2 :
$ isql -v MySQL-test test
[S1T00][unixODBC][MySQL][ODBC 3.51 Driver]Access denied for user 'test'@'localhost' (using password: NO)
[ISQL]ERROR: Could not SQLConnect
=> l'utilisateur test n'existe pas (a été supprimé)
ou bien, même message d'erreur mais avec un utilisateur existant :
3 :
$ isql -v MySQL-test NomDeLogin
[S1T00][unixODBC][MySQL][ODBC 3.51 Driver]Access denied for user 'NomDeLogin'@'localhost' (using password: NO)
[ISQL]ERROR: Could not SQLConnect
=> Connexion refusée car pas de mot de passe