Outils pour utilisateurs

Outils du site


serveur_mysql

MySQL:

Rien de plus simple !

Installer le serveur

 # apt-get install mysql-client mysql-common mysql-server

ATTENTION: a plusieurs reprises, cette installation a necessité une mise à jour du noyau ! Il faut bien examiner les paquets mis a jour/ajoutés/enlevés.

Installer le client

 # apt-get install mysql-client mysql-common

Root et password

Lien: http://dev.mysql.com/doc/refman/5.1/en/passwords.html

:!: en cas de perte du password root (de mysql) , voir ici

Aucun mot de passe n'est demandé aprés l'installation. (Mais il me semble qu'on ne peut se connecter qu'en localhost).

 $ mysql -u root

Voir la liste des bases de données (pas grand chose au début):

 mysql> show databases;

On veut utiliser la bdd 'mysql':

 mysql> use mysql;

Voir les tables de la bdd:

 mysql> show tables;

Description de la table 'user':

 mysql> desc user;

Voir les users declarés dans 'user':

 mysql> select Host,User,Password from user;
 +-----------+------------------+------------------+
 | Host      | User             | Password         |
 +-----------+------------------+------------------+
 | localhost | root             |                  |
 | bourse2   | root             |                  |
 | localhost | debian-sys-maint | 5d31XXXXXXXXXXXX |
 +-----------+------------------+------------------+
 3 rows in set (0.00 sec)

'Root' n'ayant pas de mot de passe, on va lui en mettre un:

 mysql> update user set password=password('XXXXXXXX') where user='root' and host='localhost';

Et mysql repond que ca va…

 Query OK, 1 row affected (0.00 sec)
 Rows matched: 1  Changed: 1  Warnings: 0

