MySQL NDB集群表和数据的示例

NDB集群表和数据的示例

在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选项添加到任何表创建语句中,或者替换任 何现有的引擎选项。假设你把world sample数据库放在另一台不支持NDB集群的MySQL服务器上,并且想导出City表:

[root@my239 world-db]# mysqldump -uroot -p123456 --add-drop-table world City > city_table.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

生成的city_table。sql文件将包含这个表创建语句(以及导入表数据所需的INSERT语句):

[root@my239 world-db]# ll
total 568
-rw-r--r--. 1 root root 179242 May 22 19:50 city_table.sql
-rw-r--r--. 1 root root 398629 May  1 06:05 world.sql
[root@my239 world-db]# more city_table.sql
-- MySQL dump 10.13  Distrib 5.7.26, for Linux (x86_64)
--
-- Host: localhost    Database: world
-- ------------------------------------------------------
-- Server version       5.7.26-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `city`
--

DROP TABLE IF EXISTS `city`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
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`),
  KEY `CountryCode` (`CountryCode`),
  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `city`
INSERT INTO `city` VALUES (1,'Kabul','AFG','Kabol',1780000),(2,'Qandahar','AFG','Qandahar',237500), (3,'Herat','AFG','Herat',186800)
...............

你需要确保MySQL对该表使用NDBCLUSTER存储引擎。有两种方法可以实现这一点。其中之一是在将表导入集群数据库之前修改表的定义。以City 表为例,修改定义中的ENGINE选项,如下所示:

[root@mysqld world-db]# vi city_table.sql
-- MySQL dump 10.13  Distrib 5.7.48-ndb-7.5.36, for linux-glibc2.12 (x86_64)
--
-- Host: localhost    Database: world
-- ------------------------------------------------------
-- Server version       5.7.48-ndb-7.5.36-cluster-gpl

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `city`
--

DROP TABLE IF EXISTS `city`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
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`),
  KEY `CountryCode` (`CountryCode`),
  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
) ENGINE=NDBCLUSTER AUTO_INCREMENT=4080 DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;


对于要成为集群数据库一部分的每个表的定义,必须这样做。要做到这一点,最简单的方法是在包含定义的文件上进行搜索替换,将 TYPE=engine_name或ENGINE=engine_name的所有实例替换为ENGINE=NDBCLUSTER。如果您不想修改文件,可以使用未修改的文件来创建表,然后 使用ALTER TABLE来更改它们的存储引擎。详情将在本节稍后给出。

假设你已经在集群的SQL节点上创建了一个名为world的数据库,然后可以使用mysql命令行客户端来读取city_table。Sql,并按照通常的方式创 建并填充相应的表:

[root@mysqld world-db]# mysql -uroot -p123456  world < city_table.sql
mysql: [Warning] Using a password on the command line interface can be insecure.

非常重要的是要记住,前面的命令必须在SQL节点正在运行(在本例中,在IP地址为10.138.130.233的机器上)。

要在SQL节点上创建整个world数据库的副本,请在非集群服务器上使用mysqldump将数据库导出为名为world. SQL的文件;例如,在/tmp目录下 。然后修改表定义,并将文件导入集群的SQL节点,如下所示:

shell> mysql -uxxxx -pxxxx world < /tmp/world.sql

如果将文件保存到其他位置,请相应地调整前面的说明。

在SQL节点上运行SELECT查询与在任何其他MySQL服务器实例上运行它们没有什么不同。要在命令行中运行查询,首先需要以通常的方式登录 MySQL监视器(在Enter password:提示符中指定root密码):

[root@mysqld /]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.7.48-ndb-7.5.36-cluster-gpl MySQL Cluster Community Server (GPL)

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

我们只是简单地使用MySQL服务器的root帐户,并假设你已经遵循了安装MySQL服务器的标准安全预防措施,包括设置一个强的root密码。

值得注意的是,集群节点在访问其他节点时不使用MySQL特权系统。设置或更改MySQL用户帐户(包括root帐户)只影响访问SQL节点的应用程序 ,而不会影响节点之间的交互。

如果在导入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
Database changed
mysql> SELECT Name, Population FROM city ORDER BY Population DESC LIMIT 5;
+-----------------+------------+
| Name            | Population |
+-----------------+------------+
| Mumbai (Bombay) |   10500000 |
| Seoul           |    9981619 |
| S?o Paulo       |    9968485 |
| Shanghai        |    9696300 |
| Jakarta         |    9604900 |
+-----------------+------------+
5 rows in set (0.03 sec)

mysql> \q
Bye
[root@mysqld /]#

发表评论

电子邮件地址不会被公开。