Spec-Zone .ru
спецификации, руководства, описания, API
|
Информация в этом разделе применяется к MySQL Cluster, работающему и на Unix и на платформах Windows.
Работа с таблицами базы данных и данными в MySQL Cluster очень не отличается от выполнения так в стандартном MySQL. Есть два ключевых пункта, чтобы иметь в виду:
Для таблицы, которая будет тиражирована в кластер, это должно использовать NDBCLUSTER
механизм хранения. Чтобы определить это, используйте ENGINE=NDBCLUSTER
или ENGINE=NDB
опция,
составляя таблицу:
CREATE TABLEtbl_name
(col_name
column_definitions
) ENGINE=NDBCLUSTER;
Альтернативно, для существующей таблицы, которая использует различный механизм хранения,
использовать ALTER TABLE
изменить таблицу, чтобы использовать NDBCLUSTER
:
ALTER TABLE tbl_name
ENGINE=NDBCLUSTER;
Каждый NDBCLUSTER
у таблицы есть первичный ключ. Если никакой первичный ключ не определяется пользователем, когда таблица
составляется, NDBCLUSTER
механизм хранения автоматически генерирует скрытый. Такой
ключ занимает место, как делает любую другую таблицу, индексируют. (Весьма распространено встретиться с
проблемами из-за недостаточной памяти для того, чтобы разместить, они автоматически создаваемые
индексируют.)
Если Вы импортируете таблицы из существующей базы данных, используя вывод 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 -p
Enter 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>\q
Byeshell>
Приложения, которые используют 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.