16 Tables InnoDB
Manuel de Référence MySQL 4.1 : Version Française
. Présentation des tables InnoDB . Informations de contact InnoDB . InnoDB avec MySQL version 3.23 ->Configuration InnoDB . Options de démarrage InnoDB . Créer des bases InnoDB . Créer des tables InnoDB . Ajouter et retirer des données et des logs InnoDB . Sauver et restaurer une base InnoDB . Transférer une base de données InnoDB vers une autre machine . Modèle de transactions et verrouillage InnoDB . Conseils pour l'amélioration des performances InnoDB . Implémentation du multi-versionnage . Structures de tables et d'index . Gestion de l'espace fichiers et des entrées/sorties disque . Gestion des erreurs InnoDB . Restrictions sur les tables InnoDB . Résolution de problèmes avec InnoDB
|
16.4 Configuration InnoDB Pour utiliser les tables
InnoDB
en MySQL versions 3.23,
voyez
InnoDB
en MySQL 3.23 .
En MySQL 4.0, vous n'avez rien à faire pour obtenir le support
des tables
InnoDB
. Si vous ne souhaitez pas utiliser les tables
InnoDB
, vous pouvez ajouter l'option
skip-innodb
dans
votre fichier d'options MySQL.
Les deux ressources disques importantes gérées par
InnoDB
sont
sa table de données et son fichier de log.
Si vous ne spécifiez aucune options de configuration
InnoDB
, MySQL 4.0 et
plus récent créera un fichier de données auto-croissant appelé
ibdata1
et
deux fichiers de log de 5 Mo appelés
ib_logfile0
et
ib_logfile1
dans le
dossier de données MySQL. En MySQL 4.0.0 et 4.0.1, le fichier de données est de
64Mo et pas auto-croissant. En MySQL 3.23,
InnoDB
ne démarrera pas si vous
ne fournissez pas d'options de configuration.
Note
: pour obtenir les meilleures performances, vous devez
explicitement configurer les paramètres InnoDB dans les exemples ci-dessous.
Naturellement, il vous faudra adapter les configurations à votre architecture.
Pour configurer le fichier de données
InnoDB
, utilisez l'option
innodb_data_file_path
dans la section
[mysqld]
du fichier
my.cnf
. Sous Windows, vous pouvez utiliser
my.ini
à la place.
La valeur de
innodb_data_file_path
doit être une liste d'un ou plusieurs
fichiers. Si vous indiquez plusieurs fichiers, séparez les noms par des caractères
points-virgule (
';'
) :
innodb_data_file_path=datafile_spec1[;datafile_spec2]...
|
Par exemple, une configuration qui crée explicitement un espace de
table, avec les mêmes caractéristiques que la configuration par défaut
de MySQL 4.0 est :
[mysqld] innodb_data_file_path=ibdata1:10M:autoextend
|
Cette configuraiton crée un fichier de données de 10 Mo
ibdata1
, auto-croissant.
Il n'y a pas de dossier de sauvegarde d'indiqué : par défaut, c'est le dossier
de données de MySQL.Les tailles sont spécifiées avec les suffixes
M
et
G
pour indiquer
des Mo et des Go.
Une table contenant 50Mo de données, appelée
ibdata1
et
un fichier 50Mo auto-croissant, appelé
ibdata2
dans le dossier de données
est configuré comme ceci :
[mysqld] innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
|
La syntaxe complète de la spécification de fichier de données inclut le nom
du fichier, sa taille, et différents attributs :
file_name:file_size[:autoextend[:max:max_file_size]]
|
L'attribut
autoextend
et ceux qui le suivent peuvent être utilisés uniquement
pour le dernier fichier de données de la ligne
innodb_data_file_path
.
autoextend
est disponible depuis MySQL 3.23.50 et 4.0.2.Si vous spécifiez le dernier fichier avec l'option
autoextend
,
InnoDB
va augmenter la taille du dernier fichier de données jusqu'à ce qu'il n'y ait plus
de place dans l'espace de table. Les incréments se feront par bloc de 8 Mo.
Si le disque est plein, vous aurez à ajouter un autre fichier sur un autre
disque. Les informations pour reconfigurer une table existante sont données
dans la section Ajout et suppression des fichiers de logs et de données
InnoDB
.
InnoDB
ne connait pas la taille maximale des fichiers sur votre système :
il faut donc être prudent lorsque la taille des fichiers ne peut dépasser 2Go.
Pour spécifier la taille maximale des fichiers auto-croissant, utilisez l'attribut
max
.
La ligne de configuration suivante permet au fichier
ibdata1
de croitre jusqu'à
500Mo :
[mysqld] innodb_data_file_path=ibdata1:10M:autoextend:max:500M
|
InnoDB
crée les fichiers de données dans le dossier de données de MySQL.
Pour spécifier explicitement un dossier, utilisez l'option
innodb_data_home_dir
.
Par exemple, pour créer deux fichiers appelés
ibdata1
et
ibdata2
mais
pour les placer dans le dossier
/ibdata
, configurez
InnoDB
comme ceci :
[mysqld] innodb_data_home_dir = /ibdata innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
|
Note :
InnoDB
ne crée pas les dossiers : assurez vous que
/ibdata
existe avant de lancer le serveur. C'est aussi vrai pour les fichiers
de log. Utilisez la commande Unix et DOS
mkdir
pour créer les dossiers nécessaires.
InnoDB
forme le chemin de chaque fichier en concaténant textuellement
la valeur de
innodb_data_home_dir
devant le nom du fichier, en ajoutant
un slash si nécessaire. Si l'option
innodb_data_home_dir
n'est pas mentionnée
dans
my.cnf
, la valeur par défaut est le dossier ``point''
./
, c'est
à dire le dossier de données de MySQL.
Si vous spécifier l'option
innodb_data_home_dir
sous forme de chaîne vide, vous pouvez
spécifier des noms de chemins absolus dans la valeur de
innodb_data_file_path
. L'exemple ci-desosus est équivalent au précédent :
[mysqld] innodb_data_home_dir = innodb_data_file_path=/ibdata/ibdata1:50M;/ibdata/ibdata2:50M:autoextend
|
Exemple de fichier
my.cnf
simple
Supposons que vous avez
un serveur avec 128 Mo de RAM et un disque dur. Voici un exemple de configuration
de fichier
my.cnf
ou
my.ini
pour
InnoDB
. Nous supposons que vous
exécutez MySQL-Max-3.23.50 ou plus récent, ou MySQL-4.0.2 ou plus récent,
qui utilisent l'attribut
autoextend
.Cet exemple devrait convenir à une majorité d'utilisateurs, Unix et Windows,
qui ne souhaitent pas répartir leur fichiers de données
InnoDB
et leurs logs
sur plusieurs disques. Cette configuration crée un fichier de données auto-croissant,
appelé
ibdata1
et deux fichiers de log
InnoDB
ib_logfile0
et
ib_logfile1
dans le dossier de données MySQL. De plus, le petit fichier
d'archive
InnoDB
ib_arch_log_0000000000
sera placé dans
datadir
.
[mysqld] # Vous pouvez placer d'autres options MYSQL ici # ... # Le fichier de données doit contenir vos données et index. # Assurez vous que vous avez l'espace disque nécessaire. innodb_data_file_path = ibdata1:10M:autoextend # # Utilisez un buffer de taille 50 à 80 % de votre mémoire serveur set-variable = innodb_buffer_pool_size=70M set-variable = innodb_additional_mem_pool_size=10M # # Utiisez un fichier de log de taille 25 % du buffer mémoire set-variable = innodb_log_file_size=20M set-variable = innodb_log_buffer_size=8M # innodb_flush_log_at_trx_commit=1
|
Vérifiez que le serveur MySQL a les droits de créer ces fichiers dans
le
datadir
. Plus généralement, le serveur doit avoir les droits d'accès
dans les dossiers où il va créer des fichiers, de données ou de log.Notez que le fichier de données doit être inférieure à 2Go sur certains systèmes
d'exploitation. La taille combinée des fichiers de log doit être inférieure à 4Go.
La taille combinée des fichiers de données doit être inférieure à 10Go.
Lorsque vous créez pour la première fois une base de données
InnoDB
,
il est mieux de lancer le serveur depuis la commande en ligne.
InnoDB
va afficher des informations sur la création de la base, et vous verrez
commence ça se passe. Voyez la section plus bas, pour une illustration.
Par exemple, sous Windows, vous pouvez démarrer
mysqld-max.exe
, qui
est stocké dans
C:\mysql\bin
, vous pouvez le démarrer comme ceci :
C:\> C:\mysql\bin\mysqld-max --console
|
Si vous n'envoyez par de données sur l'écran, vérifiez le fichier de log
pour savoir ce que
InnoDB
a indiqué durant le lancement.
Voyez Créer un Tablespace
InnoDB
pour un exemple des informations
affichées par
InnoDB
.
Où mettre le fichier d'options sous Windows?
Les règles sous Windows sont les suivantes :
-
Un seul des deux fichiers
my.cnf
ou
my.ini
doit être créé.
-
Le fichier
my.cnf
doit être placé dans le dossier racine du disque
C:
.
-
Le fichier
my.ini
doit être placé dans le dossier
WINDIR
, e.g,
C:\WINDOWS
ou
C:\WINNT
. Vous pouvez utiliser la commande
SET
de MS-DOS pour afficher la valeur de
WINDIR
:
C:\> SET WINDIR windir=C:\WINNT
|
-
Si votre PC utilise un gestionnaire de démarrage où le
C:
n'est pas
votre disque de démarrage, alors votre seule option est d'utilise le fichier
my.ini
.
Oz placer les fichiers d'options sous Unix?
Sous Unix,
mysqld
lit les options dans les fichiers suivants, s'ils
existent, et dans cet ordre :
-
/etc/my.cnf
Options globales.
-
COMPILATION_DATADIR/my.cnf
Options spécifiques au serveur.
-
defaults-extra-file
Le fichier spécifié avec
--defaults-extra-file=...
.
-
~/.my.cnf
Options spécifiques à l'utilisateur.
COMPILATION_DATADIR
est le dossier de données de MySQL qui a été spécifié
lors de l'utilisation du script
./configure
, avant la compilation de
mysqld
.
(typiquement,
/usr/local/mysql/data
pour une installation binaire, ou
/usr/local/var
pour une installation source).
Si vous voulez vous assurer que
mysqld
lit les options uniquement depuis
un fichier spécifique, vous pouvez utiliser l'option
--defaults-option
comme première
option de ligne de commande, au démarrage du serveur :
mysqld --defaults-file=your_path_to_my_cnf
|
Exemple de fichier
my.cnf
complexe :
supposons que vous avez un serveur
Linux avec 2 Go de RAM et trois disques de 60 Go (situés dans les
dossiers
/
,
/dr2
et
/dr3
. Voici ci-dessous un exemple
de configuration possible pour
my.cnf
, de
InnoDB
.
[mysqld] # Vous pouvez placer d'autres options MYSQL ici # ... innodb_data_home_dir = # # Le fichier de données doivent contenir vos données et index. innodb_data_file_path = /ibdata/ibdata1:2000M;/dr2/ibdata/ibdata2:2000M:autoextend # # Utilisez un buffer de taille 50 à 80 % de votre mémoire serveur # mais assurez vous sous Linux que l'utilisation totale est inférieure à 2Go set-variable = innodb_buffer_pool_size=1G set-variable = innodb_additional_mem_pool_size=20M innodb_log_group_home_dir = /dr3/iblogs # # innodb_log_arch_dir doit être le même que innodb_log_group_home_dir # (starting from 4.0.6, you can omit it) innodb_log_arch_dir = /dr3/iblogs set-variable = innodb_log_files_in_group=2 # # Utilisez un fichier de log de taille 15 % du buffer mémoire set-variable = innodb_log_file_size=250M set-variable = innodb_log_buffer_size=8M # innodb_flush_log_at_trx_commit=1 set-variable = innodb_lock_wait_timeout=50 # # Décommentez les prochaines lignes, si vous voulez les utiliser #innodb_flush_method=fdatasync #set-variable = innodb_thread_concurrency=5
|
Notez que nous avons placé deux fichier de données sur des disques
différents.
InnoDB
va remplir l'espace de tables jusqu'au maximum.
Dans certains cas, les performances seront améliorées si les données
ne sont pas toutes placées sur le même disque physique. Placer les fichiers
de log dans des disques séparés est souvent une bonne chose. Vous pouvez aussi
utiliser des partitions de disques brutes (
raw devices
) comme fichier
de données. Utiliser les
Raw Devices
pour l'espace de tables .
Attention
: en Linux x86, vous devez être très prudent, et
ne pas utiliser trop de mémoire.
glibc
va autoriser les processus
à dépasser la pile de thread, et votre système va crasher. Cela représente
un risque réel si la valeur de 2 Go :
innodb_buffer_pool_size + key_buffer_size + max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) + max_connections*2MB
|
Chaque thread va utiliser une pile
(souvent 2Mo, mais les exécutables MySQL uniquement 256 ko) et dans le pire des
scénarios,
sort_buffer + read_buffer_size
de mémoire supplémentaire.Depuis MySQL 4.1, vous pouvez utiliser 64Go de mémoire physique sur Windows 32 bits.
Voyez la description de
innodb_buffer_pool_awe_mem_mb
dans
Options de démarrage
InnoDB
.
Comment optimiser d'autres paramètres du serveur
mysqld
?
Les valeurs qui conviennent à la majorité des utilisateurs sont :
[mysqld] skip-external-locking set-variable = max_connections=200 set-variable = read_buffer_size=1M set-variable = sort_buffer_size=1M # key_buffer vaut de 5 à 50% # de la RAM disponible, suivant l'utilisation des # tables MyISAM, mais gardez # key_buffer + InnoDB en deça de < 80% de votre RAM set-variable = key_buffer_size=...
|
|