Spec-Zone .ru
спецификации, руководства, описания, API

17.2.6. MySQL Cluster Example with Tables и Data

Отметить

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

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

Если Вы импортируете таблицы из существующей базы данных, используя вывод mysqldump, можно открыть сценарий SQL в текстовом редакторе и добавить ENGINE опция к любым табличным операторам создания, или замена любой существующий ENGINE опции. Предположите, что Вы имеете world база данных-образец на другом сервере MySQL, который не поддерживает MySQL Cluster, и Вы хотите экспортировать City таблица:

shell> 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 механизм хранения для этой таблицы. Есть два способа, которыми это может быть выполнено. Один из них должен изменить табличное определение прежде, чем импортировать это в базу данных Кластера. Используя 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, и создайте и заполните соответствующую таблицу обычным способом:

shell> mysql world <
        city_table.sql

Очень важно иметь в виду, что предыдущая команда должна быть выполнена на узле, куда узел SQL работает (в этом случае, на машине с IP-адресом 192.168.0.20).

Создать копию всего world база данных на узле SQL, используйте mysqldump на сервере некластера, чтобы экспортировать базу данных в названный файл world.sql; например, в /tmp каталог. Затем измените табличные определения как только описано и импортируйте файл в узел SQL кластера как это:

shell> mysql world <
        /tmp/world.sql

Если Вы сохранили файл к различному расположению, корректируете предыдущие инструкции соответственно.

Выполнение SELECT запросы на узле SQL не отличаются от выполнения их на любом другом экземпляре сервера MySQL. Чтобы выполнить запросы из командной строки, Вы сначала должны войти в систему к MySQL Monitor обычным способом (определите root пароль в Enter password: подсказка):

shell> mysql -u root -pEnter password:Welcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 1 to server version: 5.6.11-ndb-7.3.3Type 'help;' or '\h' for help. Type '\c' to clear the buffer.mysql>

Мы просто используем сервер MySQL root считайте и предположите, что Вы следовали за стандартными предосторожностями безопасности для того, чтобы установить сервер MySQL, включая установку strong root пароль. Для получения дополнительной информации см. Раздел 2.10.2, "Защищая Учетные записи MySQL Initial".

Это стоит принять во внимание, что узлы Кластера не используют систему полномочия MySQL, получая доступ к друг другу. Установка или изменение учетных записей пользователей MySQL (включая root учетная запись) эффекты только приложения, которые получают доступ к узлу SQL, не взаимодействию между узлами. См. Раздел 17.5.11.2, "MySQL Cluster и MySQL Privileges", для получения дополнительной информации.

Если Вы не изменяли 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 Monitor:

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> \qByeshell>

Приложения, которые используют 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('192.168.0.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.

Подобным способом можно использовать API MySQL C, Perl-DBI, Python-mysql, или MySQL Connectors, чтобы выполнить задачи определения данных и манипулирования, как Вы обычно были бы с MySQL.