文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙尺寸) - 39.9Mb
PDF (A4 尺寸) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  NDB Cluster 使用表格和資料的範例

25.3.5 NDB Cluster 使用表格和資料的範例

注意

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

在 NDB Cluster 中使用資料庫表格和資料,與在標準 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 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 一樣。