Spec-Zone.ru › MySQL 9.2

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: 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.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/mysql-cluster-install-example-data.html

Spec-Zone.ru

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