25.6.9 将数据导入 MySQL 集群
在设置新的 NDB 集群实例时,通常需要从现有 NDB 集群、MySQL 实例或其他源中导入数据。这类数据通常以以下格式之一存在:
-
由 mysqldump 或其他导出程序生产的 CSV 文件。这些文件可以使用
LOAD DATA INFILE
在 mysql 客户端中导入,也可以使用 NDB 集群发行版提供的 ndb_import 工具进行导入。关于后者,请参阅 第 25.5.13 节,“ndb_import — Import CSV Data Into NDB”。 -
使用
START BACKUP
命令在NDB管理客户端中创建的nativeNDB
备份。要导入native备份,您必须使用NDB集群中的ndb_restore程序。请参阅第25.5.23节,“ndb_restore — Restore an NDB Cluster Backup”,了解如何使用该程序。
从SQL文件中导入数据时,通常不需要强制事务或外键约束,并且临时禁用这些功能可以大大加速导入过程。这可以使用mysql客户端实现, either从客户端会话中或在命令行上调用。从mysql客户端会话中,您可以使用以下SQL语句来执行导入:
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
,以便在执行mysql客户端的source
命令后。否则,可能会导致同一会话中的后续语句也不会执行事务或外键约束,从而导致数据不一致。
从系统 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集群表进行优化。如果可能,请让应用程序在执行这些操作时将其分 chunk,例如通过添加LIMIT
语句。
如果数据导入操作未能成功完成,无论是什么原因,您应该准备好执行必要的清洁工作,包括可能的一或多个DROP TABLE
语句、DROP DATABASE
语句或两者。否则可能会留下数据库在不一致的状态。