Spec-Zone.ru › MySQL 8.4

25.3.5 Пример NDB Cluster со таблицами и данными

Примечание

Информация в этом разделе применима к NDB Cluster, работающему как на платформах Unix, так и на Windows.

Работа с таблицами базы данных и данными в NDB Cluster не сильно отличается от работы со стандартным MySQL. Следует помнить две ключевые особенности:

  • Для того, чтобы таблица была реплицирована в кластере, она должна использовать NDBCLUSTER движок хранения. Для указания этого, используйте параметр ENGINE=NDBCLUSTER или ENGINE=NDB при создании таблицы:

    CREATE TABLE tbl_name (col_name column_definitions) ENGINE=NDBCLUSTER;
    

    В качестве альтернативы, для существующей таблицы, использующей другой движок хранения, воспользуйтесь ALTER TABLE, чтобы изменить использование движка на NDBCLUSTER:

    ALTER TABLE tbl_name ENGINE=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_name на ENGINE=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: 8.4.5-ndb-8.4.5

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

Мы просто используем учётную запись MySQL сервера root и предполагаем, что вы выполнили стандартные меры безопасности для установки сервера 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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/mysql-cluster-install-example-data.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API