在设置新的 NDB 集群实例时,通常需要从现有的 NDB 集群、MySQL 实例或其他来源导入数据。这些数据通常以以下格式提供:
-
SQL 转储文件,如 mysqldump 或 mysqlpump 生成的文件。可以使用 mysql 客户端导入,如本节后面所示。
-
CSV 文件,由 mysqldump 或其他导出程序生成的文件。这些文件可以使用
LOAD DATA INFILE
在 mysql 客户端中导入,或者使用 NDB 集群发行版提供的 ndb_import 实用程序。有关后者的更多信息,请参阅 第 25.5.13 节,“ndb_import — 将 CSV 数据导入 NDB”。 -
本机
NDB
备份,使用NDB
管理客户端中的START BACKUP
生成的备份。要导入本机备份,必须使用 NDB 集群发行版提供的 ndb_restore 程序。请参阅 第 25.5.23 节,“ndb_restore — 恢复 NDB 集群备份”,以获取更多关于使用该程序的信息。
从 SQL 文件导入数据时,通常不需要执行事务或外键,因此临时禁用这些功能可以大大加速导入过程。这可以使用 mysql 客户端来完成,或者从命令行调用它。
SET ndb_use_transactions=0;
SET foreign_key_checks=0;
source path/to/dumpfile;
SET ndb_use_transactions=1;
SET foreign_key_checks=1;
在执行导入时,必须重新启用 ndb_use_transaction
和 foreign_key_checks
,否则可能会导致数据不一致。
从系统 shell 中,可以使用 mysql 客户端的 --init-command
选项禁用事务和外键约束,例如:
$> mysql --init-command='SET ndb_use_transactions=0; SET foreign_key_checks=0' < path/to/dumpfile
也可以将数据加载到 InnoDB
表中,然后使用 ALTER TABLE ... ENGINE NDB 将其转换为使用 NDB 存储引擎。请注意,对于许多表,这可能需要执行多个操作;此外,如果使用外键,必须小心地执行 ALTER TABLE 语句的顺序,因为外键不能在使用不同 MySQL 存储引擎的表之间工作。
您应该注意,前面描述的方法不适合非常大的数据集或大事务。如果应用程序需要大事务或许多并发事务作为正常操作的一部分,您可能需要增加 MaxNoOfConcurrentOperations
数据节点配置参数的值,以便为数据节点预留更多内存,以便在事务协调器意外停止时接管事务。
您也可能希望在执行批量DELETE
或UPDATE
操作时对 NDB 集群表执行此操作。如果可能,尝试让应用程序以块的形式执行这些操作,例如,通过将LIMIT
添加到这些语句中。
如果数据导入操作未能成功完成,无论出于什么原因,您都应该准备好执行必要的清理操作,包括可能需要执行一个或多个DROP TABLE
语句、DROP DATABASE
语句,或者两者。否则,可能会使数据库处于不一致的状态。