在设置新的 NDB 集群实例时,通常需要从现有的 NDB 集群、MySQL 实例或其他来源导入数据。这些数据通常以下列一种或多种格式提供:
由 mysqldump 或其他导出程序生成的 CSV 文件。可以使用 mysql 客户端中的
LOAD DATA INFILE
语句,或使用 NDB 集群发行版提供的 ndb_import 实用程序将此类文件导入NDB
。有关后者的更多信息,请参见 第 25.5.13 节,“ndb_import — 将 CSV 数据导入 NDB”。使用
NDB
管理客户端中的START BACKUP
生成的原生NDB
备份。要导入原生备份,必须使用 NDB 集群附带的 ndb_restore 程序。有关使用此程序的更多信息,请参见 第 25.5.23 节,“ndb_restore — 恢复 NDB 集群备份”。
从 SQL 文件导入数据时,通常不需要强制执行事务或外键,临时禁用这些功能可以大大加快导入过程。可以使用 mysql 客户端执行此操作,可以从客户端会话中执行,也可以在命令行上调用它。在 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;
以这种方式执行导入时,必须在执行 mysql 客户端的 source
命令后再次启用 ndb_use_transaction
和 foreign_key_checks
。否则,同一会话中后面的语句也可能在不强制执行事务或外键约束的情况下执行,这可能导致数据不一致。
在系统 shell 中,可以使用带有 --init-command
选项的 mysql 客户端导入 SQL 文件,同时禁用事务和外键的强制执行,如下所示:
$> 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
数据节点配置参数的值,该参数会预留更多内存,以便数据节点在其事务协调器意外停止时接管事务。
在对 NDB 集群表执行批量 DELETE
或 UPDATE
操作时,您可能也希望这样做。如果可能,请尝试让应用程序分块执行这些操作,例如,通过向此类语句添加 LIMIT
。
如果数据导入操作因任何原因未成功完成,则应准备好执行任何必要的清理工作,包括可能执行一个或多个 DROP TABLE
语句、DROP DATABASE
语句,或两者都执行。否则,可能会导致数据库处于不一致状态。