Loading...
MySQL 9.5 Reference Manual 9.5의 25.3.5 NDB Cluster Example with Tables and Data의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
참고
이 섹션의 정보는 Unix와 Windows 플랫폼 둘 모두에서 실행되는 NDB Cluster에 적용됩니다.
NDB Cluster에서 데이터베이스 테이블과 데이터를 다루는 것은 일반적인 MySQL에서 그렇게 하는 것과 크게 다르지 않습니다. 기억해야 할 두 가지 핵심 사항이 있습니다:
NDBCLUSTER 스토리지 엔진을 사용해야 합니다. 이를 지정하려면 테이블을 생성할 때 ENGINE=NDBCLUSTER 또는
ENGINE=NDB 옵션을 사용합니다:1CREATE TABLE tbl_name (col_name column_definitions) ENGINE=NDBCLUSTER;
또는, 다른 스토리지 엔진을 사용하는 기존 테이블의 경우,
ALTER TABLE을 사용하여 해당 테이블이
NDBCLUSTER를 사용하도록 변경합니다:
1ALTER TABLE tbl_name ENGINE=NDBCLUSTER;
NDBCLUSTER 테이블에는 프라이머리 키가 있습니다. 테이블을 생성할 때 사용자가 프라이머리 키를 정의하지 않으면 NDBCLUSTER
스토리지 엔진이 자동으로 숨겨진 프라이머리 키를 생성합니다. 이러한 키는 다른 테이블 인덱스와 마찬가지로 공간을 차지합니다. (이와 같이 자동으로 생성되는 인덱스를 저장할 메모리가 부족하여 문제가 발생하는 경우가
드물지 않습니다.)기존 데이터베이스에서 mysqldump의 출력 결과를 사용하여 테이블을 임포트하는 경우, SQL 스크립트를 텍스트 에디터로 열어 모든 테이블 생성문에 ENGINE
옵션을 추가하거나 기존의 ENGINE 옵션을 교체할 수 있습니다. 예를 들어, 다른 MySQL 서버에 NDB Cluster를 지원하지 않는
world 샘플 데이터베이스가 있고, 그 중 City 테이블을 익스포트하려 한다고 가정해 봅니다:
1$> mysqldump --add-drop-table world City > city_table.sql
생성된 city_table.sql 파일에는 다음과 같은 테이블 생성문(과 테이블 데이터를 임포트하는 데 필요한
INSERT문)이 포함되어 있습니다:
1DROP TABLE IF EXISTS `City`; 2CREATE TABLE `City` ( 3 `ID` int(11) NOT NULL auto_increment, 4 `Name` char(35) NOT NULL default '', 5 `CountryCode` char(3) NOT NULL default '', 6 `District` char(20) NOT NULL default '', 7 `Population` int(11) NOT NULL default '0', 8 PRIMARY KEY (`ID`) 9) ENGINE=MyISAM; 10 11INSERT INTO `City` VALUES (1,'Kabul','AFG','Kabol',1780000); 12INSERT INTO `City` VALUES (2,'Qandahar','AFG','Qandahar',237500); 13INSERT INTO `City` VALUES (3,'Herat','AFG','Herat',186800); 14(remaining INSERT statements omitted)
이 테이블에 대해 MySQL이
NDBCLUSTER 스토리지 엔진을 사용하도록 해야 합니다. 이를 달성하는 방법은 두 가지가 있습니다. 그 중 하나는 Cluster 데이터베이스에
임포트하기 전에 테이블 정의를 수정하는 것입니다. City 테이블을 예로 들면, 정의의 ENGINE 옵션을 다음과 같이
수정합니다:
1DROP TABLE IF EXISTS `City`; 2CREATE TABLE `City` ( 3 `ID` int(11) NOT NULL auto_increment, 4 `Name` char(35) NOT NULL default '', 5 `CountryCode` char(3) NOT NULL default '', 6 `District` char(20) NOT NULL default '', 7 `Population` int(11) NOT NULL default '0', 8 PRIMARY KEY (`ID`) 9) ENGINE=NDBCLUSTER; 10 11INSERT INTO `City` VALUES (1,'Kabul','AFG','Kabol',1780000); 12INSERT INTO `City` VALUES (2,'Qandahar','AFG','Qandahar',237500); 13INSERT INTO `City` VALUES (3,'Herat','AFG','Herat',186800); 14(remaining INSERT statements omitted)
Clustered 데이터베이스의 일부가 될 각 테이블 정의에 대해 이 작업을 수행해야 합니다. 이를 가장 쉽게 수행하는 방법은 정의를 포함하는 파일에서 검색 및 바꾸기를 수행하여 모든 ENGINE=engine_name
인스턴스를 ENGINE=NDBCLUSTER로 교체하는 것입니다. 파일을 수정하고 싶지 않다면, 수정하지 않은 파일을 사용하여 테이블을 생성한 다음
ALTER TABLE을 사용하여 스토리지 엔진을 변경할 수 있습니다. 세부 내용은 이 섹션의 뒷부분에 나옵니다.
Cluster의 SQL 노드에 world라는 데이터베이스를 이미 생성했다고 가정하면, mysql 커맨드라인 클라이언트를 사용하여
city_table.sql을 읽고, 일반적인 방식으로 해당하는 테이블을 생성하고 데이터를 채울 수 있습니다:
1$> mysql world < city_table.sql
앞의 명령은 SQL 노드가 실행 중인 호스트에서 반드시 실행해야 한다는 점을 매우 중요하게 기억해야 합니다 (이 예에서는 IP 주소
198.51.100.20인 머신).
전체 world 데이터베이스의 복사본을 SQL 노드에 생성하려면, 논클러스터 서버에서 mysqldump를 사용하여 데이터베이스를
world.sql이라는 이름의 파일로 익스포트합니다 (예: /tmp 디렉터리). 그런 다음 방금 설명한 대로
테이블 정의를 수정하고, 다음과 같이 그 파일을 클러스터의 SQL 노드에 임포트합니다:
1$> mysql world < /tmp/world.sql
파일을 다른 위치에 저장했다면, 위의 지침을 그에 맞게 조정하십시오.
SQL 노드에서 SELECT 쿼리를 실행하는 것은 다른 어떤 MySQL 서버 인스턴스에서 실행하는 것과 다르지 않습니다. 커맨드라인에서 쿼리를 실행하려면 먼저 일반적인 방법으로 MySQL Monitor에 로그인해야 합니다 (Enter password: 프롬프트에서 root 패스워드를 지정):
1$> mysql -u root -p 2Enter password: 3Welcome to the MySQL monitor. Commands end with ; or \g. 4Your MySQL connection id is 1 to server version: 9.5.0-ndb-9.5.0 5 6Type 'help;' or '\h' for help. Type '\c' to clear the buffer. 7 8mysql>
여기서는 단순히 MySQL 서버의 root
계정을 사용하며, 강력한 root 패스워드 설정을 포함해 MySQL 서버 설치 시 표준 보안 권장 사항을 따랐다고 가정합니다. 자세한 내용은
Section 2.9.4, “Securing the Initial MySQL Account”을 참조하십시오.
NDB Cluster 노드들은 서로에 접근할 때 MySQL 권한 시스템을 사용하지 않는다는 점을 고려할 가치가 있습니다. MySQL 사용자 계정( root 계정 포함)을 설정하거나 변경하는 것은 SQL 노드에 접근하는 애플리케이션에만 영향을 미치며, 노드 간 상호 작용에는 영향을 주지 않습니다. 자세한 내용은
Section 25.6.19.2, “NDB Cluster and MySQL Privileges”를 참조하십시오.
SQL 스크립트를 임포트하기 전에 테이블 정의의 ENGINE 절을 수정하지 않았다면, 이 시점에서 다음 문들을 실행해야 합니다:
1mysql> USE world; 2mysql> ALTER TABLE City ENGINE=NDBCLUSTER; 3mysql> ALTER TABLE Country ENGINE=NDBCLUSTER; 4mysql> ALTER TABLE CountryLanguage ENGINE=NDBCLUSTER;
데이터베이스를 선택하고 해당 데이터베이스의 테이블에 대해 SELECT 쿼리를 실행하는 것 역시 일반적인 방법과 같으며, MySQL Monitor를 종료하는 것도 마찬가지입니다:
1mysql> USE world; 2mysql> SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5; 3+-----------+------------+ 4| Name | Population | 5+-----------+------------+ 6| Bombay | 10500000 | 7| Seoul | 9981619 | 8| São Paulo | 9968485 | 9| Shanghai | 9696300 | 10| Jakarta | 9604900 | 11+-----------+------------+ 125 rows in set (0.34 sec) 13 14mysql> \q 15Bye 16 17$>
MySQL을 사용하는 애플리케이션은 표준 API를 이용해 NDB 테이블에 접근할 수 있습니다. 중요한 점은 애플리케이션이 매니지먼트 노드나 데이터 노드가 아니라 반드시 SQL 노드에 접근해야 한다는 것입니다. 다음의 간단한 예는 네트워크상의 다른 Web 서버에서 실행 중인 PHP 5.X mysqli
익스텐션을 사용해 방금 보여 준 SELECT문을 어떻게 실행할 수 있는지를 보여 줍니다:
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 2 "http://www.w3.org/TR/html4/loose.dtd"> 3<html> 4<head> 5 <meta http-equiv="Content-Type" 6 content="text/html; charset=iso-8859-1"> 7 <title>SIMPLE mysqli SELECT</title> 8</head> 9<body> 10<?php 11 # connect to SQL node: 12 $link = new mysqli('198.51.100.20', 'root', 'root_password', 'world'); 13 # parameters for mysqli constructor are: 14 # host, user, password, database 15 16 if( mysqli_connect_errno() ) 17 die("Connect failed: " . mysqli_connect_error()); 18 19 $query = "SELECT Name, Population 20 FROM City 21 ORDER BY Population DESC 22 LIMIT 5"; 23 24 # if no errors... 25 if( $result = $link->query($query) ) 26 { 27?> 28<table border="1" width="40%" cellpadding="4" cellspacing ="1"> 29 <tbody> 30 <tr> 31 <th width="10%">City</th> 32 <th>Population</th> 33 </tr> 34<? 35 # then display the results... 36 while($row = $result->fetch_object()) 37 printf("<tr>\n <td align=\"center\">%s</td><td>%d</td>\n</tr>\n", 38 $row->Name, $row->Population); 39?> 40 </tbody 41</table> 42<? 43 # ...and verify the number of rows that were retrieved 44 printf("<p>Affected rows: %d</p>\n", $link->affected_rows); 45 } 46 else 47 # otherwise, tell us what went wrong 48 echo mysqli_error(); 49 50 # free the result set and the mysqli connection object 51 $result->close(); 52 $link->close(); 53?> 54</body> 55</html>
Web 서버에서 실행 중인 프로세스가 SQL 노드의 IP 주소에 접근할 수 있다고 가정합니다.
이와 유사한 방식으로, MySQL C API, Perl-DBI, Python-mysql 또는 MySQL 커넥터를 사용하여, 일반적인 MySQL에서와 마찬가지로 데이터 정의와 조작 작업을 수행할 수 있습니다.
25.3.4 Initial Startup of NDB Cluster
25.3.6 Safe Shutdown and Restart of NDB Cluster