Der Umgang mit Daten im MySQL Cluster ist ganz ähnlich wie in einer MySQL-Konfiguration ohne Cluster. Nur auf zwei Dinge muss man achten:
Damit eine Tabelle im Cluster repliziert wird, muss die
Speicher-Engine NDB Cluster
mit der
Option ENGINE=NDB
oder der Tabellenoption
ENGINE=NDBCLUSTER
eingeschaltet sein. Dies
können Sie tun, wenn Sie die Tabelle anlegen:
CREATE TABLE tbl_name
( ... ) ENGINE=NDBCLUSTER;
Alternativ können Sie eine bereits vorhandene Tabelle, die
eine andere Speicher-Engine verwendet, mit ALTER
TABLE
auf NDB Cluster
umstellen:
ALTER TABLE tbl_name
ENGINE=NDBCLUSTER;
Jede NDB
-Tabelle
muss einen Primärschlüssel haben.
Wenn der Benutzer beim Anlegen der Tabelle keinen definiert,
wird von der Speicher-Engine NDB Cluster
automatisch ein verborgener Primärschlüssel generiert.
(Hinweis: Dieser verborgene
Schlüssel belegt Platz wie jeder andere Tabellenindex auch.
Nicht selten treten Speicherplatzprobleme auf, wenn diese
automatisch angelegten Indizes untergebracht werden
müssen.)
Wenn Sie aus der Ausgabe von mysqldump
Tabellen aus einer vorhandenen Datenbank importieren, können
Sie das SQL-Skript mit einem Editor öffnen und die Option
ENGINE
für alle Anweisungen einstellen, in
denen Tabellen angelegt werden, oder eine eventuell vorhandene
ENGINE
- (oder TYPE
-)Option
ersetzen. Nehmen wir an, Sie haben die Beispieldatenbank
world
auf einem anderen MySQL Server liegen,
der MySQL Cluster nicht unterstützt, und Sie möchten die
Tabelle City
exportieren:
shell> mysqldump --add-drop-table world City > city_table.sql
Die resultierende city_table.sql
-Datei
enthält die folgende Anweisung zur Erzeugung einer Tabelle (und
die notwendigen INSERT
-Anweisungen, um die
Tabellendaten zu importieren):
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=MyISAM DEFAULT CHARSET=latin1;
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);
(restliche INSERT-Anweisungen ausgelassen)
Sie müssen gewährleisten, dass MySQL die Speicher-Engine NDB
für diese Tabelle verwendet. Dazu ändern Sie die
Tabellendefinition vor dem Import in die
Cluster-Datenbank. Die Definition der Tabelle
City
würde zum Beispiel folgendermaßen
modifiziert:
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 DEFAULT CHARSET=latin1;
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)
Dies müssen Sie mit der Definition jeder Tabelle tun, die in
die geclusterte Datenbank importiert werden soll. Am einfachsten
erreichen Sie dies, indem Sie in der Datei mit den
Tabellendefinitionen alle Vorkommen von
TYPE=MyISAM
oder
ENGINE=MyISAM
durch
ENGINE=NDBCLUSTER
ersetzen. Wenn Sie die
Datei nicht ändern möchten, können Sie die Tabellen auch mit
der unveränderten Datei anlegen und dann ihren Typ mit
ALTER TABLE
ändern. Die Einzelheiten
erfahren Sie in einem späteren Abschnitt.
Wenn wir davon ausgehen, dass Sie bereits eine Datenbank namens
world
auf dem SQL-Knoten des Clusters
angelegt haben, können Sie nun
city_table.sql
mit dem
Kommandozeilen-Client mysql lesen und die
entsprechende Tabelle in der üblichen Weise mit Daten füllen:
shell> mysql world < city_table.sql
Dieser Befehl muss unbedingt auf dem Host ausgeführt werden,
auf welchem der SQL-Knoten läuft (in diesem Fall auf der
Maschine mit der IP-Adresse 192.168.0.20
).
Um eine Kopie der gesamten world
-Datenbank
auf dem SQL-Knoten anzulegen, führen Sie
mysqldump auf dem ungeclusterten Server aus,
um die Datenbank in die Datei world.sql
im
Verzeichnis /usr/local/mysql/data
zu
exportieren. Danach importieren Sie diese Datei folgendermaßen
in den SQL-Knoten des Clusters:
shell>cd /usr/local/mysql/data
shell>mysql world < world.sql
Wenn Sie die Datei an einer anderen Stelle speichern, müssen Sie die obigen Anleitungen entsprechend abändern.
Sie müssen wissen, dass NDB Cluster
in MySQL
5.1 nicht die selbstständige Erkennung von
Datenbanken unterstützt (siehe
Abschnitt 16.8, „Bekannte Beschränkungen von MySQL Cluster“). Mit anderen
Worten: Sobald Sie die Datenbank world
und
ihre Tabellen auf einem Datenknoten angelegt haben, müssen Sie
die Anweisung CREATE SCHEMA world
mit
nachfolgendem FLUSH TABLES
auf jedem
SQL-Knoten im Cluster erteilen. Nur dann kann der Knoten die
Datenbank erkennen und ihre Tabellendefinitionen lesen.
SELECT
-Anfragen werden auf dem SQL-Knoten
genau wie auf jedem anderen MySQL Server ausgeführt. Um
Anfragen auf der Kommandozeile auszuführen, müssen Sie sich
zuerst wie üblich in den MySQL Monitor einloggen (das Passwort
von root
am Enter
password:
-Prompt eingeben):
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: 5.1.5-alpha
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
Wir verwenden einfach das root
-Konto des
MySQL Servers und gehen davon aus, dass Sie bei der Installation
des MySQL Servers die Standardsicherheitsvorkehrungen getroffen
und ein starkes root
-Passwort eingerichtet
haben. Mehr darüber lesen Sie unter
Abschnitt 2.9.3, „Einrichtung der anfänglichen MySQL-Berechtigungen“.
Bitte achten Sie darauf, dass Cluster-Knoten, wenn sie
aufeinander zugreifen, nicht von dem MySQL-Berechtigungssystem
Gebrauch machen. Die Einrichtung oder Änderung von
MySQL-Benutzerkonten (einschließlich root
)
wirkt sich nur auf Anwendungen aus, die auf den SQL-Knoten
zugreifen, aber nicht auf die Interaktion zwischen den Knoten.
Wenn Sie die ENGINE
-Klauseln in den
Tabellendefinitionen vor dem Import des SQL-Skripts nicht
geändert hatten, sollten Sie nun folgende Anweisungen
ausführen:
mysql>USE world;
mysql>ALTER TABLE City ENGINE=NDBCLUSTER;
mysql>ALTER TABLE Country ENGINE=NDBCLUSTER;
mysql>ALTER TABLE CountryLanguage ENGINE=NDBCLUSTER;
Auch die Auswahl einer Datenbank und die Ausführung einer SELECT-Anfrage auf einer Tabelle dieser Datenbank sowie das Schließen des MySQL Monitors funktionieren wie üblich:
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>
Anwendungen, die MySQL nutzen, können ihre Standard-APIs auch
für den Zugriff auf NDB-Tabellen verwenden. Bitte denken Sie
jedoch daran, dass Ihre Anwendung auf den SQL-Knoten zugreifen
muss, und nicht auf den MGM- oder die Speicherknoten. Das
folgende kleine Beispiel zeigt, wie die obige
SELECT
-Anweisung mithilfe der
mysqli
-Erweiterung von PHP 5 ausgeführt
wird, die auf einem Webserver irgendwo anders im Netzwerk
läuft:
<!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>SIMPLE mysqli SELECT</title>
</head>
<body>
<?php
# Verbindung zum SQL-Knoten:
$link = new mysqli('192.168.0.20', 'root', 'root_password
', 'world');
# Die Parameter für den mysqli-Konstruktor sind:
# Host, User, Passwort, Datenbank
if( mysqli_connect_errno() )
die("Connect failed: " . mysqli_connect_error());
$query = "SELECT Name, Population
FROM City
ORDER BY Population DESC
LIMIT 5";
# wenn keine Fehler auftreten...
if( $result = $link->query($query) )
{
?>
<table border="1" width="40%" cellpadding="4" cellspacing ="1">
<tbody>
<tr>
<th width="10%">City</th>
<th>Population</th>
</tr>
<?
# dann zeige Ergebnisse an...
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>
<?
# ...und prüfe, wie viele Zeilen abgerufen wurden
printf("<p>Affected rows: %d</p>\n", $link->affected_rows);
}
else
# anderenfalls sag uns, was schief gegangen ist
echo mysqli_error();
# gib die Ergebnismenge und das mysqli-Verbindungsobjekt frei
$result->close();
$link->close();
?>
</body>
</html>
Wir setzen voraus, dass der Prozess, der auf dem Webserver läuft, die IP-Adresse des SQL-Knotens erreichen kann.
In gleicher Weise können Sie die MySQL C-API, Perl-DBI, Python-mysql oder die eigenen Connectors der MySQL AB einsetzen, um die Aufgaben der Datendefinition und Datenbearbeitung genau so zu erledigen, wie Sie es auch normalerweise mit MySQL tun.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.