| 7.6.1 Utiliser des liens symboliques
 7.6 Problèmes avec les disques
 7 Optimisation de MySQL
 Manuel de Référence MySQL 4.1 : Version Française
 
 . Utiliser les liens symboliques pour les bases
 ->Utiliser les liens symboliques avec les tables sous Unix
 . Utiliser des liens symboliques pour les bases de données sous Windows
 
 
 | 
  7.6.1.2 Utiliser les liens symboliques avec les tables sous Unix  
 
Avant MySQL 4.0, vous ne devez pas utiliser les liens symboliques avec les
tables, si vous n'êtes pas  
très
  prudents avec. 
Le problème est que si vous
exécutez  
ALTER TABLE
 ,  
REPAIR TABLE
  ou  
OPTIMIZE TABLE
  sur
une table symbolique, le lien sera supprimé et remplacé par le fichier
original. Cela arrive car les commandes ci-dessus fonctionnent en
créant un fichier temporaire dans le dossier de base, et lorsque l'opération
est faite, l'original est remplacé par la copie.
Vous ne devez pas utiliser des liens symboliques sur les tables, sur les
systèmes qui ne supportent pas complètement la fonction  
realpath()
 . 
(Au moins Linux et Solaris supportent  
realpath()
 ) 
En MySQL 4.0, les liens symboliques sont complètement supportés par les
tables  
MyISAM
 . Les autres types de tables vous donneront des
résultats étranges lorsque vous les utilisez comme indiqué ci-dessus.
La gestion des liens symboliques de MySQL 4.0 fonctionne comme ceci 
(uniquement pour les tables  
MyISAM
 ) : 
Dans le dossier de données, vous allez toujours trouver le fichier de
définition de table, le fichier de structure et le fichier d'index.
 
SHOW CREATE TABLE
  n'indique pas si une table a des liens symboliques,
avant la version 4.0.15. C'est aussi vrai pour  
mysqldump
 , qui utilise
 
SHOW CREATE TABLE
  pour générer les commandes  
CREATE TABLE
 .
Dans le dossier de données, vous devez toujours avoir le fichier de 
définition de table, le fichier de données et le fichier d'index.
Les fichiers de données et d'index peuvent être déplacés
ailleurs, et remplacés
dans le dossier de données par des liens symboliques. Mais le fichier 
de définition ne le peut pas.
Vous pouvez utiliser un lien symbolique avec le fichier d'index et celui
de données, pour placer ces fichiers dans d'autres dossiers.
Le lien symbolique peut être fait via le système d'exploitation (si  
mysqld
 
ne fonctionne pas) ou avec la commande  
INDEX/DATA DIRECTORY="path-to-dir"
 
dans  
CREATE TABLE
 .  
CREATE TABLE
 Syntax .
myisamchk
  ne va pas remplacer un lien symbolique avec les données
ou le fichier d'index, mais il va travailler directement sur le fichier vers
lequel le lien pointe. Tous les fichiers temporaires seront créé dans le même
dossier que le dossier qui contient les données ou le fichier d'index.
Lorsque vous détruisez une table qui utilise un lien symbolique, le fichier
et le lien symbolique sont détruits. C'est une bonne raison pour  
ne pas
  
exécuter  
mysqld
  en tant que  
root
  ou donner des droits
d'écriture à d'autres personnes dans les dossiers de données de MySQL.
Si vous renommez une table avec  
ALTER TABLE RENAME
  vous n'avez pas à 
déplacer la table dans une autre base, le lien symbolique du dossier de base
sera renommé avec le nouveau nom.
Si vous utilisez la commande  
ALTER TABLE RENAME
  pour déplacer la table dans une
autre base, la table sera déplacée dans l'autre base, et l'ancien lien
symbolique et le fichier vers lequel il pointait seront détruits (en d'autres
termes, la nouvelle table ne sera pas un lien symbolique).
Si vous n'utilisez pas de lien symbolique, vous devriez utiliser l'option
 
--skip-symlink
  de  
mysqld
  pour vous assurer que personne
n'efface ou ne renomme un fichier en dehors du dossier de données de MySQL.
 
Ce qui n'est pas encore supporté : 
 
ALTER TABLE
  ignore toutes les options  
INDEX/DATA DIRECTORY="path"
 .
BACKUP TABLE
  et  
RESTORE TABLE
  ne respectent pas les liens symboliques.
Le fichier  
.frm
 
ne doit jamais
  être un lien symbolique
(Comme indiqué précédemment, seul les fichiers d'index et de données
peuvent être des liens symboliques. Si jamais vous le faites malgré tout,
vous générerez des erreurs de cohérence.
Supposez que vous une base  
db1
  dans le dossier de données  
MySQL
 ,
et une table  
tbl1
  dans cette base, et dans le dossier  
db1
 ,
vous faites un lien symbolique  
tbl2
  qui pointe sur  
tbl1
  : 
Il va y avoir des problèmes si un thread lit  
db1.tbl1
  et qu'un autre
modifie  
db1.tbl2
 :| 
shell> cd /path/to/datadir/db1shell> ln -s tbl1.frm tbl2.frm
 shell> ln -s tbl1.MYD tbl2.MYD
 shell> ln -s tbl1.MYI tbl2.MYI
 | 
 
Le cache de requête sera induit en erreur (il va croire que  
tbl1
  
a été mis à jour, et retournera des résultats incohérents).
La commande  
ALTER
  de la table  
tbl2
  va aussi échouer. |