文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美國信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man 頁面 (TGZ) - 258.2Kb
Man 頁面 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  使用資料表和資料的 NDB 叢集範例

25.3.5 使用資料表和資料的 NDB 叢集範例

注意

本節中的資訊適用於在 Unix 和 Windows 平台上執行的 NDB 叢集。

在 NDB 叢集中使用資料庫資料表和資料,與在標準 MySQL 中執行操作差異不大。有兩個重點需要記住

  • 若要在叢集中複製資料表,它必須使用 NDBCLUSTER 儲存引擎。若要指定此項,請在建立資料表時使用 ENGINE=NDBCLUSTERENGINE=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 叢集的 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: 9.0.0-ndb-9.0.0

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

我們僅使用 MySQL 伺服器的 root 帳戶,並假設您已遵循安裝 MySQL 伺服器的標準安全預防措施,包括設定強式 root 密碼。如需更多資訊,請參閱第 2.9.4 節,「保護初始 MySQL 帳戶」

值得注意的是,NDB 叢集節點在彼此存取時,使用 MySQL 權限系統。設定或變更 MySQL 使用者帳戶(包括 root 帳戶)只會影響存取 SQL 節點的應用程式,而不會影響節點之間的互動。如需更多資訊,請參閱第 25.6.21.2 節,「NDB 叢集和 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 一樣。