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 /]#