Sans oublier de mettre a jour les 'privileges': (p'tain quel bordel) (sinon, les nouveaux mot de passe sont ignorés pendant longtemps…)

 mysql> flush privileges;

Verifions:

 mysql> select Host,User,Password from user where user='root';
 +-----------+------+------------------+
 | Host      | User | Password         |
 +-----------+------+------------------+
 | localhost | root | 4c9dXXXXXXXXXXXX |
 | bourse2   | root |                  |
 +-----------+------+------------------+
 2 rows in set (0.00 sec)

Les droits de 'Root':

 mysql> show grants for root@localhost;
 +---------------------------------------------------------------------+
 | Grants for root@localhost                                           |
 +---------------------------------------------------------------------+
 | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
 +---------------------------------------------------------------------+
 1 row in set (0.00 sec)

Dorénavant, l'accès par: “mysql -u root” reclame un mot de passe.

 $ mysql -u root
 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

Entrer avec saisie de mot de passe:

 mysql -u root -p

Creation d'un User avec droit sur ses databases...

 mysql> GRANT ALL ON MYDATABASE.* TO thierry@localhost;
 Query OK, 0 rows affected (0.00 sec)

Voila l'utilisateur 'thierry' créé.

On ne souhaite pas de mot de passe… sinon, on aurait ajouté:

 IDENTIFIED BY "mot de passe"

Mais comme l'accès est restreint à “thierry@localhost”, et que le mot de passe sera forcement en clair quelques parts dans les programmes… autant ne pas en mettre.

Autres privilèges

LOAD DATA INFILE

Si malgré les droits sur la DATABASE, le chargement d'un fichier avec LOAD DATA INFILE … retourne Access denied for user 'thierry'@'localhost' (using password: YES) , alors vous devez faire:

mysql> select user,File_priv from user where user='thierry';
+---------+-----------+
|  user   | File_priv |
+---------+-----------+
| thierry | N         |
+---------+-----------+
1 row in set (0.00 sec)

Donc, on pas les privilèges pour charger les fichiers ! alors faire:

mysql> update user set File_priv='Y' where user='thierry' and host='localhost';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Et puis:

mysql> flush privileges;

Et voila.

MYSQL et le monde exterieur

Par defaut, MYSQL (5 ieme du nom) restreint l'ecoute TCP/IP a 'localhost'. Pour changer cela, il faut editer le fichier “/etc/mysql/my.cnf” et changer la ligne:

 bind-address            = 127.0.0.1

Par la ligne:

 bind-address            = 0.0.0.0

ATTENTION: Bien verifier que les droits sont fixés, avec les mots de passe !

(a verifier que c'est la bonne methode recommandé:)

Et puis, faire:

 # /etc/init.d/mysql restart

On peut alors, notamment, utiliser mysql comme suit:

 $ mysql -h adresse_du_serveur -u user -p

Creer la database:

J'entre (en tant qu'utilisateur 'thierry' bien sur):

 thierry@bourse2:~$ mysql
 Welcome to the MySQL monitor.  Commands end with ; or \g.
 Your MySQL connection id is 13 to server version: 5.0.22-Debian_3-log
 Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

J'ai quoi comme database ?

 mysql> show databases;
 +--------------------+
 | Database           |
 +--------------------+
 | information_schema |
 +--------------------+
 1 row in set (0.00 sec)

Il manque 'FBXSERSERV', on va creer ça:

 mysql> create database FBXSERSERV;
 Query OK, 1 row affected (0.00 sec)

Yes!

 mysql> show databases;
 +--------------------+
 | Database           |
 +--------------------+
 | information_schema |
 | FBXSERSERV         |
 +--------------------+
 2 rows in set (0.00 sec)

Utiliser cette database:

 mysql> use FBXSERSERV;
 Database changed

Ensuite, on attaque la creation des tables et le reste:

Par exemple:

 /* La base des clients par IP */
 CREATE TABLE client_ip
 (
   client_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   ip CHAR(23) NOT NULL,
   create_dt DATETIME NOT NULL,
   enable ENUM('Y','N') NOT NULL DEFAULT 'Y',
   logdata ENUM('Y','N') NOT NULL DEFAULT 'N',
   UNIQUE (ip),
   PRIMARY KEY (client_id)
  )
  AUTO_INCREMENT=1000		/* les 1000 1er sont reservés pour on ne sait quoi... */
  ;

Et aprés quelques creations, avoir ça par exemple:

 mysql> show tables;
 +----------------------+
 | Tables_in_FBXSERSERV |
 +----------------------+
 | client_ip            |
 | msg                  |
 | session              |
 | tpe_stat             |
 | x25_stat             |
 +----------------------+
 5 rows in set (0.00 sec)

Pense bête

Virer un **user** (avec les droits pour cela):

 mysql> use mysql;
 mysql> select user,host from user;
 +------------------+-----------+
 | user             | host      |
 +------------------+-----------+
 | root             | danstonq  |
 | root             | localhost |
 | le_user_a_virer  | localhost |
 +------------------+-----------+
 mysql> delete from user where user='le_user_a_virer' and host='localhost';
 Query OK, 1 row affected (0.01 sec)

Mais je ne sais pas s'il y a un truc a faire avec GRANT et compagnie… (A completer ultérieurement)

Virer une **database**

 mysql> drop database nom_de_la_base; 
 Query OK, 0 rows affected (0.71 sec)

Backup

Il existe plusieurs méthodes que je n'ai pas testé, mais la suivante a fonctionné a partir d'un sql tout fraichement installé.

Sauver toute la base de données:

 # mysqldump -u root -p --all-databases > all-databases.sql

Le fichier all-databases.sql est une serie de commande sql pour reconstruire les bases de données.

Restaurer toute la base de données

Sur un serveur mysql fraichement installé.

 # mysql -u root -p < all-databases.sql

Ensuite, j'ai eu quelques difficultés d'identification, alors qu'il suffisait de faire:

 mysql> flush privileges;

debian-sys-maint

Mais il y avait encore un problème avec l'user debian-sys-maint (je crois qu'il controle le demarrage et l'arret de mysql… pas trop compris en fait).

Il faut rechercher son mot de passe dans: /etc/mysql/debian.cnf

Ensuite, il faut mettre a jour le password:

 mysql> update user set password=password('le_mot_de_passe') where user='debian-sys-maint';

Et enfin:

 mysql> flush privileges;

mysqlhotcopy

Liens:

:!: Bug ! mysqlhotcopy ignore silencieusement toutes bases de données de 2 lettres !!!! Lien: http://bugs.mysql.com/bug.php?id=28460

Pour installer la version “1.23”, qui n'est pas buggé:

# wget http://backports.debian.org/debian-backports/pool/main/m/mysql-5.1/mysql-server-5.1_5.1.49-1~bpo50+1_i386.deb

(recuperer une version de mysql plus recentes, *sans* l'installer !)

Decompresser quelque part…

# dpkg -x mysql-server-5.1_5.1.49-1~bpo50+1_i386.deb .  

et recuperer le fichier dans ./usr/bin/mysqlhotcopy … Grrrr

Bref, revenons a ce p'tit pense bête:

Il faut nommer les bases a sauver.

Exemple:

# mkdir /var/backups/mysql
# mysqlhotcopy --allowold --keepold --method=cp -u <USER> -p <MOT_DE_PASSE> {mysql,BaseSecrete}'./.*/' /var/backups/mysql/ 

Aprés cela on a la copie *exacte* et *coohérente* . Par exemple, aprés plusieurs sauvegardes:

$ ls -lart /var/backups/mysql/
total 24
drwxr-xr-x 3 root  root  4096 sep 27 16:31 ..
drwxr-x--- 2 mysql mysql 4096 sep 27 16:48 mysql_old
drwxr-x--- 2 mysql mysql 4096 sep 27 16:48 BaseSecrete_old
drwxr-x--- 2 mysql mysql 4096 sep 27 16:56 mysql
drwxr-x--- 2 mysql mysql 4096 sep 27 16:56 BaseSecrete
drwxr-xr-x 6 root  root  4096 sep 27 16:56 .

Pour restaurer, il suffit d'arreter “mysql” et de copier l'ensemble des fichiers d'une base (d'un répertoire) dans /var/lib/mysql

Exporter

A partir d'un shell

$ mysql -u <user> <database> -e "SELECT * FROM <table>" >fichier.txt

Tips

root password recovery

crash

Lien:

  • MySQL Tips: Table marked as crashed and should be repaired
# mysqldump -u root -p wz >wz.sql
mysqldump: Got error: 144: Table './wz/Catalg' is marked as crashed and last (automatic?) repair failed when using LOCK TABLES
mysql> use wz;
mysql> REPAIR TABLE Catalg;
+-----------+--------+----------+-------------------------------------------+
| Table     | Op     | Msg_type | Msg_text                                  |
+-----------+--------+----------+-------------------------------------------+
| wz.Catalg | repair | warning  | Number of rows changed from 0 to 12924086 |
| wz.Catalg | repair | status   | OK                                        |
+-----------+--------+----------+-------------------------------------------+
2 rows in set (2 min 44.91 sec)
serveur_mysql.txt · Dernière modification : 2011/01/03 12:18 de thierry