18.2.6 테이블 및 데이터를 포함 MySQL Cluster의 예제
이 섹션의 정보는 Unix 및 Windows 플랫폼에서 실행되는 MySQL Cluster에 적용됩니다.
MySQL Cluster의 데이터베이스 데이 황소와 데이터의 조작은 표준 MySQL의 경우와 거의 차이가 없습니다. 유의해야 할 중요한 포인트가 2 개 있습니다.
클러스터에서 복제되는 테이블은
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
옵션을 바꿀 수 있습니다. MySQL Cluster를 지원하지 않는 다른 MySQL 서버에 world
샘플 데이터베이스가 있으며 City
테이블을 export 할 필요가 있다고합니다.
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
을 사용하여 스토리지 엔진을 변경합니다. 자세한 내용은이 섹션 뒷부분합니다.
클러스터 SQL 노드에 world
라는 데이터베이스가 이미 생성되어있는 것을 전제로 mysql 명령 행 클라이언트를 사용하여 city_table.sql
을 읽고 대응하는 테이블을 정상적인 방법으로 만들어 채 웁니다.
shell> mysql world < city_table.sql
매우 중요한 고려 사항으로 위의 명령은 SQL 노드를 실행하는 호스트 (이 경우는 IP 주소가 192.168.0.20
의 머신)에서 실행해야합니다.
SQL 노드에서 world
전체 데이터베이스의 복사본을 만들려면 클러스터되지 않은 서버에서 mysqldump를 사용하여 (예를 들어) /tmp
디렉토리의 world.sql
라는 파일에 데이터베이스를 내보낼 수 있습니다. 다음은 위에서 설명한대로 테이블 정의를 변경하고 이러한 파일을 클러스터의 SQL 노드로 가져옵니다.
shell> mysql world < /tmp/world.sql
파일을 다른 위치에 저장하려면, 그에 따라 이전 단계를 조정하십시오.
SQL 노드에서 SELECT
쿼리의 실행은 MySQL 서버의 다른 인스턴스에서 실행 다르지 않습니다. 명령 행에서 쿼리를 실행하려면 먼저 일반적인 방법으로 ( Enter password:
프롬프트에서 root
암호를 지정하고) MySQL Monitor에 로그인해야합니다.
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.27-ndb-7.4.9
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
여기에서는 MySQL 서버의 root
계정을 사용하여 MySQL 서버 설치에 대한 표준 보안 대책 (강력한 root
암호 설정을 포함)에 따른다고 가정합니다. 자세한 내용은 섹션 2.10.2 "처음 MySQL 계정 보안 설정" 을 참조하십시오.
클러스터 노드가 서로 액세스 할 때 MySQL 권한 시스템이 사용되지 않을 것을 고려하십시오. MySQL 사용자 계정 ( root
계정 포함)의 설정 또는 변경은 SQL 노드에 액세스하는 응용 프로그램에만 영향을 노드 간의 상호 작용에 영향을주지 않습니다. 자세한 내용은 섹션 18.5.11.2 "MySQL Cluster와 MySQL 권한" 을 참조하십시오.
SQL 스크립트를 가져 오기 전에 테이블 정의 ENGINE
절을 변경하지 않은 경우이 시점에서 다음 문을 실행하십시오.
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
Bye shell>
MySQL을 사용하는 응용 프로그램은 표준 API를 사용하여 NDB
테이블에 액세스 할 수 있습니다. 응용 프로그램은 관리 노드와 데이터 노드가 아닌 SQL 노드에 액세스해야합니다. 이 간단한 예제에서는 네트워크의 다른 위치에있는 Web 서버에서 실행되는 PHP 5.X의 mysqli
확장을 사용하여 여기에 표시된 SELECT
문을 실행하는 방법을 보여줍니다.
<!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>
여기에서는 Web 서버에서 실행되고있는 프로세스가 SQL 노드의 IP 주소에 도달 할 수 있다고 가정합니다.
같은 방법으로, MySQL C API, Perl-DBI, Python-mysql 또는 MySQL Connector를 사용하여 MySQL에서 일반적으로 수행하는 동일한 데이터의 정의 및 조작 작업을 수행 할 수 있습니다.