Spec-Zone.ru › MySQL 5.7

21.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 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)

Необходимо убедиться, что 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 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)

Это необходимо сделать для определения каждой таблицы, которая должна быть частью кластеризованной базы данных. Самый простой способ сделать это — выполнить поиск и замену в файле, содержащем определения, и заменить все вхождения TYPE=engine_name или 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: 5.7.44-ndb-7.6.34

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

mysql>

Мы просто используем учетную запись root сервера MySQL и предполагаем, что вы выполнили стандартные меры безопасности при установке сервера MySQL, включая установку надежного пароля root. Более подробная информация приведена в Разделе 2.9.4, «Защита начальной учетной записи MySQL».

Стоит учесть, что узлы Cluster не используют систему привилегий MySQL при взаимодействии друг с другом. Настройка или изменение учетных записей пользователей MySQL (включая учетную запись root) влияет только на приложения, обращающиеся к узлу SQL, а не на взаимодействие между узлами. Дополнительную информацию см. в Разделе 21.6.18.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-5.7-en/mysql-cluster-install-example-data.html

Spec-Zone.ru

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