relecture [2/n]

This commit is contained in:
gcolpart 2016-12-16 01:49:46 +01:00
parent bae9ecbc6e
commit edf818f205

View file

@ -321,20 +321,19 @@ On crée une base de données et un utilisateur associé :
mysql> GRANT ALL PRIVILEGES ON foo.* TO 'jdoe'@localhost IDENTIFIED BY 'PASSWORD'; mysql> GRANT ALL PRIVILEGES ON foo.* TO 'jdoe'@localhost IDENTIFIED BY 'PASSWORD';
~~~ ~~~
Cette opération revient à insérer des lignes brutes dans les tables `mysql.user` et `mysql.db` : Cette opération revient à insérer des lignes suivante dans les tables `mysql.user` et `mysql.db` :
~~~ ~~~
mysql> INSERT INTO user VALUES ('localhost','USER_BASE',password('XXX'),'N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N',_,'','','',0,0,0,0,_,NULL); mysql> INSERT INTO mysql.user VALUES ('localhost','jdoe',password('PASSWORD'),'N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','','','','',0,0,0,0,'',NULL);
mysql> INSERT INTO db VALUES ('localhost','NOM_BASE','USER_BASE','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO mysql.db VALUES ('localhost','foo','jdoe','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES; mysql> FLUSH PRIVILEGES;
~~~ ~~~
**Note** : sous Debian 6, les valeurs dans `mysql.user` avaient 3 colonnes de moins : Create_tablespace_priv, plugin et authentication_string : *Note* :
(par défaut, pour migrer on ajoutera donc 'N' en 32ème position + '' et NULL à la fin) :
~~~ Pour migrer de Debian 6 à 7 :
mysql> INSERT INTO user VALUES ('localhost','USER_BASE',password('XXX'),'N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N',_,'','',_,0,0,0,0); - 3 colonnes ont été ajoutées dans `mysql.user` : Create_tablespace_priv, plugin et authentication_string (pour migrer il faut ajouter 'N' en 32ème position + '' et NULL à la fin)
~~~ - 2 colonnes ont été ajoutées dans `mysql.db` : Event_priv et Trigger_priv (pour migrer il faut ajouter 'Y' et 'Y' à la fin)
On pourra ainsi régler finement les droits d'un utilisateur en connaissant la signification de chaque colonne : On pourra ainsi régler finement les droits d'un utilisateur en connaissant la signification de chaque colonne :
@ -389,14 +388,14 @@ mysql> desc user;
42 rows in set (0.00 sec) 42 rows in set (0.00 sec)
~~~ ~~~
Par exemple, pour permettre à un utilisateur (ici `debian-sys-maint`) de faire des `SHOW VIEW` : Par exemple, pour permettre à un utilisateur (ici *debian-sys-maint*) de faire des `SHOW VIEW` :
~~~ ~~~
mysql> UPDATE user SET Show_view_priv='Y' WHERE User='debian-sys-maint'; mysql> UPDATE user SET Show_view_priv='Y' WHERE User='debian-sys-maint';
mysql> FLUSH PRIVILEGES; mysql> FLUSH PRIVILEGES;
~~~ ~~~
que l'on peut aussi faire via : …que l'on peut aussi faire via :
~~~ ~~~
mysql> GRANT SHOW VIEW on *.* to `debian-sys-maint`@localhost; mysql> GRANT SHOW VIEW on *.* to `debian-sys-maint`@localhost;
@ -405,32 +404,31 @@ mysql> GRANT SHOW VIEW on *.* to `debian-sys-maint`@localhost;
Pour créer un utilisateur sans droit particulier, par exemple pour du monitoring : Pour créer un utilisateur sans droit particulier, par exemple pour du monitoring :
~~~ ~~~
mysql> create user nagios@localhost identified by 'XXX'; mysql> create user nagios@localhost identified by 'PASSWORD';
~~~ ~~~
On peut aussi gérer des droits sur les tables : On peut aussi gérer des droits sur les tables :
~~~ ~~~
mysql> GRANT Select,Insert,Update ON BASE.TABLE TO 'USER_BASE'@localhost; mysql> GRANT Select,Insert,Update ON foo.bar TO 'jdoe'@localhost;
~~~ ~~~
Pour révoquer des droits sur une table, on utilisera `REVOKE` : Pour révoquer des droits sur une table, on utilisera `REVOKE` :
~~~ ~~~
mysql> REVOKE ALL PRIVILEGES ON BASE.TABLE FROM 'USER_BASE'@localhost; mysql> REVOKE ALL PRIVILEGES ON foo.bar FROM 'jdoe'@localhost;
~~~ ~~~
Un droit est particulier : pour utiliser LOAD DATA INFILE ou SELECT INTO OUTFILE, il faut avoir le droit `FILE` … mais il est global (et dangereux) ! /!\\ Un droit est particulier : pour utiliser LOAD DATA INFILE ou SELECT INTO OUTFILE, il faut avoir le droit `FILE` … mais il est global (et dangereux) !
On le positionnera ainsi : On le positionnera ainsi :
~~~ ~~~
mysql> GRANT FILE ON *.* TO 'USER_BASE'@localhost; mysql> GRANT FILE ON *.* TO 'jdoe'@localhost;
~~~ ~~~
### Vérifications et réparations ### Vérifications et réparations
Pour vérifier et réparer toutes les tables (une sorte de `fsck` pour les tables), Pour vérifier et réparer toutes les tables (une sorte de *fsck* pour les tables), on lancera :
on lancera la commande suivante :
~~~ ~~~
# mysqlcheck --auto-repair --check --all-databases # mysqlcheck --auto-repair --check --all-databases
@ -439,12 +437,12 @@ on lancera la commande suivante :
On peut aussi réparer qu'une base en particulier : On peut aussi réparer qu'une base en particulier :
~~~ ~~~
# mysqlcheck --auto-repair --check mabase # mysqlcheck --auto-repair --check foo
~~~ ~~~
Note : ceci est à faire en général en cas d'arrêt inopiné du serveur. *Note* : ceci peut être à faire en cas d'arrêt inopiné du service.
On pourra également ajouter l'option *--optimize* pour ajouter une optimisation des tables : On pourra également ajouter l'option **--optimize* pour ajouter une optimisation des tables :
~~~ ~~~
# mysqlcheck --auto-repair --check --optimize --all-databases # mysqlcheck --auto-repair --check --optimize --all-databases
@ -453,19 +451,19 @@ On pourra également ajouter l'option *--optimize* pour ajouter une optimisation
Pour réparer une seule table : Pour réparer une seule table :
~~~ ~~~
mysql> CHECK TABLE mabase.matable; mysql> CHECK TABLE foo.bar;
mysql> REPAIR TABLE mabase.matable; mysql> REPAIR TABLE foo.bar;
mysql> OPTIMIZE TABLE mabase.matable; mysql> OPTIMIZE TABLE foo.bar;
~~~ ~~~
Dans le cas des tables MyISAM, si le REPAIR échoue, une réparation est aussi possible via `myisamchk`… à faire avec Dans le cas des tables MyISAM, si le REPAIR échoue, une réparation est aussi possible via `myisamchk`… à faire avec
le service MySQL arrêté : le service MySQL arrêté :
~~~ ~~~
# myisamchk -r -q /var/lib/mysql/BASE/TABLE.MYD # myisamchk -r -q /var/lib/mysql/foo/bar.MYD
~~~ ~~~
En cas d'échec (segfault par exemple), on peut tenter : En cas d'échec (*segfault* par exemple), on peut tenter :
~~~ ~~~
# myisamchk --safe-recover -v -f --key_buffer_size=512M --sort_buffer_size=512M --read_buffer_size=4M --write_buffer_size=4M /var/lib/mysql/BASE/TABLE.MYD # myisamchk --safe-recover -v -f --key_buffer_size=512M --sort_buffer_size=512M --read_buffer_size=4M --write_buffer_size=4M /var/lib/mysql/BASE/TABLE.MYD
@ -480,14 +478,14 @@ mysql> select * from INFORMATION_SCHEMA.routines;
### Changement mot de passe utilisateur ### Changement mot de passe utilisateur
~~~ ~~~
> SET PASSWORD FOR 'user'@'hostname' = PASSWORD('pwd'); mysql> SET PASSWORD FOR 'jdoe'@'localhost' = PASSWORD('PASSWORD');
~~~ ~~~
Par rapport à un autre utilisateur: Par rapport à un autre utilisateur :
~~~ ~~~
mysql> use mysql; mysql> use mysql;
mysql> UPDATE USER SET Password='XXXXX' WHERE User='XXXXX' and Host='XX.XX.XX.XX'; mysql> UPDATE mysql.user SET Password='PASSWORD' WHERE User='jdoe' and Host='localhost';
~~~ ~~~
### Changer variables global d'environnement ### Changer variables global d'environnement
@ -507,31 +505,31 @@ mysql> SET @@max_connect_errors=50;
Pour sauvegarder une base de données (sans et avec compression) : Pour sauvegarder une base de données (sans et avec compression) :
~~~ ~~~
# mysqldump NOM_BASE > NOM_FICHIER # mysqldump foo > foo.sql
# mysqldump NOM_BASE | gzip > NOM_FICHIER # mysqldump foo | gzip > foo.sql.gz
~~~ ~~~
Pour restaurer une base de données (sans et avec compression) : Pour restaurer une base de données (sans et avec compression) :
~~~ ~~~
# mysqladmin create NOM_BASE # mysqladmin create foo
# mysql NOM_BASE < NOM_FICHIER # mysql foo < foo.sql
# gunzip < NOM_FICHIER | mysql NOM_BASE # gunzip < foo.sql.gz | mysql foo
~~~ ~~~
Sauvegarder toutes les bases : Sauvegarder toutes les bases :
~~~ ~~~
# mysqldump --opt --all-databases > NOM_FICHIER # mysqldump --opt --all-databases > all.sql
~~~ ~~~
Pour sauvegarder uniquement certaines tables : Pour sauvegarder uniquement certaines tables :
~~~ ~~~
# mysqldump NOM_BASE NOM_TABLE0 [NOM_TABLE1…] > NOM_FICHIER # mysqldump foo TABLE0 [TABLE1…] > foo_tables.sql
~~~ ~~~
Pour presque faire un "--exclude" (qui manque cruellement à mysqldump): Pour presque faire un *--exclude* (qui manque cruellement à *mysqldump*):
~~~ ~~~
mysql -B -N -e 'show databases' | \ mysql -B -N -e 'show databases' | \
@ -542,19 +540,19 @@ mysql -B -N -e 'show databases' | \
Et pour sauvegarder des tables correspondant à un motif (préfixe le plus souvent) : Et pour sauvegarder des tables correspondant à un motif (préfixe le plus souvent) :
~~~ ~~~
# mysqldump NOM_BASE $(mysql NOM_BASE -B --column-names=False -e "show tables like 'exemple_%'") > NOM_FICHIER # mysqldump foo $(mysql foo -B --column-names=False -e "show tables like 'exemple_%'") > foo_motif.sql
~~~ ~~~
Pour dumper avec une condition particulière : Pour dumper avec une condition particulière :
~~~ ~~~
mysqldump -t <base> <table> --where="my_id='66666666'" mysqldump -t foo bar --where="id='66666666'"
~~~ ~~~
Ce qui permet de réinjecter des données résultantes d'un `SELECT * FROM base.table WHERE my_id='66666666'`. Ce qui permet de réinjecter des données résultantes d'un `SELECT * FROM foo.bar WHERE id='66666666'`.
Il est évidement possible de faire toutes ces opérations sur une instance en Il est évidement possible de faire toutes ces opérations sur une instance en
précisant son port avec l'option `--port` (valable pour mysqldump et mysql). précisant son port avec l'option `--port` (valable pour *mysqldump* et *mysql*).
Pour obtenir une liste des utilisateurs mysql, on peut utiliser cette fonction (glanée sur [serverfault](http://serverfault.com/questions/8860/how-can-i-export-the-privileges-from-mysql-and-then-import-to-a-new-server/)) : Pour obtenir une liste des utilisateurs mysql, on peut utiliser cette fonction (glanée sur [serverfault](http://serverfault.com/questions/8860/how-can-i-export-the-privileges-from-mysql-and-then-import-to-a-new-server/)) :
@ -572,17 +570,16 @@ mygrants()
Pour avoir un dump avec un seul insert par ligne, pratique pour restaurer partiellement les bases `mysql.user` et `mysql.db` par exemple : Pour avoir un dump avec un seul insert par ligne, pratique pour restaurer partiellement les bases `mysql.user` et `mysql.db` par exemple :
~~~ ~~~
# mysqldump --skip-extended-insert mysql > mysql.dump # mysqldump --skip-extended-insert mysql > mysql.sql
~~~ ~~~
Pour restaurer une seule base d'un dump complet on peut utiliser : Pour restaurer une seule base d'un dump complet on peut utiliser :
~~~ ~~~
mysql -o MaBase < dump.sql mysql -o foo < all.sql
~~~ ~~~
Pour restaurer une base, dont la structure de chaque table est stocké dans un fichier SQL indépendant, et dont les données sont dans des fichiers de type " Pour restaurer une base, dont la structure de chaque table est stockée dans un fichier SQL indépendant, et dont les données sont dans des fichiers de type "tab-separated data files" (option -T de mysqldump) avec une extension .txt :
tab-separated data files" (option -T de mysqldump) avec une extension .txt :
~~~{.bash} ~~~{.bash}
db=test1 db=test1
@ -599,19 +596,19 @@ for file in *.txt; do
done done
~~~ ~~~
**Note 1** : Attention, l'utilisateur MySQL doit avoir le droit de lecture sur les fichiers .txt *Note 1* : Attention, l'utilisateur MySQL doit avoir le droit de lecture sur les fichiers .txt
Se positionner dans un répertoire où mysql a les droits (mysqltmp - /home/mysqltmp par ex). Se positionner dans un répertoire où mysql a les droits (mysqltmp - /home/mysqltmp par ex).
**Note 2** : Si vous n'avez pas toutes vos tables en utf8 (par exemple du `CHARSET=LATIN1`), ce n'est pas bien… et vous devrez pour la peine adapter le script (en détectant le charset utilisé avec « file » si nécessaire) *Note 2* : Si vous n'avez pas toutes vos tables en utf8 (par exemple du `CHARSET=LATIN1`), ce n'est pas bien… et vous devrez pour la peine adapter le script (en détectant le charset utilisé avec « file » si nécessaire)
Il est possible d'exporter le contenu d'une base au format CSV : Il est possible d'exporter le contenu d'une base au format CSV :
~~~ ~~~
mysqldump -T /tmp --fields-enclosed-by=\" --fields-terminated-by=, --no-create-db --no-create-info MaBase # mysqldump -T /tmp --fields-enclosed-by=\" --fields-terminated-by=, --no-create-db --no-create-info foo
~~~ ~~~
NOTE : il est nécessaire que MySQL ait les droits d'écriture dans le répertoire de destination (ici `/tmp`). *Note* : il est nécessaire que MySQL ait les droits d'écriture dans le répertoire de destination (ici `/tmp`).
## Monitoring ## Monitoring
@ -623,36 +620,38 @@ Pour surveiller un service MySQL en production, on pourra faire :
# mysqladmin processlist # mysqladmin processlist
~~~ ~~~
Pour avoir une version plus conviviale et dynamique des process en cours, on utilisera l'indispensable outil `mytop`. ### mytop
Pour avoir une version conviviale et dynamique des process en cours, on utilisera l'outil *mytop*.
~~~ ~~~
# aptitude install mytop # apt install mytop
~~~ ~~~
On édite le fichier `/root/.mytop` ainsi : On édite le fichier `/root/.mytop` ainsi :
~~~{.ini} ~~~{.ini}
user = debian-sys-maint user = debian-sys-maint
pass = MOT_DE_PASSE pass = PASSWORD
db = mysql db = mysql
~~~ ~~~
Reste plus qu'à lancer la commande `mytop -s1` (pour un rafraichissement toutes les secondes)… On appréciera les raccourcis `p` (mettre en pause l'affichage), `o` (pour voir en 1er les requêtes les plus longues), `k` (pour killer une requête… par exemple celle qui bloque toutes les autres) et `?` (pour voir les autres raccourcis possibles). Reste plus qu'à lancer la commande `mytop -s1` (pour un rafraichissement toutes les secondes) : on appréciera les raccourcis `p` (mettre en pause l'affichage), `o` (pour voir en 1er les requêtes les plus longues), `k` (pour killer une requête… par exemple celle qui bloque toutes les autres) et `?` (pour voir les autres raccourcis possibles).
L'outil mytop se sert principalement de la requête `SHOW PROCESSLIST` que l'on pourra bien sûr lancer manuellement. Tout comme `KILL` : L'outil *mytop* se sert principalement de la requête `SHOW PROCESSLIST` que l'on pourra bien sûr lancer manuellement. Tout comme `KILL` :
~~~ ~~~
mysql> SHOW PROCESSLIST; mysql> SHOW PROCESSLIST;
mysql> KILL <id_interne_requête>; mysql> KILL <id_requête>;
~~~ ~~~
Lister les requêtes qui durent plus de 30 secondes pour pouvoir les tuer facilement : Pour lister les requêtes qui durent plus de 30 secondes pour pouvoir les tuer facilement :
~~~ ~~~
mysql -e 'select group_concat(concat("kill ",ID) separator ";") from information_schema.processlist where TIME>=30;' mysql -e 'select group_concat(concat("kill ",ID) separator ";") from information_schema.processlist where TIME>=30;'
~~~ ~~~
Puis exécuter le résultat avec la commande mysql, ex : Puis exécuter le résultat avec la commande *mysql*, exemple :
~~~ ~~~
mysql -e 'kill 1854;kill 1853;kill 1852;kill 1851;kill 1850;kill 1848' mysql -e 'kill 1854;kill 1853;kill 1852;kill 1851;kill 1850;kill 1848'
@ -664,30 +663,55 @@ Pour surveiller le moteur InnoDB, on utilisera la commande suivante :
mysql> SHOW ENGINE INNODB STATUS; mysql> SHOW ENGINE INNODB STATUS;
~~~ ~~~
Enfin, reste Munin qui permet d'obtenir de jolis graphes. ### Munin
Afin d'être alerté en cas de soucis, il est conseillé d'ajouter la configuration suivante au logiciel `log2mail` : Pour activer les plugins MySQL pour Munin :
~~~
# cd /etc/munin/plugins
# ln -s /usr/share/munin/plugins/mysql_bytes
# ln -s /usr/share/munin/plugins/mysql_queries
# ln -s /usr/share/munin/plugins/mysql_slowqueries
# ln -s /usr/share/munin/plugins/mysql_threads
~~~
On pourra aussi activer le plugin *mysql_* avec des liens symboliques nommés connections, files_tables, innodb_bpool, innodb_bpool_act, innodb_io, innodb_log, innodb_rows, innodb_semaphores, myisam_indexes, qcache, qcache_mem, sorts ou tmp_tables.
Pour tester le bon fonctionnement des plugins MySQL pour Munin :
~~~
# munin-run mysql_bytes
~~~
### log2mail
Afin d'être alerté en cas de souci, il est conseillé d'ajouter la configuration suivante au logiciel `log2mail` :
~~~ ~~~
file = /var/log/syslog file = /var/log/syslog
pattern = "should be repaired" pattern = "is marked as crashed and should be repaired"
mailto = ADRESSE-MAIL-ALERTE mailto = monitoring@example.com
template = /etc/log2mail/template.mysql template = /etc/log2mail/template.mysql
file = /var/log/syslog file = /var/log/syslog
pattern = "try to repair it" pattern = "init function returned error"
mailto = ADRESSE-MAIL-ALERTE mailto = monitoring@example.com
template = /etc/log2mail/template.mysql template = /etc/log2mail/template.mysql
file = /var/log/syslog file = /var/log/syslog
pattern = "InnoDB: Fatal error" pattern = "try to repair it"
mailto = ADRESSE-MAIL-ALERTE mailto = monitoring@example.com
template = /etc/log2mail/template.mysql template = /etc/log2mail/template.mysql
file = /var/log/syslog file = /var/log/syslog
pattern = "as a STORAGE ENGINE failed" pattern = "InnoDB: Fatal error"
mailto = ADRESSE-MAIL-ALERTE mailto = monitoring@example.com
template = /etc/log2mail/template.mysql template = /etc/log2mail/template.mysql
file = /var/log/syslog
pattern = "as a STORAGE ENGINE failed"
mailto = monitoring@example.com
template = /etc/log2mail/template.mysql
~~~ ~~~
Le fichier `/etc/log2mail/template.mysql` contenant : Le fichier `/etc/log2mail/template.mysql` contenant :
@ -707,7 +731,7 @@ Yours,
log2mail. log2mail.
~~~ ~~~
Note : il faut ajouter l'utilisateur `log2mail` dans le groupe `adm`. *Note* : il faut ajouter l'utilisateur `log2mail` dans le groupe `adm`.
## Gestion des binlogs ## Gestion des binlogs
@ -719,6 +743,7 @@ Par défaut, MySQL stocke chaque requête en écriture dans des fichiers appelé
Par défaut les binlogs sont conservés sur 10 jours, avec des fichiers n'excédant pas 100 Mo : Par défaut les binlogs sont conservés sur 10 jours, avec des fichiers n'excédant pas 100 Mo :
~~~{.ini} ~~~{.ini}
[mysqld]
#log_bin = /var/log/mysql/mysql-bin.log #log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10 expire_logs_days = 10
max_binlog_size = 100M max_binlog_size = 100M
@ -729,7 +754,7 @@ binlog_format = mixed
### Format ### Format
http://dev.mysql.com/doc/refman/5.5/en/binary-log-setting.html <http://dev.mysql.com/doc/refman/5.5/en/binary-log-setting.html>
On peut choisir 3 types de format pour les binlogs : On peut choisir 3 types de format pour les binlogs :
@ -765,7 +790,8 @@ mysql> PURGE BINARY LOGS BEFORE "2011-12-07 00:00:00";
Pour désactiver les binlogs, on ajoutera l'option suivante dans la configuration : Pour désactiver les binlogs, on ajoutera l'option suivante dans la configuration :
~~~ ~~~{.ini}
[mysqld]
disable-log-bin disable-log-bin
~~~ ~~~
@ -777,12 +803,12 @@ On pourra lire en ligne de commande le contenu d'un binlog via la commande :
# mysqlbinlog /var/log/mysql/mysql-bin.001789 | less # mysqlbinlog /var/log/mysql/mysql-bin.001789 | less
~~~ ~~~
Note : si vous obtenez une erreur `mysqlbinlog: unknown variable 'default-character-set=utf8'` c'est que la directive `default-character-set` * Note* : si vous obtenez une erreur `mysqlbinlog: unknown variable 'default-character-set=utf8'` c'est que la directive `default-character-set`
a été placée dans la configuration MySQL (`/etc/mysql` ou `.my.cnf`) dans la mauvaise section : `[client]` au lieu de `[mysql]` (ou `[mysqldump]`). a été placée dans la configuration MySQL (`/etc/mysql` ou `.my.cnf`) dans la mauvaise section : `[client]` au lieu de `[mysql]` (ou `[mysqldump]`).
### Replay ### Replay
**ATTENTION, CES MANIPULATIONS PEUVENT ÊTRE DANGEREUSES VOS DONNÉES, BIEN SAVOIR CE QUE L'ON FAIT.** /!\\ **ATTENTION, CES MANIPULATIONS PEUVENT ÊTRE DANGEREUSES VOS DONNÉES, BIEN SAVOIR CE QUE L'ON FAIT ! **
On pourra ainsi injecter le contenu d'un binlog dans une base… tout simplement avec une commande du type : On pourra ainsi injecter le contenu d'un binlog dans une base… tout simplement avec une commande du type :
@ -798,19 +824,18 @@ On pourra ainsi injecter le contenu d'un binlog dans une base… tout simplement
# cat mysql-bin.001789.txt | mysql -P3307 # cat mysql-bin.001789.txt | mysql -P3307
~~~ ~~~
### Log des requêtes lentes ### Log des requêtes lentes
Pour débugger les applications lentes, c'est une fonctionnalité intéressante de trouver quelle requête est longue. Pour débugger les applications lentes, c'est une fonctionnalité intéressante de trouver quelle requête est longue.
Pour cela on peut spécifier quand une requête est considérée comme longue, le chemin où stocker les requêtes, et l'activation des logs. Pour cela on peut spécifier quand une requête est considérée comme longue, le chemin où stocker les requêtes, et l'activation des logs.
~~~{.ini} ~~~{.ini}
long_query_time = 2 #Default 10 ! [mysqld]
long_query_time = 5
slow_query_log = 1 slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log slow_query_log_file = /var/log/mysql/slow.log
~~~ ~~~
## Multiples instances MySQL ## Multiples instances MySQL
Il est possible de faire fonctionner plusieurs instances de MySQL sur un serveur ; chacune avec ses propres données et sa propre configuration. Il est possible de faire fonctionner plusieurs instances de MySQL sur un serveur ; chacune avec ses propres données et sa propre configuration.
@ -830,55 +855,51 @@ et de rajouter ces lignes (_à voir l'utilité en fait…_)
user = mysqladmin user = mysqladmin
~~~ ~~~
Créez un utilisateur pour l'instance (il doit avoir un shell valide comme `/bin/sh`) : Créer un utilisateur pour l'instance (il doit avoir un shell valide comme `/bin/sh`) :
~~~ ~~~
useradd mysql-INSTANCE_NAME # useradd mysql-foo
~~~ ~~~
Créez ensuite le « datadir » : Créer ensuite le *datadir* :
~~~ ~~~
# mysql_install_db --datadir=/home/mysql/INSTANCE_NAME # mysql_install_db --datadir=/srv/mysql-instances/foo
# chown -R mysql-INSTANCE_NAME:mysql-INSTANCE_NAME /home/mysql/INSTANCE_NAME # chown -R mysql-foo:mysql-foo /srv/mysql-instances/foo
# chmod 700 /home/mysql/INSTANCE_NAME # chmod 700 /srv/mysql-instances/foo
~~~ ~~~
**Note** : Sous Debian Etch, l'option `--user` n'est pas présente. Ajouter ces lignes dans `/etc/mysql/conf.d/zzz_evolinux.cnf` :
Ajoutez ces lignes dans `/etc/mysql/my.cnf` :
~~~{.ini} ~~~{.ini}
[mysqld1] [mysqld1]
mysqld = /usr/bin/mysqld_safe mysqld = /usr/bin/mysqld_safe
user = mysql-INSTANCE_NAME user = mysql-foo
port = 3307 port = 3307
socket = /var/run/mysqld-INSTANCE_NAME/mysqld.sock socket = /var/run/mysqld-foo/mysqld.sock
pid-file = /var/run/mysqld-INSTANCE_NAME/mysqld.pid pid-file = /var/run/mysqld-foo/mysqld.pid
datadir = /home/mysql-INSTANCE_NAME datadir = /home/mysql-foo
~~~ ~~~
**Note 1** : même si l'on ne prévoit pas de faire tourner le mysqld principal sur le port 3306, *Note 1* : même si l'on ne prévoit pas de faire tourner le mysqld principal sur le port 3306,
on préfèrera tout de même utiliser le port 3307 pour la première instance afin de ne pas on préfère tout de même utiliser le port 3307 pour la première instance afin de ne pas
confondre une configuration avec et sans instance. confondre une configuration avec et sans instance.
**Note 2** : dans le cas où une réplication est déjà active sur l'instance principale, la nouvelle instance créée va automatiquement hériter des paramètres de réplication. *Note 2* : dans le cas où une réplication est déjà active sur l'instance principale, la nouvelle instance créée va automatiquement hériter des paramètres de réplication.
Pour éviter ça, il suffit de rajouter : Pour éviter ça, il suffit de rajouter :
~~~{.ini} ~~~{.ini}
[mysqld1] [mysqld1]
skip-slave-start skip-slave-start
~~~ ~~~
Créez le répertoire qui contiendra le socket et le fichier PID : Créer le répertoire qui contiendra le socket et le fichier PID :
~~~ ~~~
mkdir /var/run/mysqld-INSTANCE_NAME # mkdir /var/run/mysqld-foo
chown mysql-INSTANCE_NAME:mysql-INSTANCE_NAME /var/run/mysqld-INSTANCE_NAME # chown mysql-foo:mysql-foo /var/run/mysqld-foo
~~~
Puis lancez la nouvelle instance : Puis lancer la nouvelle instance :
~~~ ~~~
# mysqld_multi start 1 # mysqld_multi start 1
@ -904,7 +925,7 @@ On préfère passer la commande « shutdown » en interne :
### Nettoyage ### Nettoyage
Si le mysqld principal n'est pas utilisé, on désactivera le script d'init.d /etc/init.d/mysql (en ajoutant `exit 0` Si le *mysqld* principal n'est pas utilisé, on désactivera le script d'init.d /etc/init.d/mysql (en ajoutant `exit 0`
au début du script) et on pourra se créer un script `/etc/init.d/mysql-instance` du type : au début du script) et on pourra se créer un script `/etc/init.d/mysql-instance` du type :
~~~{.bash} ~~~{.bash}