在设置 NDB 集群的新实例时,通常需要从现有的 NDB 集群、MySQL 实例或其他来源导入数据。这些数据通常以以下一种或多种格式提供
CSV 文件,由 mysqldump 或其他导出程序生成。此类文件可以使用 mysql 客户端中的
LOAD DATA INFILE
导入到NDB
中,或者使用 NDB 集群发行版提供的 ndb_import 实用程序导入。有关后者的更多信息,请参见 第 25.5.13 节,“ndb_import — 将 CSV 数据导入 NDB”。使用
START BACKUP
在NDB
管理客户端中生成的本地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
语句,或两者。如果未执行此操作,数据库可能会处于不一致状态。