Travailler avec le cluster MySQL n'est pas différent de travailler avec un serveur MySQL classique. Il y a deux points importants à garder en tête :
Les tables doivent être créées avec le moteur
ENGINE=NDB
ou
ENGINE=NDBCLUSTER
, ou doivent être
modifiée avec ALTER TABLE
pour qu'elles
utilisent le moteur NDB, afin qu'elles soivent gérées par
le cluster. Si vous importez des tables depuis une base de
données existante en utilisant le résultat de
mysqldump, vous pouvez ouvrir le script
SQL dans un éditeur de texte, et ajoutez cette option à
toutes les créations de tables, ou bien remplacez les
options ENGINE
ou
TYPE
) avec l'une des valeurs ci-dessous.
Par exemple, en supposant que vous utilisez la base
world dans un autre serveur
MySQL, qui ne supporte pas le cluster MySQL, et que vous
voulez exporter la définition de la table
CITY
:
shell> mysqldump --add-drop-table world City > city_table.sql
Le résultat du fichier city_table.sql
contient la commande de création de la table et les
commandes d'insertion INSERT
pour
importer les données dans la table :
DROP TABLE IF EXISTS City; CREATE TABLE City ( ID int(11) NOT NULL auto_increment, Name char(35) NOT NULL default '', CountryCode char(3) NOT NULL default '', District char(20) NOT NULL default '', Population int(11) NOT NULL default '0', PRIMARY KEY (ID) ) TYPE=MyISAM; INSERT INTO City VALUES (1,'Kabul','AFG','Kabol',1780000); INSERT INTO City VALUES (2,'Qandahar','AFG','Qandahar',237500); INSERT INTO City VALUES (3,'Herat','AFG','Herat',186800); # (remaining INSERT statements omitted)
Vous devez vous assurer que MySQL utilise le moteur NBD pour cette table. Il y a deux moyens pour le faire. L'un deux, avant l'importation des données dans la table, consiste à modifier la définition de la table pour qu'elle corresponde à ceci (toujours en utilisant la table City) :
DROP TABLE IF EXISTS City; CREATE TABLE City ( ID int(11) NOT NULL auto_increment, Name char(35) NOT NULL default '', CountryCode char(3) NOT NULL default '', District char(20) NOT NULL default '', Population int(11) NOT NULL default '0', PRIMARY KEY (ID) ) ENGINE=NDBCLUSTER; INSERT INTO City VALUES (1,'Kabul','AFG','Kabol',1780000); INSERT INTO City VALUES (2,'Qandahar','AFG','Qandahar',237500); INSERT INTO City VALUES (3,'Herat','AFG','Herat',186800); # (etc.)
Cela doit être fait pour la définition de chaque table qui
fait partie de la base de données en cluster. Le plus
simple pour faire cela est de faire un rechercher-remplacer
dans le fichier world.sql
et de
remplacer toutes les instances de
TYPE=MyISAM
par
ENGINE=NDBCLUSTER
. Si vous ne voulez pas
modifier ce fichier, vous pouvez aussi utiliser la commande
ALTER TABLE
; voyez plus bas pour les
spécificités.
En supposant que vous ave déjà créé la base de données
appelée world sur le noeud
SQL du clsuter, vous pouvez utiliser l'utilitaire de ligne
de commande mysql pour lire le fichier
city_table.sql
, et créer puis remplir
la table, comme ceci :
shell> mysql world < city_table.sql
Il est très important de garder en tête que lest commandes ci-dessus doivent être exécutées sur l'hôte où le noeud SQL tourne : dans ce cas, sur la machine avec l'adresse IP 192.168.0.20.
Pour créer une copie de la base de données
world sur le noeud SQL,
sauvez le fichier dans
/usr/local/mysql/data
, puis exécutez
ces commandes :
shell> cd /usr/local/mysql/data shell> mysql world < world.sql
Bien sur, le script SQL doit être lisible par l'utilisateur mysql. Si vous sauvez le fichier à un autre endroit, ajustez les chemins dans les commandes ci-dessus.
Exécuter les commandes SELECT sur un noeud SQL n'est pas différent de les exécuter sur une autre instance de serveur MySQL. Pour exécuter les requêtes SQL en ligne de commande, vous devez vous identifier sur le serveur, comme d'habitude :
shell> mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 to server version: 4.1.9-max Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>
Si vous n'avez pas modifié les clauses
ENGINE=
dans les définitions de tables,
vous pouvez alors utiliser ces commandes :
mysql> USE world; mysql> ALTER TABLE City ENGINE=NDBCLUSTER; mysql> ALTER TABLE Country ENGINE=NDBCLUSTER; mysql> ALTER TABLE CountryLanguage ENGINE=NDBCLUSTER;
Notez que nous avons simplement utilisé le compte d'administrateur par défaut, sans mot de passe. Bien entendu, dans un environnement de production, il est recommandé de toujours suivre les précautions de sécurité, y compris l'utilisation d'un mot de passe robuste pour le super utilisateur, et la création d'un compte spécifique, avec uniquement les droits nécessaires aux tâches incombantes. Pour plus de détails, voyez la section Section 5.5, « Règles de sécurité et droits d'accès au serveur MySQL ».
Il est à noter que les noeuds du cluster n'utilisent pas les droits d'accès MySQL lorsqu'ils se connectent l'un à l'autre : modifier ces droits n'a pas d'effet sur les communications entre les noeuds.
Sélectionner la base de donées et exécuter une requête
SELECT
sur une table se fait comme
d'habitude :
mysql> USE world; mysql> SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5; +-----------+------------+ | Name | Population | +-----------+------------+ | Bombay | 10500000 | | Seoul | 9981619 | | São Paulo | 9968485 | | Shanghai | 9696300 | | Jakarta | 9604900 | +-----------+------------+ 5 rows in set (0.34 sec) mysql> \q Bye shell>
Les applications qui reposent sur MySQL peuvent utiliser
l'API standard. Il est important de penser à ce que votre
application doit se connecter à un noeud SQL, et non pas
aux noeuds de stockage ou au serveur de gestion. Cet exemple
montre comment vous ourriez exécuter une requête en
utilisant l'extension mysqli
de PHP 5,
sur un serveur Web :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>Sélection de données avec mysqli</title> </head> <body> <?php # Connexion au noeud SQL : $link = new mysqli('192.168.0.20', 'root', '', 'world'); # Les paramètres pour le constructeur mysqli sont : # hote, utilisateur, mot de passe, base de données if( mysqli_connect_errno() ) { die("Connexion échouée : " . mysqli_connect_error()); } $query = "SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5"; # s'il n'y a pas d'erreur if( $result = $link->query($query) ) { ?> <table border="1" width="40%" cellpadding="4" cellspacing ="1"> <tbody> <tr> <th width="10%">Ville</th> <th>Population</th> </tr> <?php // Affichage du résultat while($row = $result->fetch_object()) printf(<tr>\n <td align=\"center\">%s</td><td>%d</td>\n</tr>\n", $row->Name, $row->Population); ?> </tbody </table> <?php // Vérification du nombre de ligne lues printf("<p>Lignes affectées : %d</p>\n", $link->affected_rows); } else # Sinon, affichage de l'erreur echo mysqli_error(); // Libération du résultat et de l'objet de connexion $result->close(); $link->close(); ?> </body> </html>
Nous supposons que le processus du serveur Web peut atteindre l'IP du noeud SQL.
De manière similaire, vous pouvez utiliser l'API C de MySQL, ou les interface Perl-DBI, Python-mysql ou encore les connecteurs de MySQL AB pour effectuer les tâches de définition de données et de manipulations, comme vous le faîtes habituellement avec un serveur MySQL.
N'oubliez pas que toutes les tables NDB doivent avoir une clé primaire. Si aucune clé primaire n'est définie par l'utilisateur lors de la création de la table, le moteur de stockage NDB va en générer une automatiquement. Note : cette clé caché prend de l'espace, comme tout autre indexe. Il n'est pas rare de rencontrer des problèmes de mémoire lorsque vous devez prendre en compte ces clés automatiques.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.