====== 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 [[http://www.tinybox.net/astuces/mysqld-root-recovery|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: *http://dev.mysql.com/doc/refman/5.0/fr/mysqldump.html *http://www.thegeekstuff.com/2008/07/backup-and-restore-mysql-database-using-mysqlhotcopy/ | :!: 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 -p {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 ===== Lien: * http://mysql.developpez.com/faq/?page=ADMIN_MIGRATION#ADMIN_MIGRATION_export_fichier ==== A partir d'un shell ==== $ mysql -u -e "SELECT * FROM " >fichier.txt ===== Tips ===== ==== root password recovery ==== Lien: http://www.tinybox.net/astuces/mysqld-root-recovery Perte de mot de passe root: http://www.korben.info/changer-mot-de-passe-root-mysql.html Mais aussi: http://www.admin-linux.fr/?p=2911 ==== 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)