本節中的資訊適用於在 Unix 和 Windows 平台上執行的 NDB Cluster。
在 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
選項。假設您在另一個不支援 NDB Cluster 的 MySQL 伺服器上有 world
範例資料庫,並且您想要匯出 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;
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;
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)
對於要成為叢集資料庫一部分的每個表格定義,都必須執行此操作。完成此操作的最簡單方法是對包含定義的檔案執行搜尋和取代,並將所有 ENGINE=
的實例取代為 engine_name
ENGINE=NDBCLUSTER
。如果您不想修改檔案,可以使用未修改的檔案來建立表格,然後使用 ALTER TABLE
來變更其儲存引擎。詳細資訊在本節稍後提供。
假設您已在叢集的 SQL 節點上建立一個名為 world
的資料庫,您可以使用 mysql 命令列用戶端讀取 city_table.sql
,並以通常的方式建立和填入對應的表格
$> mysql world < city_table.sql
請務必記住,前面的命令必須在 SQL 節點執行的主機上執行 (在此例中,在 IP 位址為 198.51.100.20
的機器上)。
若要在 SQL 節點上建立整個 world
資料庫的副本,請在非叢集伺服器上使用 mysqldump 將資料庫匯出到名為 world.sql
的檔案 (例如,在 /tmp
目錄中)。然後,如上所述修改表格定義,並將檔案匯入叢集的 SQL 節點,如下所示:
$> mysql world < /tmp/world.sql
如果您將檔案儲存到不同的位置,請相應調整前面的指示。
在 SQL 節點上執行 SELECT
查詢與在 MySQL 伺服器的任何其他實例上執行查詢沒有區別。若要從命令列執行查詢,您首先需要以通常的方式登入 MySQL 監控器 (在 Enter password:
提示中指定 root
密碼)
$> 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: 8.4.0-ndb-8.4.0
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
我們僅使用 MySQL 伺服器的 root
帳戶,並假設您已遵循安裝 MySQL 伺服器的標準安全預防措施,包括設定強式 root
密碼。如需更多資訊,請參閱 第 2.9.4 節, 「保護初始 MySQL 帳戶安全」。
值得注意的是,NDB Cluster 節點在彼此存取時不使用 MySQL 權限系統。設定或變更 MySQL 使用者帳戶 (包括 root
帳戶) 只會影響存取 SQL 節點的應用程式,而不會影響節點之間的互動。請參閱第 25.6.21.2 節, 「NDB 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 監控器一樣
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 節點,而不是管理或資料節點。此簡短範例說明我們如何使用在網路其他位置的 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('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>
我們假設 Web 伺服器上執行的程序可以連線至 SQL 節點的 IP 位址。
以類似的方式,您可以使用 MySQL C API、Perl-DBI、Python-mysql 或 MySQL 連接器來執行資料定義和操作的任務,就像您通常使用 MySQL 一樣。