MySQL8 中文参考(八十五)(2)https://developer.aliyun.com/article/1566065
- 使用 ndb_perror 获取错误信息。 已删除了perror的已弃用
--ndb
选项。请改用ndb_perror来从NDB
错误代码获取错误消息信息。(Bug #81704, Bug #81705, Bug #23523926, Bug #23523957) - 条件推送增强。 以前,条件推送仅限于将条件推送到引用来自与条件所推送的表相同的列值的谓词项。在 NDB 8.0 中,取消了此限制,使得可以从查询计划中较早的表中引用列值。NDB 8.0 支持比较列表达式的连接,以及在同一表中比较列。要比较的列和列表达式必须完全相同类型;这意味着它们在适用这些属性时也必须具有相同的符号、长度、字符集、精度和比例。在 NDB 8.0.27 之前,被推送的条件不能是推送连接的一部分,当解除此限制时。下推更大部分条件允许数据节点过滤更多行,从而减少mysqld在连接处理期间必须处理的行数。这些增强的另一个好处是过滤可以在 LDM 线程中并行执行,而不是在 SQL 节点上的单个 mysqld 进程中执行;这有可能显著提高查询性能。继续适用于被比较的列值之间的类型兼容性的现有规则(参见第 10.2.1.5 节,“引擎条件下推优化”)。外连接和半连接的下推。 在 NDB 8.0.20 中完成的工作允许许多外连接和半连接(不仅仅是使用主键或唯一键查找的连接)被下推到数据节点(参见第 10.2.1.5 节,“引擎条件下推优化”)。现在可以下推的扫描外连接包括符合以下条件的连接:
- 表中没有未下推的条件
- 在同一连接嵌套中的其他表或依赖它的上层连接嵌套中没有未下推的条件
- 同一连接嵌套中的所有其他表,或依赖它的上层连接嵌套,也被下推
- 如果半连接使用索引扫描,并且符合刚才提到的被下推外连接的条件,并且使用
firstMatch
策略,那么现在可以将其下推(参见第 10.2.2.1 节,“使用半连接转换优化 IN 和 EXISTS 子查询谓词”)。
这些额外的改进是在 NDB 8.0.21 中完成的:
- 通过转换
NOT EXISTS
和NOT IN
查询而由 MySQL 优化器生成的反连接(参见第 10.2.2.1 节,“使用半连接转换优化 IN 和 EXISTS 子查询谓词”)可以被NDB
下推到数据节点。
当表中没有未下推的条件,并且查询满足外连接下推必须满足的任何其他条件时,可以执行此操作。 NDB
在尝试从附加的表中检索任何行之前,会尝试识别和评估一个非依赖标量子查询。当它能够这样做时,获得的值将作为下推条件的一部分使用,而不是使用提供值的子查询。
- 从 NDB 8.0.27 开始,作为下推查询的一部分下推的条件现在可以引用同一下推查询中祖先表的列,但必须满足以下条件:
- 推送的条件可能包括任何比较运算符
<
,<=
,>
,>=
,=
,和<>
。 - 被比较的值必须是相同类型,包括长度、精度和比例。
NULL
处理根据 ISO SQL 标准指定的比较语义执行;任何与NULL
的比较都返回NULL
。
- 考虑使用此处所示语句创建的表:
CREATE TABLE t ( x INT PRIMARY KEY, y INT ) ENGINE=NDB;
- 查询语句如
SELECT * FROM t AS m JOIN t AS n ON m.x >= n.y
现在可以使用引擎条件推送优化来推送条件列y
。
当无法推送连接时,EXPLAIN
应提供原因或原因。
更多信息请参见 Section 10.2.1.5, “引擎条件推送优化”。
NDB API 方法branch_col_eq_param()
,branch_col_ne_param()
,branch_col_lt_param()
,branch_col_le_param()
,branch_col_gt_param()
,和branch_col_ge_param()
在 NDB 8.0.27 中作为这项工作的一部分添加。这些NdbInterpretedCode
可用于比较列值与参数值。
此外,NdbScanFilter::cmp_param()
,也在 NDB 8.0.27 中添加,使得可以定义列值和参数值之间的比较,用于执行扫描。 - 最大行大小增加。 NDB 8.0 将
NDBCLUSTER
表中可存储的最大字节数从 14000 增加到 30000 字节。BLOB
或TEXT
列继续使用此总数的 264 字节,与以前一样。NDB
表的固定宽度列的最大偏移量为 8188 字节;这与之前的版本保持不变。
有关更多信息,请参见第 25.2.7.5 节,“NDB 集群中数据库对象相关的限制”。 - ndb_mgm SHOW 命令和单用户模式。 在 NDB 8.0 中,当集群处于单用户模式时,管理客户端的
SHOW
命令的输出指示在此模式下哪个 API 或 SQL 节点具有独占访问权限。 - 在线列重命名。 现在可以在线重命名
NDB
表的列,使用ALGORITHM=INPLACE
。有关更多信息,请参见第 25.6.12 节,“NDB 集群中 ALTER TABLE 的在线操作”。 - 改进的 ndb_mgmd 启动时间。 在 NDB 8.0 中,管理节点守护程序的启动时间已经得到显著改善,具体体现在以下方面:
- 由于将
ndb_mgmd
以前用于处理配置数据中节点属性的列表数据结构替换为哈希表,管理服务器的整体启动时间已经减少了 6 倍或更多。 - 此外,在集群配置文件中使用的数据和 SQL 节点主机名未出现在管理服务器的
hosts
文件中时,ndb_mgmd 的启动时间可能比以前短多达 20 倍。
- NDB API 增强。
NdbScanFilter::cmp()
和NdbInterpretedCode
的几种比较方法现在可以用于比较表列值。受影响的NdbInterpretedCode
方法在此列出:
branch_col_eq()
branch_col_ge()
branch_col_gt()
branch_col_le()
branch_col_lt()
branch_col_ne()
- 对于上述列出的所有方法,要比较的表列值必须完全匹配类型,包括长度、精度、有符号性、比例、字符集和排序规则(如适用)。
有关更多信息,请参见各个 API 方法的描述。 - 离线多线程索引构建。 现在可以指定一组核心用于执行离线多线程构建有序索引的 I/O 线程,而不是执行正常的 I/O 任务,如文件 I/O,压缩或解压缩。在这种情况下,“离线”指的是在父表未被写入时执行有序索引构建;这种构建发生在
NDB
集群执行节点或系统重启时,或作为使用ndb_restore--rebuild-indexes
从备份还原集群的一部分时。此外,离线索引构建工作的默认行为已修改为使用所有可用于ndbmtd")的核心,而不仅限于为 I/O 线程保留的核心。这样做可以提高重启和还原时间以及性能、可用性和用户体验。此增强功能的实现如下:
BuildIndexThreads
的默认值从 0 更改为 128。这意味着离线有序索引构建现在默认是多线程的。TwoPassInitialNodeRestartCopy
的默认值从false
更改为true
。这意味着初始节点重启首先将所有数据从“活动”节点复制到正在启动的节点,而不创建任何索引,然后离线构建有序索引,然后再次将其数据与活动节点同步,即在两次同步之间进行离线索引构建。这使得初始节点重启的行为更像节点的正常重启,并减少了构建索引所需的时间。- 为
ThreadConfig
配置参数定义了一个新的线程类型(idxbld
),以允许将离线索引构建线程锁定到特定的 CPU。
- 此外,
NDB
现在通过这两个标准区分可访问ThreadConfig
的线程类型:
- 线程是否是执行线程。
main
,ldm
,recv
,rep
,tc
和send
类型的线程是执行线程;io
,watchdog
和idxbld
类型的线程不是。 - 线程分配给特定任务是永久的还是临时的。目前除了
idxbld
之外的所有线程类型都是永久的。
- 要获取更多信息,请参阅手册中指定参数的描述。(Bug #25835748, Bug #26928111)
- logbuffers 表备份过程信息。 在执行 NDB 备份时,
ndbinfo.logbuffers
表现在显示每个数据节点上备份过程中缓冲区使用情况的信息。这通过反映两种新的日志类型的行来实现,除了REDO
和DD-UNDO
。其中一行具有日志类型BACKUP-DATA
,显示备份期间用于将片段复制到备份文件的数据缓冲区的使用量。另一行具有日志类型BACKUP-LOG
,显示备份期间用于记录备份开始后所做更改的日志缓冲区的使用量。在集群中的每个数据节点的logbuffers
表中显示这两种log_type
行。只有在 NDB 备份正在进行时,表中才存在具有这两种日志类型的行。 (Bug #25822988) - Windows 上的 ndbinfo.processes 表。 在 Windows 平台上由
RESTART
用于生成和重新启动 mysqld 的监视进程的进程 ID 现在在processes
表中显示为angel_pid
。 - 字符串哈希改进。 在 NDB 8.0 之前,所有字符串哈希都是基于首先将字符串转换为规范化形式,然后对结果的二进制图像进行 MD5 哈希。由于以下原因,这可能会导致一些性能问题:
- 规范化字符串始终会被填充到其完整长度。对于
VARCHAR
,这通常涉及添加比原始字符串中的字符更多的空格。 - 字符串库未针对这种空格填充进行优化,在某些情况下增加了相当大的开销。
- 填充语义在字符集之间有所不同,其中一些字符集没有填充到其完整长度。
- 转换后的字符串可能会变得非常庞大,即使没有空格填充;一些 Unicode 9.0 的排序规则可以将单个代码点转换为 100 字节甚至更多的字符数据。
- 后续的 MD5 哈希主要是通过填充空格来实现的,并且效率不是特别高,可能会通过刷新 L1 缓存的大部分内容导致额外的性能损失。
- 排序规则提供了自己的哈希函数,直接对字符串进行哈希而不是首先创建规范化字符串。此外,对于 Unicode 9.0 排序规则,哈希是在不填充的情况下计算的。
NDB
现在在哈希一个被识别为使用 Unicode 9.0 排序规则的字符串时利用这个内置函数。
由于对于其他排序规则,存在着已经在转换后的字符串上进行哈希分区的现有数据库,NDB
继续采用先前用于对这些字符串进行哈希的方法,以保持兼容性。(Bug #89590,Bug #89604,Bug #89609,Bug #27515000,Bug #27523758,Bug #27522732) - RESET MASTER 更改。 因为 MySQL 服务器现在使用全局读锁执行
RESET MASTER
,所以当与 NDB Cluster 一起使用时,此语句的行为在以下两个方面发生了变化:
- 不再保证是同步的;也就是说,现在可能会出现在发出
RESET MASTER
之前立即进行的读取操作可能要等到二进制日志被轮换后才被记录。 - 现在无论语句是在写入二进制日志的相同 SQL 节点上执行,还是在同一集群中的不同 SQL 节点上执行,它的行为都完全相同。
- 注意
SHOW BINLOG EVENTS
,FLUSH LOGS
,以及大多数数据定义语句继续像以前的NDB
版本一样以同步方式运行。 - ndb_restore 选项用法。 在调用ndb_restore时,现在需要同时使用
--nodeid
和--backupid
选项。 - ndb_log_bin 默认值。 NDB 8.0 将
ndb_log_bin
系统变量的默认值从TRUE
更改为FALSE
。 - 动态事务资源分配。 现在,事务协调器中的资源分配是使用动态内存池进行的。这意味着资源分配由数据节点配置参数决定,例如
MaxDMLOperationsPerTransaction
、MaxNoOfConcurrentIndexOperations
、MaxNoOfConcurrentOperations
、MaxNoOfConcurrentScans
、MaxNoOfConcurrentTransactions
、MaxNoOfFiredTriggers
、MaxNoOfLocalScans
和TransactionBufferMemory
现在以这样的方式进行,即如果每个参数所代表的负载都在所有这些资源的目标负载范围内,那么其他这些资源可以被限制,以使总资源不超过可用资源。作为这项工作的一部分,已添加了几个新的数据节点参数,用于控制DBTC
中的事务资源,列在这里:
ReservedConcurrentIndexOperations
ReservedConcurrentOperations
ReservedConcurrentScans
ReservedConcurrentTransactions
ReservedFiredTriggers
ReservedLocalScans
ReservedTransactionBufferMemory
.
- 有关刚才列出的参数的更多信息,请参阅其描述。
- 每个数据节点使用多个本地数据管理器进行备份。
NDB
现在可以在每个数据节点上并行执行备份,使用多个本地数据管理器(LDMs)。 (以前,备份是在数据节点之间并行进行的,但在数据节点进程内部始终是串行的。)在 ndb_mgm 客户端的START BACKUP
命令中不需要特殊的语法来启用此功能,但所有数据节点必须使用多个 LDMs。 这意味着数据节点必须运行 ndbmtd(ndbd 是单线程的,因此始终只有一个 LDM)并且在进行备份之前必须配置为使用多个 LDMs;您可以通过为多线程数据节点配置参数MaxNoOfExecutionThreads
或ThreadConfig
之一选择适当的设置来实现这一点。
使用多个 LDMs 进行备份会在BACKUP/BACKUP-*backup_id*/
目录下创建子目录,每个 LDM 一个。ndb_restore 现在会自动检测这些子目录,如果存在,则尝试并行恢复备份;详细信息请参见 第 25.5.23.3 节,“从并行备份中恢复”。 (单线程备份将像以前的NDB
版本一样恢复。)还可以通过修改通常的恢复过程,使用先前版本的 NDB 集群的 ndb_restore 二进制文件来恢复并行备份;第 25.5.23.3.2 节,“串行恢复并行备份” 提供了如何执行此操作的信息。
您可以通过在集群的全局配置文件(config.ini
)的[ndbd default]
部分为所有数据节点将EnableMultithreadedBackup
数据节点参数设置为 0 来强制创建单线程备份。 - 二进制配置文件增强。 NDB 8.0 使用了管理服务器二进制配置文件的新格式。以前,集群配置文件中最多可以出现 16381 个部分;现在,部分的最大数量为 4G。这旨在支持比以前更大数量的节点在集群中。
升级到新格式相对无缝,并且很少需要手动干预,因为管理服务器仍然可以无问题地读取旧格式。从 NDB 8.0 降级到旧版本的 NDB 集群软件需要手动删除任何二进制配置文件,或者使用--initial
选项启动旧管理服务器二进制文件。
欲了解更多信息,请参阅第 25.3.7 节,“NDB 集群升级和降级”。 - 增加数据节点数量。 NDB 8.0 将每个集群支持的数据节点最大数量增加到 144(以前为 48)。数据节点现在可以使用范围为 1 到 144 的节点 ID。
以前,管理节点的推荐节点 ID 为 49 和 50。这些仍然支持用作管理节点,但将它们用作此类节点会限制数据节点的最大数量为 142;因此,现在建议将节点 ID 145 和 146 用于管理节点。
作为这项工作的一部分,用于数据节点sysfile
的格式已更新为版本 2。该文件记录了每个节点的最后全局检查点索引、重启状态和节点组成员资格等信息(参见 NDB 集群数据节点文件系统目录)。 - RedoOverCommitCounter 和 RedoOverCommitLimit 更改。 由于将它们设置为 0 的语义存在歧义,因此数据节点配置参数
RedoOverCommitCounter
和RedoOverCommitLimit
的最小值已增加到 1。 - ndb_autoincrement_prefetch_sz 更改。
ndb_autoincrement_prefetch_sz
服务器系统变量的默认值增加到 512。 - 参数最大值和默认值的更改。 NDB 8.0 对配置参数的最大值和默认值进行了以下更改:
DataMemory
的最大值增加到 16TB。DiskPageBufferMemory
的最大值也增加到 16TB。- 默认值
StringMemory
已增加至 25%。 LcpScanProgressTimeout
的默认值已增加至 180 秒。
- 磁盘数据检查点改进。 NDB Cluster 8.0 提供了许多新的增强功能,有助于在使用非易失性内存设备(如固态硬盘和 NVMe 规范的设备)时减少磁盘数据表和表空间的检查点延迟。这些改进包括以下内容:
- 避免检查点磁盘写入的突发
- 加速当重做日志或撤销日志变满时的磁盘数据表空间检查点
- 在必要时平衡磁盘和内存检查点之间的检查点
- 保护磁盘设备免受过载,以确保在高负载下低延迟
- 作为这项工作的一部分,已添加了两个数据节点配置参数。
MaxDiskDataLatency
设定了磁盘访问允许的延迟上限,并导致超过此时间长度的事务被中止。DiskDataUsingSameDisk
使得可以利用将磁盘数据表空间放置在不同磁盘上,从而增加这些表空间的检查点执行速度。
此外,ndbinfo
数据库中的三个新表提供有关磁盘数据性能的信息:
diskstat
表报告过去一秒钟对磁盘数据表空间的写入diskstats_1sec
表报告过去 20 秒对磁盘数据表空间的写入pgman_time_track_stats
表报告与磁盘数据表空间相关的磁盘操作的延迟
- 内存分配和 TransactionMemory。 新的
TransactionMemory
参数简化了数据节点内存用于事务的分配,作为汇总事务和本地数据管理器(LDM)内存的工作的一部分。该参数旨在取代已被弃用的几个旧事务内存参数。事务内存现在可以通过以下三种方式之一设置:
- 几个配置参数与
TransactionMemory
不兼容。如果设置了其中任何一个,就无法设置TransactionMemory
(请参阅与 TransactionMemory 不兼容的参数),并且数据节点的事务内存将如同在 NDB 8.0 之前一样确定。
注意
尝试在config.ini
文件中同时设置TransactionMemory
和任何这些参数会阻止管理服务器启动。 - 如果设置了
TransactionMemory
,则该值用于确定事务内存。如果已设置了前面提到的任何不兼容参数,则无法设置TransactionMemory
。 - 如果没有设置任何不兼容的参数,并且也没有设置
TransactionMemory
,则事务内存由NDB
设置。
- 更多信息,请参阅
TransactionMemory
的描述,以及第 25.4.3.13 节,“数据节点内存管理”。 - 支持额外的片段副本。 NDB 8.0 将在生产中支持的片段副本的最大数量从两个增加到四个。(以前,可以将
NoOfReplicas
设置为 3 或 4,但这在测试中并未得到官方支持或验证。) - 分片恢复。 从 NDB 8.0.20 开始,可以将备份分成大致相等的部分(片段),并使用两个新选项并行恢复这些片段,这两个选项已经在ndb_restore中实现:
--num-slices
确定备份应分成的片段数。--slice-id
提供要由当前实例的ndb_restore恢复的片段的 ID。
- 这使得可以使用多个实例的ndb_restore并行恢复备份的子集,可能减少执行恢复操作所需的时间。
更多信息,请参阅ndb_restore的--num-slices
选项的描述。 - 从任何片段副本读取已启用。 对于所有
NDB
表,默认启用从任何片段副本读取。这意味着ndb_read_backup
系统变量的默认值现在为 ON,并且在创建新的NDB
表时,NDB_TABLE
注释选项READ_BACKUP
的值为 1。启用从任何片段副本读取显著提高了从NDB
表读取的性能,对写入的影响很小。
欲了解更多信息,请参阅ndb_read_backup
系统变量的描述,以及 Section 15.1.20.12,“设置 NDB 注释选项”。 - ndb_blob_tool 增强。 从 NDB 8.0.20 开始,ndb_blob_tool实用程序可以检测缺失的 blob 部分,其中存在内联部分,并用正确长度的占位符 blob 部分(由空格字符组成)替换这些部分。要检查是否存在缺失的 blob 部分,请使用此程序的
--check-missing
选项。要用占位符替换任何缺失的 blob 部分,请使用--add-missing
选项。
欲了解更多信息,请参阅 Section 25.5.6,“ndb_blob_tool — 检查和修复 NDB Cluster 表的 BLOB 和 TEXT 列”。 - ndbinfo 版本控制。
NDB
8.0.20 及更高版本支持ndbinfo
表的版本控制,并在内部维护其表的当前定义。在启动时,NDB
会将其支持的ndbinfo
版本与数据字典中存储的版本进行比较。如果版本不同,NDB
会删除任何旧的ndbinfo
表,并使用当前定义重新创建它们。 - 对 Fedora Linux 的支持。 从 NDB 8.0.20 开始,Fedora Linux 是 NDB Cluster Community 版本的支持平台,并可以使用 Oracle 提供的 RPM 包进行安装。这些可以从NDB Cluster 下载页面获取。
- NDB 程序—NDBT 依赖项移除。 已移除了许多
NDB
实用程序对NDBT
库的依赖。该库在开发中内部使用,对于正常使用不需要;将其包含在这些程序中可能会导致测试时出现不希望的问题。受影响的程序列在此处,以及移除依赖项的NDB
版本:
- ndb_restore
- ndb_delete_all
- ndb_show_tables (NDB 8.0.20)
- ndb_waiter (NDB 8.0.20)
- 这一变化对用户的主要影响是,这些程序在运行完成后不再打印
NDBT_ProgramExit - *
status*
。依赖于这种行为的应用程序在升级到指定版本时应该进行更新。 - 外键和大小写。
NDB
使用外键名称的定义大小写存储这些名称。以前,当lower_case_table_names
系统变量的值设置为 0 时,它对外键名称进行区分大小写比较,就像在SELECT
和其他 SQL 语句中使用的名称与存储的名称一样。从 NDB 8.0.20 开始,无论lower_case_table_names
的值如何,这样的比较现在总是以不区分大小写的方式进行。 - 多个传输器。 NDB 8.0.20 引入了支持多个传输器,用于处理数据节点之间的节点间通信。这有助于集群中每个节点组的更新操作速率更高,并有助于避免使用单个套接字进行节点间通信时系统或其他限制所施加的约束。
默认情况下,NDB
现在根据本地数据管理(LDM)线程数或事务协调器(TC)线程数中较大的那个数来使用一定数量的传输器。默认情况下,传输器的数量等于这个数的一半。虽然默认情况下对大多数工作负载表现良好,但可以通过设置NodeGroupTransporters
数据节点配置参数(也在 NDB 8.0.20 中引入)来调整每个节点组使用的传输器数量,最大值为 LDM 线程数或 TC 线程数中较大的那个数。将其设置为 0 会导致传输器的数量与 LDM 线程数相同。 - ndb_restore:主键模式更改。 NDB 8.0.21(及更高版本)在使用ndb_restore恢复
NDB
本机备份时,支持源表和目标表的不同主键定义,当使用--allow-pk-changes
选项运行时。 支持增加和减少构成原始主键的列数。
当主键使用额外列扩展时,添加的任何列必须定义为NOT NULL
,并且在进行备份时,这些列中的任何值都不得更改。 因为一些应用程序在更新行时会设置所有列的值,无论实际上是否更改了所有值,这可能会导致恢复操作失败,即使要添加到主键的列中没有值发生更改。 您可以使用 NDB 8.0.21 中还添加的--ignore-extended-pk-updates
选项覆盖此行为;在这种情况下,您必须确保不更改任何这样的值。
无论这一列是否仍然是表的一部分,都可以从表的主键中删除一列。
要获取更多信息,请参阅ndb_restore选项--allow-pk-changes
的描述。 - 使用 ndb_restore 合并备份。 在某些情况下,可能希望将最初存储在不同 NDB 集群实例(都使用相同模式)中的数据合并到单个目标 NDB 集群中。 当使用ndb_mgm客户端创建的备份(请参阅第 25.6.8.2 节,“使用 NDB 集群管理客户端创建备份”)并使用ndb_restore进行恢复时,现在支持使用 NDB 8.0.21 中添加的
--remap-column
选项以及--restore-data
(可能还需要或希望的其他兼容选项)。--remap-column
可用于处理源集群之间主键和唯一键值重叠的情况,并且在目标集群中不重叠是必要的,以及保留表之间的其他关系,如外键。--remap-column
的参数是一个字符串,格式为*
db*.*
tbl*.*
col*:*
fn*:*
args*
,其中*db
,tbl
和col
分别是数据库,表和列的名称,fn
是重新映射函数的名称,args
是一个或多个fn
的参数。没有默认值。只支持offset
作为函数名称,args
*是要在从备份插入目标表时应用到列值的整数偏移量。此列必须是INT
- INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT")或BIGINT
- INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT")之一;偏移值的允许范围与该类型的有符号版本相同(如果需要,这允许偏移为负)。新选项可以在同一次调用ndb_restore中多次使用,这样您可以重新映射同一表的多个列,不同表或两者的新值。偏移值不必对所有选项实例相同。此外,还为ndb_desc提供了两个新选项,从 NDB 8.0.21 开始:
--auto-inc
(简写形式-a
):如果表具有AUTO_INCREMENT
列,则在输出中包含下一个自增值。--context
(简写形式-x
):提供有关表的额外信息,包括模式,数据库名称,表名称和内部 ID。
- 有关更多信息和示例,请参阅
--remap-column
选项的描述。 - 发送线程改进。 从 NDB 8.0.20 开始,每个发送线程现在处理发送到一组传输器的发送,并且每个块线程现在只辅助一个发送线程,导致更多的发送线程,从而提高性能和数据节点的可伸缩性。
- 使用 SpinMethod 进行自适应自旋控制。 在支持的平台上设置自适应 CPU 自旋的简单接口,使用
SpinMethod
数据节点参数。该参数(在 NDB 8.0.20 中添加,从 NDB 8.0.24 开始生效)有四个设置,分别用于静态自旋、基于成本的自适应自旋、优化延迟的自适应自旋以及针对每个线程都有自己 CPU 的数据库机器进行优化的自适应自旋。这些设置中的每一个都会使数据节点使用一组预定值来设置一个或多个自旋参数,从而实现自适应自旋,设置自旋时间和自旋开销,适用于特定场景,从而无需为常见用例直接设置这些值。为了对自旋行为进行微调,还可以直接设置这些和其他自旋参数,使用现有的SchedulerSpinTimer
数据节点配置参数以及在ndb_mgm客户端中的以下DUMP
命令:
DUMP 104000 (SetSchedulerSpinTimerAll)
: 设置所有线程的自旋时间DUMP 104001 (SetSchedulerSpinTimerThread)
: 设置指定线程的自旋时间DUMP 104002 (SetAllowedSpinOverhead)
: 设置自旋开销,即允许获得 1 单位延迟所需的 CPU 时间单位数DUMP 104003 (SetSpintimePerCall)
: 设置调用的自旋时间DUMP 104004 (EnableAdaptiveSpinning)
: 启用或禁用自适应自旋
- NDB 8.0.20 还添加了一个新的 TCP 配置参数
TcpSpinTime
,用于设置给定 TCP 连接的自旋时间。
ndb_top 工具也得到增强,以提供每个线程的自旋时间信息。
欲了解更多信息,请参阅SpinMethod
参数的描述,列出的DUMP
命令以及 Section 25.5.29, “ndb_top — 查看 NDB 线程的 CPU 使用信息”。 - 磁盘数据和集群重启。 从 NDB 8.0.21 开始,集群的初始重启会强制删除所有磁盘数据对象,如表空间和日志文件组,包括与这些对象相关联的任何数据文件和撤销日志文件。
更多信息请参见第 25.6.11 节,“NDB 集群磁盘数据表”。 - 磁盘数据范围分配。 从 NDB 8.0.20 开始,在数据文件中分配范围是在给定表空间中使用的所有数据文件之间以循环方式进行的。这有望改善在使用多个存储设备进行磁盘数据存储时数据的分布。
更多信息请参见第 25.6.11.1 节,“NDB 集群磁盘数据对象”。 - –ndb-log-fail-terminate 选项。 从 NDB 8.0.21 开始,您可以通过使用
--ndb-log-fail-terminate
选项启动 mysqld,使 SQL 节点在无法完全记录所有行事件时终止。 - AllowUnresolvedHostNames 参数。 默认情况下,管理节点在无法解析全局配置文件中存在的主机名时拒绝启动,这在某些环境(如 Kubernetes)中可能会有问题。从 NDB 8.0.22 开始,可以通过在集群全局配置文件(
config.ini
文件)的[tcp default]
部分中将AllowUnresolvedHostNames
设置为true
来覆盖此行为。这样做会将此类错误视为警告,并允许 ndb_mgmd 继续启动 - Blob 写入性能增强。 NDB 8.0.22 实现了一些改进,允许在同一行中修改多个 blob 列或在同一语句中修改包含 blob 列的多行时更有效地进行批处理,从而减少 SQL 或其他 API 节点与数据节点之间在应用这些修改时所需的往返次数。因此,许多
INSERT
、UPDATE
和DELETE
语句的性能可以得到改善。这里列出了一些这样的语句示例,其中table
是包含一个或多个 Blob 列的NDB
表:
INSERT INTO *
table* VALUES ROW(1, *
blob_value1*, *
blob_value2*, ...)
,即插入包含一个或多个 Blob 列的一行数据INSERT INTO *
table* VALUES ROW(1, *
blob_value1*), ROW(2, *
blob_value2*), ROW(3, *
blob_value3*), ...
,即插入包含一个或多个 Blob 列的多行数据UPDATE *
table* SET *
blob_column1* = *
blob_value1*, *
blob_column2* = *
blob_value2*, ...
UPDATE *
table* SET *
blob_column* = *
blob_value* WHERE *
primary_key_column* in (*
value_list*)
,其中主键列不是 Blob 类型DELETE FROM *
table* WHERE *
primary_key_column* = *
value*
,其中主键列不是 Blob 类型DELETE FROM *
table* WHERE *
primary_key_column* IN (*
value_list*)
,其中主键列不是 Blob 类型
- 其他 SQL 语句也可能从这些改进中受益。这些包括
LOAD DATA INFILE
和CREATE TABLE ... SELECT ...
。此外,ALTER TABLE *
table* ENGINE = NDB
,其中table
在执行语句之前使用的存储引擎不是NDB
,也可能执行得更有效率。
这种改进适用于影响 MySQL 类型BLOB
、MEDIUMBLOB
、LONGBLOB
、TEXT
、MEDIUMTEXT
和LONGTEXT
列的语句。仅更新TINYBLOB
或TINYTEXT
列(或两种类型)的语句不受此工作的影响,不应期望其性能发生变化。
由于某些 SQL 语句需要扫描表格 Blob 列,这会破坏批处理,因此这种改进对某些 SQL 语句的性能没有明显提升。这些语句包括以下类型:
SELECT FROM *
table* [WHERE *
key_column* IN (*
blob_value_list*)]
,其中通过匹配使用 Blob 类型的主键或唯一键列来选择行UPDATE *
table* SET *
blob_column* = *
blob_value* WHERE *
condition*
,使用一个不依赖于唯一值的condition
DELETE FROM *
table* WHERE *
condition*
用于删除包含一个或多个 Blob 列的行,使用一个不依赖于唯一值的condition
- 在执行语句之前已经使用
NDB
存储引擎的表上执行复制ALTER TABLE
语句,并且在执行语句之前或之后(或两者都有)表的行包含一个或多个 Blob 列
- 为了充分利用这一改进,您可能希望增加用于 mysqld 的
--ndb-batch-size
和--ndb-blob-write-batch-bytes
选项的值,以最小化修改 blob 所需的往返次数。对于复制,还建议启用slave_allow_batching
系统变量,以最小化副本集群应用时代事务所需的往返次数。
注意
从 NDB 8.0.30 版本开始,您还应该使用ndb_replica_batch_size
替代--ndb-batch-size
,以及ndb_replica_blob_write_batch_bytes
而不是--ndb-blob-write-batch-bytes
。有关这些变量的描述以及更多信息,请参见这些变量的描述,以及 第 25.7.5 节,“为复制准备 NDB 集群”。 - Node.js 更新。 从 NDB 8.0.22 版本开始,Node.js 的
NDB
适配器使用的是版本 12.18.3,并且现在仅支持该版本(或更高版本的 Node.js)。 - 加密备份。 NDB 8.0.22 版本新增了对使用 AES-256-CBC 加密的备份文件的支持;这旨在防止未经授权的人员从已被访问的备份中恢复数据。当备份数据加密时,会由用户提供的密码进行保护。密码可以是任何由可打印 ASCII 字符范围内除了
!
,'
,"
,$
,%
,\
, 和^
之外的最多 256 个字符组成的字符串。对于加密任何给定 NDB 集群备份所使用的密码的保留必须由用户或应用程序执行;NDB
不保存密码。密码可以为空,尽管这并不推荐。在进行 NDB 集群备份时,可以使用管理客户端START BACKUP
命令,并通过ENCRYPT PASSWORD=*
password*
进行加密。MGM API 的用户也可以通过调用ndb_mgm_start_backup4()
来启动加密备份。你可以使用ndbxfrm实用程序对现有的备份文件进行加密,该实用程序已添加到 NDB Cluster 发行版中的 8.0.22 版本中;该程序还可用于解密加密的备份文件。此外,ndbxfrm可以使用与 NDB Cluster 在设置CompressedBackup
配置参数为 1 时创建备份时所使用的相同方法来压缩备份文件和解压缩压缩备份文件。要从加密备份中恢复,请使用ndb_restore与选项--decrypt
和--backup-password
。这两个选项是必需的,以及任何其他在未加密情况下恢复相同备份所需的选项。ndb_print_backup_file和ndbxfrm也可以分别使用-P
*password
*和--decrypt-password=*
password*
读取加密文件。在提供密码以及加密或解密选项的所有情况下,密码必须用引号括起来;您可以使用单引号或双引号来界定密码。从 NDB 8.0.24 开始,这里列出的几个NDB
程序还支持从标准输入输入密码,类似于在与mysql客户端交互登录时使用--password
选项(不包括在命令行中输入密码)的方式:
- 对于ndb_restore和ndb_print_backup_file,
--backup-password-from-stdin
选项使得可以以安全的方式输入密码,类似于mysql客户端的--password
选项。对于ndb_restore,与--decrypt
选项一起使用;对于ndb_print_backup_file,使用该选项代替-P
选项。 - 对于ndb_mgm,选项
--backup-password-from-stdin
与--execute "START BACKUP [*
选项*]"
一起支持从系统 shell 启动集群备份。 - 两个ndbxfrm选项,
--encrypt-password-from-stdin
和--decrypt-password-from-stdin
,在使用该程序加密或解密备份文件时会导致类似的行为。
- 有关刚列出的程序的更多信息,请参阅其描述。
从 NDB 8.0.22 开始,还可以通过在集群全局配置文件的[ndbd default]
部分中设置RequireEncryptedBackup=1
来强制备份加密。这样做时,ndb_mgm客户端将拒绝任何未加密的备份尝试。
从 NDB 8.0.24 开始,您可以通过使用--encrypt-backup
启动ndb_mgm来使其在创建备份时使用加密。在这种情况下,如果未提供密码,则在调用START BACKUP
时会提示用户输入密码。
MySQL8 中文参考(八十五)(4)https://developer.aliyun.com/article/1566067