25.3.5 Пример NDB Cluster с таблицами и данными
Информация в этом разделе относится к NDB Cluster, работающему как на платформах Unix, так и Windows.
Работа с таблицами и данными в NDB Cluster мало чем отличается от работы со стандартным MySQL. Важно учитывать два ключевых момента:
-
Для того, чтобы таблица была реплицирована в кластере, она должна использовать хранилище
NDBCLUSTER. Для указания этого используйте параметрENGINE=NDBCLUSTERилиENGINE=NDBпри создании таблицы:CREATE TABLE
tbl_name(col_namecolumn_definitions) ENGINE=NDBCLUSTER;В качестве альтернативы, для существующей таблицы, использующей другой движок хранения, используйте
ALTER TABLE, чтобы изменить таблицу на использованиеNDBCLUSTER:ALTER TABLE
tbl_nameENGINE=NDBCLUSTER; Каждая таблица
NDBCLUSTERимеет первичный ключ. Если пользователь не определяет первичный ключ при создании таблицы, движокNDBCLUSTERавтоматически генерирует скрытый. Такой ключ занимает место, как и любой другой индекс таблицы. (Не редко возникают проблемы из-за недостаточной памяти для размещения автоматически созданных индексов.)
Если вы импортируете таблицы из существующей базы данных, используя вывод mysqldump, вы можете открыть SQL скрипт в текстовом редакторе и добавить параметр ENGINE к любому утверждению создания таблицы или заменить существующие параметры ENGINE. Предположим, что у вас есть пример базы данных world на другом сервере MySQL, не поддерживающем NDB Cluster, и вы хотите экспортировать таблицу City:
$> mysqldump --add-drop-table world City > city_table.sql
Полученный city_table.sql файл содержит это утверждение создания таблицы (и утверждения INSERT, необходимые для импорта данных таблицы):
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;
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)
Вы должны убедиться, что MySQL использует хранилище NDBCLUSTER для этой таблицы. Есть два способа этого. Один из них — изменить определение таблицы перед импортом в базу данных Cluster. Используя таблицу City в качестве примера, измените параметр ENGINE в определении следующим образом:
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);
(remaining INSERT statements omitted)
Это необходимо сделать для определения каждой таблицы, которая должна быть частью кластеризованной базы данных. Самый простой способ — выполнить поиск и замену в файле, содержащем определения, и заменить все вхождения ENGINE= на engine_nameENGINE=NDBCLUSTER. Если вы не хотите изменять файл, вы можете использовать неизменённый файл для создания таблиц, а затем использовать ALTER TABLE для изменения их движка хранения. Подробности приводятся позже в этом разделе.
Предполагая, что вы уже создали базу данных с именем world на узле SQL кластера, вы можете использовать командную строку mysql для чтения city_table.sql и создать и заполнить соответствующую таблицу обычным способом:
$> mysql world < city_table.sql
Очень важно помнить, что указанная команда должна быть выполнена на хосте, где запущен узел SQL (в данном случае, на машине с IP-адресом 198.51.100.20).
Для создания копии всей базы данных world на узле SQL используйте mysqldump на сервере без кластера для экспорта базы данных в файл с именем world.sql (например, в каталоге /tmp). Затем измените определения таблиц, как описано выше, и импортируйте файл в узел SQL кластера так:
$> mysql world < /tmp/world.sql
Если вы сохранили файл в другом месте, соответствующим образом измените предыдущие инструкции.
Выполнение запросов SELECT на узле SQL ничем не отличается от их выполнения на любом другом экземпляре сервера MySQL. Для выполнения запросов из командной строки сначала нужно войти в монитор MySQL обычным способом (указать пароль root на приглашении Enter
password:):
$> 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: 9.2.0-ndb-9.2.0
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
Мы просто используем учётную запись root сервера MySQL и предполагаем, что вы соблюдали стандартные меры предосторожности при установке сервера MySQL, включая установку надёжного пароля root. Дополнительную информацию можно найти в Разделе 2.9.4, «Обеспечение безопасности начальной учётной записи MySQL».
Стоит учесть, что узлы NDB Cluster не используют систему привилегий MySQL при взаимодействии друг с другом. Установка или изменение учётных записей пользователей MySQL (включая учётную запись root) влияет только на приложения, обращающиеся к узлу SQL, а не на взаимодействие между узлами. Дополнительную информацию см. в Разделе 25.6.21.2, «NDB Cluster и привилегии MySQL».
Если вы не изменили пункты ENGINE в определениях таблиц перед импортом SQL скрипта, выполните следующие утверждения на этом этапе:
mysql> USE world;
mysql> ALTER TABLE City ENGINE=NDBCLUSTER;
mysql> ALTER TABLE Country ENGINE=NDBCLUSTER;
mysql> ALTER TABLE CountryLanguage ENGINE=NDBCLUSTER;
Выборка базы данных и выполнение запроса SELECT к таблице в этой базе данных также выполняются обычным способом, как и выход из монитора MySQL:
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
$>
Приложения, использующие MySQL, могут использовать стандартные API для доступа к таблицам NDB. Важно помнить, что ваше приложение должно обращаться к узлу SQL, а не к узлам управления или данных. Этот краткий пример показывает, как можно выполнить показанный ранее запрос SELECT с помощью расширения PHP 5.X mysqli, работающего на веб-сервере в другой части сети:
<!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
# connect to SQL node:
$link = new mysqli('198.51.100.20', 'root', 'root_password', 'world');
# parameters for mysqli constructor are:
# host, user, password, database
if( mysqli_connect_errno() )
die("Connect failed: " . mysqli_connect_error());
$query = "SELECT Name, Population
FROM City
ORDER BY Population DESC
LIMIT 5";
# if no errors...
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>
<?
# then display the results...
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>
<?
# ...and verify the number of rows that were retrieved
printf("<p>Affected rows: %d</p>\n", $link->affected_rows);
}
else
# otherwise, tell us what went wrong
echo mysqli_error();
# free the result set and the mysqli connection object
$result->close();
$link->close();
?>
</body>
</html>
Мы предполагаем, что процесс, работающий на веб-сервере, может получить доступ к IP-адресу узла SQL.
Аналогичным образом, вы можете использовать MySQL C API, Perl-DBI, Python-mysql или MySQL Connectors для выполнения задач определения и манипулирования данными так же, как вы обычно делаете с MySQL.
© 2025 Oracle
Licensed under the GPLv2 License.