MySQL8 中文参考(九十五)
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-cluster-disk-data-storage-requirements.html
25.6.11.2 NDB 集群磁盘数据存储要求
以下项目适用于磁盘数据存储要求:
-
变长列的磁盘数据表占据固定的空间。对于每一行,这等于存储该列可能的最大值所需的空间。
有关计算这些值的一般信息,请参阅第 13.7 节,“数据类型存储要求”。
您可以通过查询信息模式
FILES表来估算数据文件和撤销日志文件中可用空间的数量。有关更多信息和示例,请参阅第 28.3.15 节,“INFORMATION_SCHEMA FILES 表”。注意
OPTIMIZE TABLE语句对磁盘数据表没有任何影响。 -
在磁盘数据表中,
TEXT或BLOB列的前 256 个字节存储在内存中;只有剩余部分存储在磁盘上。 -
磁盘数据表中的每一行在内存中使用 8 个字节指向存储在磁盘上的数据。这意味着,在某些情况下,将内存列转换为基于磁盘的格式实际上可能导致更大的内存使用量。例如,将
CHAR(4)列从基于内存的格式转换为基于磁盘的格式会将每行使用的DataMemory从 4 字节增加到 8 字节。
重要提示
使用--initial选项启动集群不会删除磁盘数据文件。在执行集群的初始重新启动之前,您必须手动删除这些文件。
通过确保DiskPageBufferMemory的大小足够,可以通过最小化磁盘寻址次数来提高磁盘数据表的性能。您可以查询diskpagebuffer表来帮助确定是否需要增加此参数的值。
25.6.12 NDB 集群中的在线 ALTER TABLE 操作
译文:
dev.mysql.com/doc/refman/8.0/en/mysql-cluster-online-operations.html
MySQL NDB 集群 8.0 支持使用 ALTER TABLE ... ALGORITHM=DEFAULT|INPLACE|COPY 进行在线表模式更改。NDB 集群处理 COPY 和 INPLACE 如下几段描述的方式。
对于 ALGORITHM=COPY,mysqld NDB 集群处理程序执行以下操作:
-
告诉数据节点创建表的空副本,并对此副本进行所需的模式更改。
-
从原始表中读取行,并将其写入副本。
-
告诉数据节点删除原始表,然后重命名副本。
我们有时将其称为“复制”或“离线” ALTER TABLE。
DML 操作不允许与复制的 ALTER TABLE 并发进行。
发出复制 ALTER TABLE 语句的 mysqld 获取元数据锁,但这仅在该 mysqld 上有效。其他 NDB 客户端可以在复制 ALTER TABLE 过程中修改行数据,导致不一致。
对于 ALGORITHM=INPLACE,NDB 集群处理程序告诉数据节点进行所需的更改,并且不执行任何数据复制。
我们还将其称为“非复制”或“在线” ALTER TABLE。
非复制 ALTER TABLE 允许并发的 DML 操作。
ALGORITHM=INSTANT 不受 NDB 8.0 支持。
无论使用的算法如何,mysqld 在执行 ALTER TABLE 时会获取全局模式锁(GSL);这会阻止在集群中的此节点或任何其他 SQL 节点上同时执行任何(其他)DDL 或备份。通常情况下,这不会有问题,除非 ALTER TABLE 需要很长时间。
注意
一些较旧的 NDB 集群版本使用特定于 NDB 的语法进行在线 ALTER TABLE 操作。该语法已被移除。
在 NDB 表的可变宽度列上添加和删除索引的操作是在线的。在线操作是非复制的;也就是说,它们不需要重新创建索引。它们不会锁定正在被其他 API 节点访问的 NDB Cluster 中的表(但请参阅限制 NDB 在线操作,本节后面)。这些操作不需要单用户模式用于在具有多个 API 节点的 NDB 集群中进行的 NDB 表更改;事务可以在在线 DDL 操作期间继续无间断。
ALGORITHM=INPLACE 可用于在 NDB 表上执行在线 ADD COLUMN、ADD INDEX(包括 CREATE INDEX 语句)和 DROP INDEX 操作。还支持对 NDB 表进行在线重命名(在 NDB 8.0 之前,此类列无法在线重命名)。
无法在线向 NDB 表中添加基于磁盘的列。这意味着,如果您希望向使用表级 STORAGE DISK 选项的 NDB 表添加内存列,必须明确声明新列使用基于内存的存储。例如——假设您已经创建了表空间 ts1——假设您创建表 t1 如下:
mysql> CREATE TABLE t1 (
> c1 INT NOT NULL PRIMARY KEY,
> c2 VARCHAR(30)
> )
> TABLESPACE ts1 STORAGE DISK
> ENGINE NDB;
Query OK, 0 rows affected (1.73 sec)
Records: 0 Duplicates: 0 Warnings: 0
您可以在线向此表添加一个新的内存列,如下所示:
mysql> ALTER TABLE t1
> ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC STORAGE MEMORY,
> ALGORITHM=INPLACE;
Query OK, 0 rows affected (1.25 sec)
Records: 0 Duplicates: 0 Warnings: 0
如果省略了 STORAGE MEMORY 选项,则此语句将失败:
mysql> ALTER TABLE t1
> ADD COLUMN c4 INT COLUMN_FORMAT DYNAMIC,
> ALGORITHM=INPLACE;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason:
Adding column(s) or add/reorganize partition not supported online. Try
ALGORITHM=COPY.
如果省略 COLUMN_FORMAT DYNAMIC 选项,则会自动使用动态列格式,但会发出警告,如下所示:
mysql> ALTER ONLINE TABLE t1 ADD COLUMN c4 INT STORAGE MEMORY;
Query OK, 0 rows affected, 1 warning (1.17 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW WARNINGS\G
*************************** 1\. row ***************************
Level: Warning
Code: 1478
Message: DYNAMIC column c4 with STORAGE DISK is not supported, column will
become FIXED
mysql> SHOW CREATE TABLE t1\G
*************************** 1\. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`c1` int(11) NOT NULL,
`c2` varchar(30) DEFAULT NULL,
`c3` int(11) /*!50606 STORAGE MEMORY */ /*!50606 COLUMN_FORMAT DYNAMIC */ DEFAULT NULL,
`c4` int(11) /*!50606 STORAGE MEMORY */ DEFAULT NULL,
PRIMARY KEY (`c1`)
) /*!50606 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.03 sec)
注意
STORAGE 和 COLUMN_FORMAT 关键字仅在 NDB Cluster 中受支持;在 MySQL 的任何其他版本中,尝试在 CREATE TABLE 或 ALTER TABLE 语句中使用这两个关键字会导致错误。
也可以在 NDB 表上使用语句 ALTER TABLE ... REORGANIZE PARTITION, ALGORITHM=INPLACE,在没有 *partition_names* INTO (*partition_definitions*) 选项的情况下。这可以用于在线在新添加到集群中的数据节点之间重新分配 NDB Cluster 数据。这不会执行任何碎片整理,这需要一个 OPTIMIZE TABLE 或空 ALTER TABLE 语句。更多信息,请参见 Section 25.6.7, “Adding NDB Cluster Data Nodes Online”。
NDB 在线操作的限制
不支持在线DROP COLUMN操作。
添加列或添加或删除索引的在线ALTER TABLE、CREATE INDEX或DROP INDEX语句受以下限制:
-
给定的在线
ALTER TABLE只能使用ADD COLUMN、ADD INDEX或DROP INDEX中的一个。可以在单个语句中在线添加一个或多个列;在单个语句中只能创建或删除一个索引。 -
在运行在线
ALTER TABLEADD COLUMN、ADD INDEX或DROP INDEX(或CREATE INDEX或DROP INDEX语句)时,正在更改的表对于除运行在线操作的 API 节点之外的其他 API 节点不会被锁定。然而,在执行在线操作时,该表会针对相同API 节点上发起的任何其他操作被锁定。 -
要更改的表必须具有显式主键;由
NDB存储引擎创建的隐藏主键不足以满足此目的。 -
表使用的存储引擎无法在线更改。
-
表使用的表空间无法在线更改。从 NDB 8.0.21 开始,类似
ALTER TABLE *ndb_table* ... ALGORITHM=INPLACE, TABLESPACE=*new_tablespace*的语句被明确禁止。(Bug #99269,Bug #31180526) -
在与 NDB Cluster Disk Data 表一起使用时,无法在线更改列的存储类型(
DISK或MEMORY)。这意味着,当以在线方式添加或删除索引时,如果要更改列或列的存储类型,必须在添加或删除索引的语句中使用ALGORITHM=COPY。
要在线添加的列不能使用BLOB或TEXT类型,并且必须满足以下条件:
-
列必须是动态的;也就是说,必须能够使用
COLUMN_FORMAT DYNAMIC来创建它们。如果省略COLUMN_FORMAT DYNAMIC选项,则动态列格式会自动使用。 -
列必须允许
NULL值,并且除NULL之外不能有任何显式默认值。在线添加的列会自动创建为DEFAULT NULL,如下所示:mysql> CREATE TABLE t2 ( > c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY > ) ENGINE=NDB; Query OK, 0 rows affected (1.44 sec) mysql> ALTER TABLE t2 > ADD COLUMN c2 INT, > ADD COLUMN c3 INT, > ALGORITHM=INPLACE; Query OK, 0 rows affected, 2 warnings (0.93 sec) mysql> SHOW CREATE TABLE t1\G *************************** 1\. row *************************** Table: t1 Create Table: CREATE TABLE `t2` ( `c1` int(11) NOT NULL AUTO_INCREMENT, `c2` int(11) DEFAULT NULL, `c3` int(11) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec) -
必须在任何现有列之后添加列。如果尝试在线在任何现有列之前或使用
FIRST关键字添加列,则语句将失败并显示错误。 -
无法在线重新排序现有表列。
对于NDB表的在线ALTER TABLE操作,在线添加列时,或者在线创建或删除索引时,固定格式列会被转换为动态格式,如下所示(为了清晰起见,重复显示刚刚显示的CREATE TABLE和ALTER TABLE语句):
mysql> CREATE TABLE t2 (
> c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY
> ) ENGINE=NDB;
Query OK, 0 rows affected (1.44 sec)
mysql> ALTER TABLE t2
> ADD COLUMN c2 INT,
> ADD COLUMN c3 INT,
> ALGORITHM=INPLACE;
Query OK, 0 rows affected, 2 warnings (0.93 sec)
mysql> SHOW WARNINGS;
*************************** 1\. row ***************************
Level: Warning
Code: 1478
Message: Converted FIXED field 'c2' to DYNAMIC to enable online ADD COLUMN
*************************** 2\. row ***************************
Level: Warning
Code: 1478
Message: Converted FIXED field 'c3' to DYNAMIC to enable online ADD COLUMN 2 rows in set (0.00 sec)
只有在线添加的列或列必须是动态的。现有列不需要;这包括表的主键,也可以是FIXED,如下所示:
mysql> CREATE TABLE t3 (
> c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY COLUMN_FORMAT FIXED
> ) ENGINE=NDB;
Query OK, 0 rows affected (2.10 sec)
mysql> ALTER TABLE t3 ADD COLUMN c2 INT, ALGORITHM=INPLACE;
Query OK, 0 rows affected, 1 warning (0.78 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW WARNINGS;
*************************** 1\. row ***************************
Level: Warning
Code: 1478
Message: Converted FIXED field 'c2' to DYNAMIC to enable online ADD COLUMN 1 row in set (0.00 sec)
通过重命名操作不会将列从FIXED转换为DYNAMIC列格式。有关COLUMN_FORMAT的更多信息,请参见第 15.1.20 节,“CREATE TABLE Statement”。
在使用ALGORITHM=INPLACE的ALTER TABLE语句中支持KEY、CONSTRAINT和IGNORE关键字。
使用在线ALTER TABLE语句将MAX_ROWS设置为 0 是不允许的。您必须使用复制的ALTER TABLE来执行此操作。(Bug #21960004)
25.6.13 权限同步和 NDB_STORED_USER
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-cluster-privilege-synchronization.html
NDB 8.0 引入了一个新的机制,用于在连接到 NDB Cluster 的 SQL 节点之间共享和同步用户、角色和权限。这可以通过授予 NDB_STORED_USER 权限来启用。查看权限的描述以获取使用信息。
NDB_STORED_USER 在 SHOW GRANTS 的输出中与其他权限一样被打印出来,如下所示:
mysql> SHOW GRANTS for 'jon'@'localhost';
+---------------------------------------------------+
| Grants for jon@localhost |
+---------------------------------------------------+
| GRANT USAGE ON *.* TO `jon`@`localhost` |
| GRANT NDB_STORED_USER ON *.* TO `jon`@`localhost` |
+---------------------------------------------------+
您还可以使用 NDB Cluster 提供的 ndb_select_all 实用程序验证此帐户的权限是否已共享,如下所示(一些输出已换行以保持格式):
$> ndb_select_all -d mysql ndb_sql_metadata | grep '`jon`@`localhost`'
12 "'jon'@'localhost'" 0 [NULL] "GRANT USAGE ON *.* TO `jon`@`localhost`"
11 "'jon'@'localhost'" 0 2 "CREATE USER `jon`@`localhost`
IDENTIFIED WITH 'caching_sha2_password' AS
0x2441243030352466014340225A107D590E6E653B5D587922306102716D752E6656772F3038512F
6C5072776D30376D37347A384B557A4C564F70495158656A31382E45324E33
REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT
PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT"
12 "'jon'@'localhost'" 1 [NULL] "GRANT NDB_STORED_USER ON *.* TO `jon`@`localhost`"
ndb_sql_metadata 是一个特殊的 NDB 表,不能使用 mysql 或其他 MySQL 客户端看到。
授予 NDB_STORED_USER 权限的语句,例如 GRANT NDB_STORED_USER ON *.* TO 'cluster_app_user'@'localhost',通过指示 NDB 使用查询 SHOW CREATE USER cluster_app_user@localhost 和 SHOW GRANTS FOR cluster_app_user@localhost 来创建一个快照,然后将结果存储在 ndb_sql_metadata 中。然后请求任何其他 SQL 节点读取和应用该快照。每当 MySQL 服务器启动并作为 SQL 节点加入集群时,它会执行这些存储的 CREATE USER 和 GRANT 语句作为集群模式同步过程的一部分。
每当在非原始 SQL 节点上执行 SQL 语句时,该语句将在 NDBCLUSTER 存储引擎的实用线程中运行;这是在与 MySQL 复制副本应用程序线程相同的安全环境中完成的。
从 NDB 8.0.27 开始,执行对用户权限的更改的 SQL 节点在执行之前会获取全局锁,这可以防止不同 SQL 节点上的并发 ACL 操作导致死锁。在 NDB 8.0.27 之前,对具有 NDB_STORED_USER 的用户的更改是完全异步更新的,没有任何锁被获取。
请记住,由于共享模式更改操作是同步执行的,因此在更改任何共享用户或用户后,下一个共享模式更改将作为同步点。在模式更改分发开始之前,任何待处理的用户更改都会完成;之后模式更改本身会同步运行。例如,如果一个DROP DATABASE语句跟随一个DROP USER对分布式用户的操作,那么在所有 SQL 节点上用户的删除完成之前,数据库的删除无法进行。
如果来自多个 SQL 节点的多个GRANT、REVOKE或其他用户管理语句导致给定用户在不同 SQL 节点上的权限不一致,您可以通过在已知权限正确的 SQL 节点上为该用户发出GRANT NDB_STORED_USER来解决此问题;这将导致对权限的新快照被获取并同步到其他 SQL 节点。
NDB Cluster 8.0 不支持通过更改 MySQL 权限表使其使用NDB存储引擎来在 NDB Cluster 中的 SQL 节点之间分发 MySQL 用户和权限,就像在 NDB 7.6 和之前的版本中一样(参见 Distributed Privileges Using Shared Grant Tables)。有关此更改对从先前版本升级到 NDB 8.0 的影响的信息,请参见 Section 25.3.7, “Upgrading and Downgrading NDB Cluster”。
25.6.14 NDB 集群的文件系统加密
25.6.14.1 NDB 文件系统加密设置和使用
25.6.14.2 NDB 文件系统加密实现
25.6.14.3 NDB 文件系统加密限制
以下章节提供了关于NDB数据节点文件系统加密的信息,该加密方式在 NDB 8.0.31 及更高版本中实现。
译文:
dev.mysql.com/doc/refman/8.0/en/mysql-cluster-tde-setup.html
25.6.14.1 NDB 文件系统加密设置和使用
文件系统加密:要启用先前未加密的文件系统的加密,需要执行以下步骤:
-
在
config.ini文件的[ndbd default]部分中设置所需的数据节点参数,如下所示:[ndbd default] EncryptedFileSystem= 1这些参数必须如所有数据节点所示设置。
-
使用
--initial或--reload启动管理服务器,以使其读取更新后的配置文件。 -
执行所有数据节点的滚动初始启动(或重新启动)(参见第 25.6.5 节,“执行 NDB 集群的滚动重启”启动每个数据节点;此外,对每个数据节点进程提供
--filesystem-password或--filesystem-password-from-stdin中的任一选项,以及密码。当您在命令行上提供密码时,会显示警告,类似于这样:> ndbmtd -c 127.0.0.1 --filesystem-password=ndbsecret ndbmtd: [Warning] Using a password on the command line interface can be insecure. 2022-08-22 16:17:58 [ndbd] INFO -- Angel connected to '127.0.0.1:1186' 2022-08-22 16:17:58 [ndbd] INFO -- Angel allocated nodeid: 5--filesystem-password可以接受来自文件、tty或stdin的密码;--filesystem-password-from-stdin仅接受来自stdin的密码。后者保护密码免受在进程命令行或文件系统中暴露,并允许从另一个安全应用程序传递密码的可能性。您还可以将密码放在一个
my.cnf文件中,该文件可以被数据节点进程读取,但不能被系统的其他用户读取。使用与前面示例中相同的密码,文件的相关部分应如下所示:[ndbd] filesystem-password=ndbsecret您还可以在
my.cnf文件中使用--filesystem-password-from-stdin选项提示启动数据节点进程的用户在启动时提供加密密码,如下所示:[ndbd] filesystem-password-from-stdin在这种情况下,当启动数据节点进程时,用户会被提示输入密码,如下所示:
> ndbmtd -c 127.0.0.1 Enter filesystem password: ********* 2022-08-22 16:36:00 [ndbd] INFO -- Angel connected to '127.0.0.1:1186' 2022-08-22 16:36:00 [ndbd] INFO -- Angel allocated nodeid: 5 >无论使用何种方法,加密密码的格式与用于加密备份密码的格式相同(参见第 25.6.8.2 节,“使用 NDB 集群管理客户端创建备份”或
--filesystem-password-from-stdin。
文件系统解密:要从加密文件系统中删除加密,请执行以下操作:
-
在
config.ini文件的[ndbd default]部分中,将EncryptedFileSystem = OFF设置为关闭。 -
使用
--initial或--reload重新启动管理服务器。 -
执行数据节点的滚动初始重启。在重新启动节点二进制文件时,不要使用任何与密码相关的选项。
重新启动时,每个数据节点都会清除其磁盘上的状态,并以未加密形式重建。
要查看文件系统加密是否正确配置,可以使用针对ndbinfo config_values和config_params表的查询,类似于这样:
mysql> SELECT v.node_id AS Node, p.param_name AS Parameter, v.config_value AS Value
-> FROM ndbinfo.config_values v
-> JOIN ndbinfo.config_params p
-> ON v.config_param=p.param_number
-> WHERE p.param_name='EncryptedFileSystem';
+------+----------------------+-------+
| Node | Parameter | Value |
+------+----------------------+-------+
| 5 | EncryptedFileSystem | 1 |
| 6 | EncryptedFileSystem | 1 |
| 7 | EncryptedFileSystem | 1 |
| 8 | EncryptedFileSystem | 1 |
+------+----------------------+-------+
4 rows in set (0.10 sec)
在这里,EncryptedFileSystem在所有数据节点上都等于1,这意味着文件系统加密已启用。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-cluster-tde-implementation.html
25.6.14.2 NDB 文件系统加密实现
对于NDB透明数据加密(TDE),数据节点在静止状态下加密用户数据,安全性由密码(文件系统密码)提供,该密码用于加密和解密每个数据节点上的秘密文件。秘密文件包含一个节点主密钥(NMK),稍后用于加密用于持久性的不同文件类型。NDB TDE 加密用户数据文件,包括 LCP 文件、重做日志文件、表空间文件和撤销日志文件。
您可以使用ndbxfrm实用程序查看文件是否已加密,如下所示:
> ndbxfrm -i ndb_5_fs/LCP/0/T2F0.Data
File=ndb_5_fs/LCP/0/T2F0.Data, compression=no, encryption=yes
> ndbxfrm -i ndb_6_fs/LCP/0/T2F0.Data
File=ndb_6_fs/LCP/0/T2F0.Data, compression=no, encryption=no
从 NDB 8.0.31 开始,可以使用在该版本中添加的ndb_secretsfile_reader程序从秘密文件中获取密钥,如下所示:
> ndb_secretsfile_reader --filesystem-password=54kl14 ndb_5_fs/D1/NDBCNTR/S0.sysfile
ndb_secretsfile_reader: [Warning] Using a password on the command line interface can be insecure.
cac256e18b2ddf6b5ef82d99a72f18e864b78453cc7fa40bfaf0c40b91122d18
每个节点的密钥层次结构可以表示如下:
-
用户提供的口令(P)通过使用随机盐的密钥派生函数处理,生成一个唯一的口令密钥(PK)。
-
PK(对每个节点唯一)加密每个节点上的数据在其自己的秘密文件中。
-
秘密文件中的数据包括一个唯一的、随机生成的节点主密钥(NMK)。
-
NMK(使用包装)加密每个加密文件的头部中的一个或多个随机生成的数据加密密钥(DEK)值(包括 LCP 和 TS 文件以及重做和撤销日志)。
-
数据加密密钥值(DEK[0],...,DEK[n])用于加密每个文件中的[子集的]数据。
口令间接加密包含随机 NMK 的秘密文件,该文件加密节点上每个加密文件的一部分头。加密文件头包含用于该文件中数据的随机数据密钥。
加密由数据节点内的NDBFS层透明实现。NDBFS内部客户端块对其文件进行正常操作;NDBFS用额外的头部和尾部信息包装物理文件,支持加密,并在读取和写入文件时加密和解密数据。包装文件格式称为ndbxfrm1。
节点密码通过 PBKDF2 和随机盐处理,用于加密包含用于加密每个加密文件中的随机生成数据加密密钥的秘密文件。
加密和解密工作是在 NDBFS I/O 线程中执行的(而不是在信号执行线程中,如主线程、tc 线程、ldm 线程或 rep 线程)。这类似于压缩的 LCP 和压缩的备份的处理方式,通常会导致增加 I/O 线程的 CPU 使用率;您可能希望根据 I/O 线程的情况调整ThreadConfig。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-cluster-tde-limitations.html
25.6.14.3 NDB 文件系统加密限制
NDB 集群中的透明数据加密受以下限制和限制:
-
文件系统密码必须提供给每个单独的数据节点。
-
文件系统密码轮换需要对数据节点进行初始滚动重启;这必须手动执行,或者由
NDB外部应用程序执行。 -
对于仅具有单个副本的集群(
NoOfReplicas = 1),需要进行完整备份和恢复以进行文件系统密码轮换。 -
所有数据加密密钥的轮换需要初始节点重新启动。
25.6.15 NDB API 统计计数器和变量
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-cluster-ndb-api-statistics.html
有多种类型的统计计数器与由Ndb对象执行或影响的操作相关联。这些操作包括启动和关闭(或中止)事务;主键和唯一键操作;表、范围和修剪扫描;线程在等待各种操作完成时被阻塞;以及由NDBCLUSTER发送和接收的数据和事件。在进行 NDB API 调用或将数据发送到数据节点或接收数据时,这些计数器在 NDB 内核内部递增。mysqld将这些计数器公开为系统状态变量;它们的值可以在SHOW STATUS的输出中读取,或通过查询性能模式session_status或global_status表来读取。通过比较操作NDB表的语句执行前后的值,您可以观察在 API 级别执行的相应操作,从而了解执行语句的成本。
您可以使用以下SHOW STATUS语句列出所有这些状态变量:
mysql> SHOW STATUS LIKE 'ndb_api%';
+----------------------------------------------+-----------+
| Variable_name | Value |
+----------------------------------------------+-----------+
| Ndb_api_wait_exec_complete_count | 297 |
| Ndb_api_wait_scan_result_count | 0 |
| Ndb_api_wait_meta_request_count | 321 |
| Ndb_api_wait_nanos_count | 228438645 |
| Ndb_api_bytes_sent_count | 33988 |
| Ndb_api_bytes_received_count | 66236 |
| Ndb_api_trans_start_count | 148 |
| Ndb_api_trans_commit_count | 148 |
| Ndb_api_trans_abort_count | 0 |
| Ndb_api_trans_close_count | 148 |
| Ndb_api_pk_op_count | 151 |
| Ndb_api_uk_op_count | 0 |
| Ndb_api_table_scan_count | 0 |
| Ndb_api_range_scan_count | 0 |
| Ndb_api_pruned_scan_count | 0 |
| Ndb_api_scan_batch_count | 0 |
| Ndb_api_read_row_count | 147 |
| Ndb_api_trans_local_read_row_count | 37 |
| Ndb_api_adaptive_send_forced_count | 3 |
| Ndb_api_adaptive_send_unforced_count | 294 |
| Ndb_api_adaptive_send_deferred_count | 0 |
| Ndb_api_event_data_count | 0 |
| Ndb_api_event_nondata_count | 0 |
| Ndb_api_event_bytes_count | 0 |
| Ndb_api_wait_exec_complete_count_slave | 0 |
| Ndb_api_wait_scan_result_count_slave | 0 |
| Ndb_api_wait_meta_request_count_slave | 0 |
| Ndb_api_wait_nanos_count_slave | 0 |
| Ndb_api_bytes_sent_count_slave | 0 |
| Ndb_api_bytes_received_count_slave | 0 |
| Ndb_api_trans_start_count_slave | 0 |
| Ndb_api_trans_commit_count_slave | 0 |
| Ndb_api_trans_abort_count_slave | 0 |
| Ndb_api_trans_close_count_slave | 0 |
| Ndb_api_pk_op_count_slave | 0 |
| Ndb_api_uk_op_count_slave | 0 |
| Ndb_api_table_scan_count_slave | 0 |
| Ndb_api_range_scan_count_slave | 0 |
| Ndb_api_pruned_scan_count_slave | 0 |
| Ndb_api_scan_batch_count_slave | 0 |
| Ndb_api_read_row_count_slave | 0 |
| Ndb_api_trans_local_read_row_count_slave | 0 |
| Ndb_api_adaptive_send_forced_count_slave | 0 |
| Ndb_api_adaptive_send_unforced_count_slave | 0 |
| Ndb_api_adaptive_send_deferred_count_slave | 0 |
| Ndb_api_wait_exec_complete_count_replica | 0 |
| Ndb_api_wait_scan_result_count_replica | 0 |
| Ndb_api_wait_meta_request_count_replica | 0 |
| Ndb_api_wait_nanos_count_replica | 0 |
| Ndb_api_bytes_sent_count_replica | 0 |
| Ndb_api_bytes_received_count_replica | 0 |
| Ndb_api_trans_start_count_replica | 0 |
| Ndb_api_trans_commit_count_replica | 0 |
| Ndb_api_trans_abort_count_replica | 0 |
| Ndb_api_trans_close_count_replica | 0 |
| Ndb_api_pk_op_count_replica | 0 |
| Ndb_api_uk_op_count_replica | 0 |
| Ndb_api_table_scan_count_replica | 0 |
| Ndb_api_range_scan_count_replica | 0 |
| Ndb_api_pruned_scan_count_replica | 0 |
| Ndb_api_scan_batch_count_replica | 0 |
| Ndb_api_read_row_count_replica | 0 |
| Ndb_api_trans_local_read_row_count_replica | 0 |
| Ndb_api_adaptive_send_forced_count_replica | 0 |
| Ndb_api_adaptive_send_unforced_count_replica | 0 |
| Ndb_api_adaptive_send_deferred_count_replica | 0 |
| Ndb_api_event_data_count_injector | 0 |
| Ndb_api_event_nondata_count_injector | 0 |
| Ndb_api_event_bytes_count_injector | 0 |
| Ndb_api_wait_exec_complete_count_session | 0 |
| Ndb_api_wait_scan_result_count_session | 0 |
| Ndb_api_wait_meta_request_count_session | 0 |
| Ndb_api_wait_nanos_count_session | 0 |
| Ndb_api_bytes_sent_count_session | 0 |
| Ndb_api_bytes_received_count_session | 0 |
| Ndb_api_trans_start_count_session | 0 |
| Ndb_api_trans_commit_count_session | 0 |
| Ndb_api_trans_abort_count_session | 0 |
| Ndb_api_trans_close_count_session | 0 |
| Ndb_api_pk_op_count_session | 0 |
| Ndb_api_uk_op_count_session | 0 |
| Ndb_api_table_scan_count_session | 0 |
| Ndb_api_range_scan_count_session | 0 |
| Ndb_api_pruned_scan_count_session | 0 |
| Ndb_api_scan_batch_count_session | 0 |
| Ndb_api_read_row_count_session | 0 |
| Ndb_api_trans_local_read_row_count_session | 0 |
| Ndb_api_adaptive_send_forced_count_session | 0 |
| Ndb_api_adaptive_send_unforced_count_session | 0 |
| Ndb_api_adaptive_send_deferred_count_session | 0 |
+----------------------------------------------+-----------+
90 rows in set (0.01 sec)
这些状态变量也可以从性能模式session_status和global_status表中获取,如下所示:
mysql> SELECT * FROM performance_schema.session_status
-> WHERE VARIABLE_NAME LIKE 'ndb_api%';
+----------------------------------------------+----------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+----------------------------------------------+----------------+
| Ndb_api_wait_exec_complete_count | 617 |
| Ndb_api_wait_scan_result_count | 0 |
| Ndb_api_wait_meta_request_count | 649 |
| Ndb_api_wait_nanos_count | 335663491 |
| Ndb_api_bytes_sent_count | 65764 |
| Ndb_api_bytes_received_count | 86940 |
| Ndb_api_trans_start_count | 308 |
| Ndb_api_trans_commit_count | 308 |
| Ndb_api_trans_abort_count | 0 |
| Ndb_api_trans_close_count | 308 |
| Ndb_api_pk_op_count | 311 |
| Ndb_api_uk_op_count | 0 |
| Ndb_api_table_scan_count | 0 |
| Ndb_api_range_scan_count | 0 |
| Ndb_api_pruned_scan_count | 0 |
| Ndb_api_scan_batch_count | 0 |
| Ndb_api_read_row_count | 307 |
| Ndb_api_trans_local_read_row_count | 77 |
| Ndb_api_adaptive_send_forced_count | 3 |
| Ndb_api_adaptive_send_unforced_count | 614 |
| Ndb_api_adaptive_send_deferred_count | 0 |
| Ndb_api_event_data_count | 0 |
| Ndb_api_event_nondata_count | 0 |
| Ndb_api_event_bytes_count | 0 |
| Ndb_api_wait_exec_complete_count_slave | 0 |
| Ndb_api_wait_scan_result_count_slave | 0 |
| Ndb_api_wait_meta_request_count_slave | 0 |
| Ndb_api_wait_nanos_count_slave | 0 |
| Ndb_api_bytes_sent_count_slave | 0 |
| Ndb_api_bytes_received_count_slave | 0 |
| Ndb_api_trans_start_count_slave | 0 |
| Ndb_api_trans_commit_count_slave | 0 |
| Ndb_api_trans_abort_count_slave | 0 |
| Ndb_api_trans_close_count_slave | 0 |
| Ndb_api_pk_op_count_slave | 0 |
| Ndb_api_uk_op_count_slave | 0 |
| Ndb_api_table_scan_count_slave | 0 |
| Ndb_api_range_scan_count_slave | 0 |
| Ndb_api_pruned_scan_count_slave | 0 |
| Ndb_api_scan_batch_count_slave | 0 |
| Ndb_api_read_row_count_slave | 0 |
| Ndb_api_trans_local_read_row_count_slave | 0 |
| Ndb_api_adaptive_send_forced_count_slave | 0 |
| Ndb_api_adaptive_send_unforced_count_slave | 0 |
| Ndb_api_adaptive_send_deferred_count_slave | 0 |
| Ndb_api_wait_exec_complete_count_replica | 0 |
| Ndb_api_wait_scan_result_count_replica | 0 |
| Ndb_api_wait_meta_request_count_replica | 0 |
| Ndb_api_wait_nanos_count_replica | 0 |
| Ndb_api_bytes_sent_count_replica | 0 |
| Ndb_api_bytes_received_count_replica | 0 |
| Ndb_api_trans_start_count_replica | 0 |
| Ndb_api_trans_commit_count_replica | 0 |
| Ndb_api_trans_abort_count_replica | 0 |
| Ndb_api_trans_close_count_replica | 0 |
| Ndb_api_pk_op_count_replica | 0 |
| Ndb_api_uk_op_count_replica | 0 |
| Ndb_api_table_scan_count_replica | 0 |
| Ndb_api_range_scan_count_replica | 0 |
| Ndb_api_pruned_scan_count_replica | 0 |
| Ndb_api_scan_batch_count_replica | 0 |
| Ndb_api_read_row_count_replica | 0 |
| Ndb_api_trans_local_read_row_count_replica | 0 |
| Ndb_api_adaptive_send_forced_count_replica | 0 |
| Ndb_api_adaptive_send_unforced_count_replica | 0 |
| Ndb_api_adaptive_send_deferred_count_replica | 0 |
| Ndb_api_event_data_count_injector | 0 |
| Ndb_api_event_nondata_count_injector | 0 |
| Ndb_api_event_bytes_count_injector | 0 |
| Ndb_api_wait_exec_complete_count_session | 0 |
| Ndb_api_wait_scan_result_count_session | 0 |
| Ndb_api_wait_meta_request_count_session | 0 |
| Ndb_api_wait_nanos_count_session | 0 |
| Ndb_api_bytes_sent_count_session | 0 |
| Ndb_api_bytes_received_count_session | 0 |
| Ndb_api_trans_start_count_session | 0 |
| Ndb_api_trans_commit_count_session | 0 |
| Ndb_api_trans_abort_count_session | 0 |
| Ndb_api_trans_close_count_session | 0 |
| Ndb_api_pk_op_count_session | 0 |
| Ndb_api_uk_op_count_session | 0 |
| Ndb_api_table_scan_count_session | 0 |
| Ndb_api_range_scan_count_session | 0 |
| Ndb_api_pruned_scan_count_session | 0 |
| Ndb_api_scan_batch_count_session | 0 |
| Ndb_api_read_row_count_session | 0 |
| Ndb_api_trans_local_read_row_count_session | 0 |
| Ndb_api_adaptive_send_forced_count_session | 0 |
| Ndb_api_adaptive_send_unforced_count_session | 0 |
| Ndb_api_adaptive_send_deferred_count_session | 0 |
+----------------------------------------------+----------------+
90 rows in set (0.01 sec)
mysql> SELECT * FROM performance_schema.global_status
-> WHERE VARIABLE_NAME LIKE 'ndb_api%';
+----------------------------------------------+----------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+----------------------------------------------+----------------+
| Ndb_api_wait_exec_complete_count | 741 |
| Ndb_api_wait_scan_result_count | 0 |
| Ndb_api_wait_meta_request_count | 777 |
| Ndb_api_wait_nanos_count | 373888309 |
| Ndb_api_bytes_sent_count | 78124 |
| Ndb_api_bytes_received_count | 94988 |
| Ndb_api_trans_start_count | 370 |
| Ndb_api_trans_commit_count | 370 |
| Ndb_api_trans_abort_count | 0 |
| Ndb_api_trans_close_count | 370 |
| Ndb_api_pk_op_count | 373 |
| Ndb_api_uk_op_count | 0 |
| Ndb_api_table_scan_count | 0 |
| Ndb_api_range_scan_count | 0 |
| Ndb_api_pruned_scan_count | 0 |
| Ndb_api_scan_batch_count | 0 |
| Ndb_api_read_row_count | 369 |
| Ndb_api_trans_local_read_row_count | 93 |
| Ndb_api_adaptive_send_forced_count | 3 |
| Ndb_api_adaptive_send_unforced_count | 738 |
| Ndb_api_adaptive_send_deferred_count | 0 |
| Ndb_api_event_data_count | 0 |
| Ndb_api_event_nondata_count | 0 |
| Ndb_api_event_bytes_count | 0 |
| Ndb_api_wait_exec_complete_count_slave | 0 |
| Ndb_api_wait_scan_result_count_slave | 0 |
| Ndb_api_wait_meta_request_count_slave | 0 |
| Ndb_api_wait_nanos_count_slave | 0 |
| Ndb_api_bytes_sent_count_slave | 0 |
| Ndb_api_bytes_received_count_slave | 0 |
| Ndb_api_trans_start_count_slave | 0 |
| Ndb_api_trans_commit_count_slave | 0 |
| Ndb_api_trans_abort_count_slave | 0 |
| Ndb_api_trans_close_count_slave | 0 |
| Ndb_api_pk_op_count_slave | 0 |
| Ndb_api_uk_op_count_slave | 0 |
| Ndb_api_table_scan_count_slave | 0 |
| Ndb_api_range_scan_count_slave | 0 |
| Ndb_api_pruned_scan_count_slave | 0 |
| Ndb_api_scan_batch_count_slave | 0 |
| Ndb_api_read_row_count_slave | 0 |
| Ndb_api_trans_local_read_row_count_slave | 0 |
| Ndb_api_adaptive_send_forced_count_slave | 0 |
| Ndb_api_adaptive_send_unforced_count_slave | 0 |
| Ndb_api_adaptive_send_deferred_count_slave | 0 |
| Ndb_api_wait_exec_complete_count_replica | 0 |
| Ndb_api_wait_scan_result_count_replica | 0 |
| Ndb_api_wait_meta_request_count_replica | 0 |
| Ndb_api_wait_nanos_count_replica | 0 |
| Ndb_api_bytes_sent_count_replica | 0 |
| Ndb_api_bytes_received_count_replica | 0 |
| Ndb_api_trans_start_count_replica | 0 |
| Ndb_api_trans_commit_count_replica | 0 |
| Ndb_api_trans_abort_count_replica | 0 |
| Ndb_api_trans_close_count_replica | 0 |
| Ndb_api_pk_op_count_replica | 0 |
| Ndb_api_uk_op_count_replica | 0 |
| Ndb_api_table_scan_count_replica | 0 |
| Ndb_api_range_scan_count_replica | 0 |
| Ndb_api_pruned_scan_count_replica | 0 |
| Ndb_api_scan_batch_count_replica | 0 |
| Ndb_api_read_row_count_replica | 0 |
| Ndb_api_trans_local_read_row_count_replica | 0 |
| Ndb_api_adaptive_send_forced_count_replica | 0 |
| Ndb_api_adaptive_send_unforced_count_replica | 0 |
| Ndb_api_adaptive_send_deferred_count_replica | 0 |
| Ndb_api_event_data_count_injector | 0 |
| Ndb_api_event_nondata_count_injector | 0 |
| Ndb_api_event_bytes_count_injector | 0 |
| Ndb_api_wait_exec_complete_count_session | 0 |
| Ndb_api_wait_scan_result_count_session | 0 |
| Ndb_api_wait_meta_request_count_session | 0 |
| Ndb_api_wait_nanos_count_session | 0 |
| Ndb_api_bytes_sent_count_session | 0 |
| Ndb_api_bytes_received_count_session | 0 |
| Ndb_api_trans_start_count_session | 0 |
| Ndb_api_trans_commit_count_session | 0 |
| Ndb_api_trans_abort_count_session | 0 |
| Ndb_api_trans_close_count_session | 0 |
| Ndb_api_pk_op_count_session | 0 |
| Ndb_api_uk_op_count_session | 0 |
| Ndb_api_table_scan_count_session | 0 |
| Ndb_api_range_scan_count_session | 0 |
| Ndb_api_pruned_scan_count_session | 0 |
| Ndb_api_scan_batch_count_session | 0 |
| Ndb_api_read_row_count_session | 0 |
| Ndb_api_trans_local_read_row_count_session | 0 |
| Ndb_api_adaptive_send_forced_count_session | 0 |
| Ndb_api_adaptive_send_unforced_count_session | 0 |
| Ndb_api_adaptive_send_deferred_count_session | 0 |
+----------------------------------------------+----------------+
90 rows in set (0.01 sec)
每个Ndb对象都有自己的计数器。NDB API 应用程序可以读取这些计数器的值,用于优化或监控。对于同时使用多个Ndb对象的多线程客户端,还可以从属于给定Ndb_cluster_connection的所有Ndb对象获取计数器的总和视图。
有四组这些计数器可供查看。一组适用于当前会话;另外 3 组是全局的。尽管它们的值可以作为mysql客户端的会话或全局状态变量获得。这意味着在SHOW STATUS中指定SESSION或GLOBAL关键字对 NDB API 统计状态变量报告的值没有影响,每个变量的值无论是从session_status表的等效列还是从global_status表获得,其值都是相同的。
-
会话计数器(特定会话)
会话计数器与当前会话中使用的
Ndb对象相关。其他 MySQL 客户端对这些对象的使用不会影响这些计数。为了最大限度地减少与标准 MySQL 会话变量的混淆,我们将与这些 NDB API 会话计数器对应的变量称为“
_session变量”,带有前导下划线。 -
复制计数器(全局)
这组计数器与复制 SQL 线程(如果有)使用的
Ndb对象相关。如果此mysqld不充当复制品,或不使用NDB表,则所有这些计数都为 0。我们将相关的状态变量称为“
_slave变量”(带有前导下划线)。 -
注入器计数器(全局)
注入器计数器与二进制日志注入器线程监听集群事件所使用的
Ndb对象相关。即使不写入二进制日志,附加到 NDB 集群的mysqld进程仍会继续监听某些事件,如模式更改。我们将与 NDB API 注入器计数器对应的状态变量称为“
_injector变量”(带有前导下划线)。 -
服务器(全局)计数器(全局)
这组计数器与当前mysqld使用的所有
Ndb对象相关。这包括所有 MySQL 客户端应用程序、复制 SQL 线程(如果有)、二进制日志注入器和NDB实用程序线程。我们将与这些计数器对应的状态变量称为“全局变量”或“mysqld级别变量”。
你可以通过在变量名中额外过滤子字符串 session、slave 或 injector(以及共同前缀 Ndb_api)来获取特定一组变量的值。对于 _session 变量,可以按照这里所示进行操作:
mysql> SHOW STATUS LIKE 'ndb_api%session';
+--------------------------------------------+---------+
| Variable_name | Value |
+--------------------------------------------+---------+
| Ndb_api_wait_exec_complete_count_session | 2 |
| Ndb_api_wait_scan_result_count_session | 0 |
| Ndb_api_wait_meta_request_count_session | 1 |
| Ndb_api_wait_nanos_count_session | 8144375 |
| Ndb_api_bytes_sent_count_session | 68 |
| Ndb_api_bytes_received_count_session | 84 |
| Ndb_api_trans_start_count_session | 1 |
| Ndb_api_trans_commit_count_session | 1 |
| Ndb_api_trans_abort_count_session | 0 |
| Ndb_api_trans_close_count_session | 1 |
| Ndb_api_pk_op_count_session | 1 |
| Ndb_api_uk_op_count_session | 0 |
| Ndb_api_table_scan_count_session | 0 |
| Ndb_api_range_scan_count_session | 0 |
| Ndb_api_pruned_scan_count_session | 0 |
| Ndb_api_scan_batch_count_session | 0 |
| Ndb_api_read_row_count_session | 1 |
| Ndb_api_trans_local_read_row_count_session | 1 |
+--------------------------------------------+---------+
18 rows in set (0.50 sec)
要获取 NDB API mysqld 级别状态变量的列表,请过滤以 ndb_api 开头且以 _count 结尾的变量名,就像这样:
mysql> SELECT * FROM performance_schema.session_status
-> WHERE VARIABLE_NAME LIKE 'ndb_api%count';
+------------------------------------+----------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+------------------------------------+----------------+
| NDB_API_WAIT_EXEC_COMPLETE_COUNT | 4 |
| NDB_API_WAIT_SCAN_RESULT_COUNT | 3 |
| NDB_API_WAIT_META_REQUEST_COUNT | 28 |
| NDB_API_WAIT_NANOS_COUNT | 53756398 |
| NDB_API_BYTES_SENT_COUNT | 1060 |
| NDB_API_BYTES_RECEIVED_COUNT | 9724 |
| NDB_API_TRANS_START_COUNT | 3 |
| NDB_API_TRANS_COMMIT_COUNT | 2 |
| NDB_API_TRANS_ABORT_COUNT | 0 |
| NDB_API_TRANS_CLOSE_COUNT | 3 |
| NDB_API_PK_OP_COUNT | 2 |
| NDB_API_UK_OP_COUNT | 0 |
| NDB_API_TABLE_SCAN_COUNT | 1 |
| NDB_API_RANGE_SCAN_COUNT | 0 |
| NDB_API_PRUNED_SCAN_COUNT | 0 |
| NDB_API_SCAN_BATCH_COUNT | 0 |
| NDB_API_READ_ROW_COUNT | 2 |
| NDB_API_TRANS_LOCAL_READ_ROW_COUNT | 2 |
| NDB_API_EVENT_DATA_COUNT | 0 |
| NDB_API_EVENT_NONDATA_COUNT | 0 |
| NDB_API_EVENT_BYTES_COUNT | 0 |
+------------------------------------+----------------+
21 rows in set (0.09 sec)
并非所有计数器都反映在所有 4 组状态变量中。对于事件计数器 DataEventsRecvdCount、NondataEventsRecvdCount 和 EventBytesRecvdCount,仅有 _injector 和 mysqld 级别的 NDB API 状态变量可用:
mysql> SHOW STATUS LIKE 'ndb_api%event%';
+--------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------+-------+
| Ndb_api_event_data_count_injector | 0 |
| Ndb_api_event_nondata_count_injector | 0 |
| Ndb_api_event_bytes_count_injector | 0 |
| Ndb_api_event_data_count | 0 |
| Ndb_api_event_nondata_count | 0 |
| Ndb_api_event_bytes_count | 0 |
+--------------------------------------+-------+
6 rows in set (0.00 sec)
对于任何其他 NDB API 计数器,都未实现 _injector 状态变量,如下所示:
mysql> SHOW STATUS LIKE 'ndb_api%injector%';
+--------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------+-------+
| Ndb_api_event_data_count_injector | 0 |
| Ndb_api_event_nondata_count_injector | 0 |
| Ndb_api_event_bytes_count_injector | 0 |
+--------------------------------------+-------+
3 rows in set (0.00 sec)
状态变量的名称可以轻松与相应计数器的名称关联起来。每个 NDB API 统计计数器在以下表中列出,包括描述以及与该计数器对应的任何 MySQL 服务器状态变量的名称。
表 25.67 NDB API 统计计数器
| 计数器名称 | 描述 | 状态变量(按统计类型):
-
会话
-
从库(副本)
-
注入器
-
服务器
|
WaitExecCompleteCount | 线程在等待操作完成时被阻塞的次数。包括所有 execute() 调用,以及对 blob 操作和对客户端不可见的自增操作的隐式执行。 |
|---|
-
Ndb_api_wait_exec_complete_count_session -
Ndb_api_wait_exec_complete_count_slave -
[无]
-
Ndb_api_wait_exec_complete_count
|
WaitScanResultCount | 线程在等待扫描信号时被阻塞的次数,例如等待额外结果或等待扫描关闭。 |
|---|
-
Ndb_api_wait_scan_result_count_session -
Ndb_api_wait_scan_result_count_slave -
[无]
-
Ndb_api_wait_scan_result_count
|
WaitMetaRequestCount | 线程被阻塞等待基于元数据的信号的次数;当等待 DDL 操作或等待开始(或结束)时代时,可能会发生这种情况。 |
|---|
-
Ndb_api_wait_meta_request_count_session -
Ndb_api_wait_meta_request_count_slave -
[无]
-
Ndb_api_wait_meta_request_count
|
WaitNanosCount | 从数据节点等待某种信号所花费的总时间(以纳秒为单位)。 |
|---|
-
Ndb_api_wait_nanos_count_session -
Ndb_api_wait_nanos_count_slave -
[none]
-
Ndb_api_wait_nanos_count
|
BytesSentCount | 发送到数据节点的数据量(以字节为单位)。 |
|---|
-
Ndb_api_bytes_sent_count_session -
Ndb_api_bytes_sent_count_slave -
[none]
-
Ndb_api_bytes_sent_count
|
BytesRecvdCount | 从数据节点接收的数据量(以字节为单位)。 |
|---|
-
Ndb_api_bytes_received_count_session -
Ndb_api_bytes_received_count_slave -
[none]
-
Ndb_api_bytes_received_count
|
TransStartCount | 开始的事务数。 |
|---|
-
Ndb_api_trans_start_count_session -
Ndb_api_trans_start_count_slave -
[none]
-
Ndb_api_trans_start_count
|
TransCommitCount | 提交的事务数。 |
|---|
-
Ndb_api_trans_commit_count_session -
Ndb_api_trans_commit_count_slave -
[none]
-
Ndb_api_trans_commit_count
|
TransAbortCount | 中止的事务数。 |
|---|
-
Ndb_api_trans_abort_count_session -
Ndb_api_trans_abort_count_slave -
[none]
-
Ndb_api_trans_abort_count
|
TransCloseCount | 中止的事务数。(此值可能大于TransCommitCount和TransAbortCount的总和。) |
|---|
-
Ndb_api_trans_close_count_session -
Ndb_api_trans_close_count_slave -
[none]
-
Ndb_api_trans_close_count
|
PkOpCount | 基于或使用主键的操作次数。此计数包括 blob-part 表操作、隐式解锁操作和自增操作,以及通常对 MySQL 客户端可见的主键操作。 |
|---|
-
Ndb_api_pk_op_count_session -
Ndb_api_pk_op_count_slave -
[无]
-
Ndb_api_pk_op_count
|
UkOpCount | 基于或使用唯一键的操作次数。 |
|---|
-
Ndb_api_uk_op_count_session -
Ndb_api_uk_op_count_slave -
[无]
-
Ndb_api_uk_op_count
|
TableScanCount | 已启动的表扫描次数。这包括对内部表的扫描。 |
|---|
-
Ndb_api_table_scan_count_session -
Ndb_api_table_scan_count_slave -
[无]
-
Ndb_api_table_scan_count
|
RangeScanCount | 已启动的范围扫描次数。 |
|---|
-
Ndb_api_range_scan_count_session -
Ndb_api_range_scan_count_slave -
[无]
-
Ndb_api_range_scan_count
|
PrunedScanCount | 已被剪枝为单个分区的扫描次数。 |
|---|
-
Ndb_api_pruned_scan_count_session -
Ndb_api_pruned_scan_count_slave -
[无]
-
Ndb_api_pruned_scan_count
|
ScanBatchCount | 接收的行批次数。 (在此上下文中,批次是来自单个片段的扫描结果集。) |
|---|
-
Ndb_api_scan_batch_count_session -
Ndb_api_scan_batch_count_slave -
[无]
-
Ndb_api_scan_batch_count
|
ReadRowCount | 已读取的总行数。包括使用主键、唯一键和扫描操作读取的行。 |
|---|
-
Ndb_api_read_row_count_session -
Ndb_api_read_row_count_slave -
[无]
-
Ndb_api_read_row_count
|
TransLocalReadRowCount | 从运行事务的同一节点上读取的行数。 |
|---|
-
Ndb_api_trans_local_read_row_count_session -
Ndb_api_trans_local_read_row_count_slave -
[无]
-
Ndb_api_trans_local_read_row_count
|
DataEventsRecvdCount | 接收的行更改事件数。 |
|---|
-
[无]
-
[无]
-
Ndb_api_event_data_count_injector -
Ndb_api_event_data_count
|
NondataEventsRecvdCount | 接收的事件数,除了行更改事件。 |
|---|
-
[无]
-
[无]
-
Ndb_api_event_nondata_count_injector -
Ndb_api_event_nondata_count
|
EventBytesRecvdCount | 接收的事件字节数。 |
|---|
-
[无]
-
[无]
-
Ndb_api_event_bytes_count_injector -
Ndb_api_event_bytes_count
|
| 计数器名称 | 描述 | 状态变量(按统计类型):
-
会话
-
从属(副本)
-
注入器
-
服务器
|
要查看所有已提交事务的计数,即所有TransCommitCount计数器状态变量,您可以将SHOW STATUS的结果过滤为子字符串trans_commit_count,就像这样:
mysql> SHOW STATUS LIKE '%trans_commit_count%';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| Ndb_api_trans_commit_count_session | 1 |
| Ndb_api_trans_commit_count_slave | 0 |
| Ndb_api_trans_commit_count | 2 |
+------------------------------------+-------+
3 rows in set (0.00 sec)
从中您可以确定当前mysql客户端会话中已提交了 1 个事务,并且自上次重新启动以来,此mysqld上已提交了 2 个事务。
您可以通过比较执行语句前后相应_session状态变量的值来查看给定 SQL 语句如何递增各种 NDB API 计数器。在此示例中,在从SHOW STATUS获取初始值后,我们在test数据库中创建一个名为t的NDB表,该表只有一列:
mysql> SHOW STATUS LIKE 'ndb_api%session%';
+--------------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------------+--------+
| Ndb_api_wait_exec_complete_count_session | 2 |
| Ndb_api_wait_scan_result_count_session | 0 |
| Ndb_api_wait_meta_request_count_session | 3 |
| Ndb_api_wait_nanos_count_session | 820705 |
| Ndb_api_bytes_sent_count_session | 132 |
| Ndb_api_bytes_received_count_session | 372 |
| Ndb_api_trans_start_count_session | 1 |
| Ndb_api_trans_commit_count_session | 1 |
| Ndb_api_trans_abort_count_session | 0 |
| Ndb_api_trans_close_count_session | 1 |
| Ndb_api_pk_op_count_session | 1 |
| Ndb_api_uk_op_count_session | 0 |
| Ndb_api_table_scan_count_session | 0 |
| Ndb_api_range_scan_count_session | 0 |
| Ndb_api_pruned_scan_count_session | 0 |
| Ndb_api_scan_batch_count_session | 0 |
| Ndb_api_read_row_count_session | 1 |
| Ndb_api_trans_local_read_row_count_session | 1 |
+--------------------------------------------+--------+
18 rows in set (0.00 sec)
mysql> USE test;
Database changed
mysql> CREATE TABLE t (c INT) ENGINE NDBCLUSTER;
Query OK, 0 rows affected (0.85 sec)
现在,您可以执行一个新的SHOW STATUS语句并观察更改,如下所示(在输出中突出显示更改的行):
mysql> SHOW STATUS LIKE 'ndb_api%session%';
+--------------------------------------------+-----------+
| Variable_name | Value |
+--------------------------------------------+-----------+ *| Ndb_api_wait_exec_complete_count_session | 8 |* | Ndb_api_wait_scan_result_count_session | 0 |
*| Ndb_api_wait_meta_request_count_session | 17 |*
*| Ndb_api_wait_nanos_count_session | 706871709 |*
*| Ndb_api_bytes_sent_count_session | 2376 |*
*| Ndb_api_bytes_received_count_session | 3844 |*
*| Ndb_api_trans_start_count_session | 4 |*
*| Ndb_api_trans_commit_count_session | 4 |*
| Ndb_api_trans_abort_count_session | 0 |
*| Ndb_api_trans_close_count_session | 4 |*
*| Ndb_api_pk_op_count_session | 6 |*
| Ndb_api_uk_op_count_session | 0 |
| Ndb_api_table_scan_count_session | 0 |
| Ndb_api_range_scan_count_session | 0 |
| Ndb_api_pruned_scan_count_session | 0 |
| Ndb_api_scan_batch_count_session | 0 |
*| Ndb_api_read_row_count_session | 2 |*
| Ndb_api_trans_local_read_row_count_session | 1 |
+--------------------------------------------+-----------+
18 rows in set (0.00 sec)
同样,您可以看到通过向t插入一行导致的 NDB API 统计计数器的变化:插入行,然后运行与前一个示例中使用的相同的SHOW STATUS语句,如下所示:
mysql> INSERT INTO t VALUES (100);
Query OK, 1 row affected (0.00 sec)
mysql> SHOW STATUS LIKE 'ndb_api%session%';
+--------------------------------------------+-----------+
| Variable_name | Value |
+--------------------------------------------+-----------+
*| Ndb_api_wait_exec_complete_count_session | 11 |*
*| Ndb_api_wait_scan_result_count_session | 6 |*
*| Ndb_api_wait_meta_request_count_session | 20 |*
*| Ndb_api_wait_nanos_count_session | 707370418 |*
*| Ndb_api_bytes_sent_count_session | 2724 |*
*| Ndb_api_bytes_received_count_session | 4116 |*
*| Ndb_api_trans_start_count_session | 7 |*
*| Ndb_api_trans_commit_count_session | 6 |*
| Ndb_api_trans_abort_count_session | 0 |
*| Ndb_api_trans_close_count_session | 7 |*
*| Ndb_api_pk_op_count_session | 8 |*
| Ndb_api_uk_op_count_session | 0 |
*| Ndb_api_table_scan_count_session | 1 |*
| Ndb_api_range_scan_count_session | 0 |
| Ndb_api_pruned_scan_count_session | 0 |
| Ndb_api_scan_batch_count_session | 0 |
*| Ndb_api_read_row_count_session | 3 |*
*| Ndb_api_trans_local_read_row_count_session | 2 |*
+--------------------------------------------+-----------+
18 rows in set (0.00 sec)
我们可以从这些结果中得出许多观察结果:
-
虽然我们创建了
t,没有明确的主键,但在此过程中执行了 5 次主键操作(Ndb_api_pk_op_count_session的“之前”和“之后”值的差异,或者 6 减 1)。这反映了隐藏主键的创建,这是所有使用NDB存储引擎的表的特点。 -
通过比较
Ndb_api_wait_nanos_count_session的连续值,我们可以看到实现CREATE TABLE语句的 NDB API 操作等待的时间要长得多(706871709 - 820705 = 706051004 纳秒,或大约 0.7 秒),以获取来自数据节点的响应,比执行INSERT的操作(707370418 - 706871709 = 498709 ns,或大约 0.0005 秒)要长。在mysql客户端中报告的执行时间与这些数字大致相关。在没有足够(纳秒)时间分辨率的平台上,由于执行非常快的 SQL 语句而导致
WaitNanosCountNDB API 计数器值的微小变化,可能不总是在Ndb_api_wait_nanos_count_session、Ndb_api_wait_nanos_count_slave或Ndb_api_wait_nanos_count的值中可见。 -
INSERT语句增加了ReadRowCount和TransLocalReadRowCountNDB API 统计计数器,反映在Ndb_api_read_row_count_session和Ndb_api_trans_local_read_row_count_session的增加值。
25.6.16 ndbinfo: NDB 集群信息数据库
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-cluster-ndbinfo.html
25.6.16.1 ndbinfo arbitrator_validity_detail 表
25.6.16.2 ndbinfo arbitrator_validity_summary 表
25.6.16.3 ndbinfo backup_id 表
25.6.16.4 ndbinfo blobs 表
25.6.16.5 ndbinfo blocks 表
25.6.16.6 ndbinfo cluster_locks 表
25.6.16.7 ndbinfo cluster_operations 表
25.6.16.8 ndbinfo cluster_transactions 表
25.6.16.9 ndbinfo config_nodes 表
25.6.16.10 ndbinfo config_params 表
25.6.16.11 ndbinfo config_values 表
25.6.16.12 ndbinfo counters 表
25.6.16.13 ndbinfo cpudata 表
25.6.16.14 ndbinfo cpudata_1sec 表
25.6.16.15 ndbinfo cpudata_20sec 表
25.6.16.16 ndbinfo cpudata_50ms 表
25.6.16.17 ndbinfo cpuinfo 表
25.6.16.18 ndbinfo cpustat 表
25.6.16.19 ndbinfo cpustat_50ms 表
25.6.16.20 ndbinfo cpustat_1sec 表
25.6.16.21 ndbinfo cpustat_20sec 表
25.6.16.22 ndbinfo dictionary_columns 表
25.6.16.23 ndbinfo dictionary_tables 表
25.6.16.24 ndbinfo dict_obj_info 表
25.6.16.25 ndbinfo dict_obj_tree 表
25.6.16.26 ndbinfo dict_obj_types 表
25.6.16.27 ndbinfo disk_write_speed_base 表
25.6.16.28 ndbinfo disk_write_speed_aggregate 表
25.6.16.29 ndbinfo disk_write_speed_aggregate_node 表
25.6.16.30 ndbinfo diskpagebuffer 表
25.6.16.31 ndbinfo diskstat 表
25.6.16.32 ndbinfo diskstats_1sec 表
25.6.16.33 ndbinfo error_messages 表
25.6.16.34 ndbinfo events 表
25.6.16.35 ndbinfo files 表
25.6.16.36 ndbinfo foreign_keys 表
25.6.16.37 ndbinfo hash_maps 表
25.6.16.38 ndbinfo hwinfo 表
25.6.16.39 ndbinfo index_columns 表
25.6.16.40 ndbinfo index_stats 表
25.6.16.41 ndbinfo locks_per_fragment 表
25.6.16.42 ndbinfo logbuffers 表
25.6.16.43 ndbinfo logspaces 表
25.6.16.44 ndbinfo membership 表
25.6.16.45 ndbinfo memoryusage 表
25.6.16.46 ndbinfo memory_per_fragment 表
25.6.16.47 ndbinfo nodes 表
25.6.16.48 ndbinfo operations_per_fragment 表
25.6.16.49 ndbinfo pgman_time_track_stats 表
25.6.16.50 ndbinfo processes 表
25.6.16.51 ndbinfo resources 表
25.6.16.52 ndbinfo restart_info 表
25.6.16.53 ndbinfo server_locks 表
25.6.16.54 ndbinfo server_operations 表
25.6.16.55 ndbinfo server_transactions 表
25.6.16.56 ndbinfo table_distribution_status 表
25.6.16.57 ndbinfo table_fragments 表
25.6.16.58 ndbinfo table_info 表
25.6.16.59 ndbinfo table_replicas 表
25.6.16.60 ndbinfo tc_time_track_stats 表
25.6.16.61 ndbinfo threadblocks 表
25.6.16.62 ndbinfo threads 表
25.6.16.63 ndbinfo threadstat 表
25.6.16.64 ndbinfo transporter_details 表
25.6.16.65 ndbinfo transporters 表
ndbinfo是一个包含特定于 NDB Cluster 的信息的数据库。
该数据库包含许多表,每个表提供关于 NDB Cluster 节点状态、资源使用情况和操作的不同类型数据。您可以在接下来的几节中找到关于每个表的更详细信息。
ndbinfo包含在 MySQL Server 中的 NDB Cluster 支持中;不需要特殊的编译或配置步骤;当 MySQL Server 连接到集群时,这些表由 MySQL Server 创建。您可以使用SHOW PLUGINS验证给定 MySQL Server 实例中是否激活了ndbinfo支持;如果启用了ndbinfo支持,您应该看到Name列中包含ndbinfo,Status列中包含ACTIVE的行,如下所示(强调文本):
mysql> SHOW PLUGINS;
+----------------------------------+--------+--------------------+---------+---------+
| Name | Status | Type | Library | License |
+----------------------------------+--------+--------------------+---------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| caching_sha2_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| sha2_cache_cleaner | ACTIVE | AUDIT | NULL | GPL |
| daemon_keyring_proxy_plugin | ACTIVE | DAEMON | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
| InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
| INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CACHED_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SESSION_TEMP_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL |
| TempTable | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ndbcluster | ACTIVE | STORAGE ENGINE | NULL | GPL |
*| ndbinfo | ACTIVE | STORAGE ENGINE | NULL | GPL |*
| ndb_transid_mysql_connection_map | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| ngram | ACTIVE | FTPARSER | NULL | GPL |
| mysqlx_cache_cleaner | ACTIVE | AUDIT | NULL | GPL |
| mysqlx | ACTIVE | DAEMON | NULL | GPL |
+----------------------------------+--------+--------------------+---------+---------+
47 rows in set (0.00 sec)
您还可以通过检查SHOW ENGINES的输出,查看包含ndbinfo的行以及Support列中的YES,如下所示(强调文本):
mysql> SHOW ENGINES\G
*************************** 1\. row ***************************
Engine: ndbcluster
Support: YES
Comment: Clustered, fault-tolerant tables
Transactions: YES
XA: NO
Savepoints: NO
*************************** 2\. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3\. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 4\. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5\. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6\. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7\. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
**************************** 8\. row ***************************
Engine: ndbinfo
Support: YES
Comment: NDB Cluster system information storage engine
Transactions: NO
XA: NO
Savepoints: NO*
*************************** 9\. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 10\. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO 10 rows in set (0.00 sec)
如果启用了ndbinfo支持,则可以使用 SQL 语句在mysql或其他 MySQL 客户端中访问ndbinfo。例如,您可以在SHOW DATABASES的输出中看到ndbinfo,如下所示(强调文本):
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
*| ndbinfo |*
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.04 sec)
如果mysqld进程未使用--ndbcluster选项启动,则ndbinfo不可用,并且不会显示在SHOW DATABASES中。如果mysqld曾连接到 NDB Cluster 但集群不可用(由于事件如集群关闭、网络连接丢失等),ndbinfo及其表仍然可见,但尝试访问任何表(除了blocks或config_params)将失败,并显示错误 157 'Connection to NDB failed' from NDBINFO。
除了blocks和config_params表之外,我们所说的ndbinfo“表”实际上是从内部NDB表生成的视图,通常对 MySQL Server 不可见。您可以通过将ndbinfo_show_hidden系统变量设置为ON(或1)来使这些表可见,但通常不需要这样做。
所有 ndbinfo 表都是只读的,并在查询时按需生成。因为许多表是由数据节点并行生成的,而其他表是特定于给定的 SQL 节点,所以不能保证提供一致的快照。
此外,在 ndbinfo 表上不支持连接的下推;因此,连接大型 ndbinfo 表可能需要将大量数据传输到请求的 API 节点,即使查询使用 WHERE 子句。
ndbinfo 表不包含在查询缓存中。(Bug #59831)
你可以使用 USE 语句选择 ndbinfo 数据库,然后发出 SHOW TABLES 语句获取表的列表,就像对待任何其他数据库一样,如下所示:
mysql> USE ndbinfo;
Database changed
mysql> SHOW TABLES;
+---------------------------------+
| Tables_in_ndbinfo |
+---------------------------------+
| arbitrator_validity_detail |
| arbitrator_validity_summary |
| backup_id |
| blobs |
| blocks |
| cluster_locks |
| cluster_operations |
| cluster_transactions |
| config_nodes |
| config_params |
| config_values |
| counters |
| cpudata |
| cpudata_1sec |
| cpudata_20sec |
| cpudata_50ms |
| cpuinfo |
| cpustat |
| cpustat_1sec |
| cpustat_20sec |
| cpustat_50ms |
| dict_obj_info |
| dict_obj_tree |
| dict_obj_types |
| dictionary_columns |
| dictionary_tables |
| disk_write_speed_aggregate |
| disk_write_speed_aggregate_node |
| disk_write_speed_base |
| diskpagebuffer |
| diskstat |
| diskstats_1sec |
| error_messages |
| events |
| files |
| foreign_keys |
| hash_maps |
| hwinfo |
| index_columns |
| index_stats |
| locks_per_fragment |
| logbuffers |
| logspaces |
| membership |
| memory_per_fragment |
| memoryusage |
| nodes |
| operations_per_fragment |
| pgman_time_track_stats |
| processes |
| resources |
| restart_info |
| server_locks |
| server_operations |
| server_transactions |
| table_distribution_status |
| table_fragments |
| table_info |
| table_replicas |
| tc_time_track_stats |
| threadblocks |
| threads |
| threadstat |
| transporters |
+---------------------------------+
64 rows in set (0.00 sec)
在 NDB 8.0 中,所有 ndbinfo 表都使用 NDB 存储引擎;然而,在SHOW ENGINES和SHOW PLUGINS的输出中仍会出现一个 ndbinfo 条目,如前所述。
你可以执行对这些表的SELECT语句,就像你通常期望的那样:
mysql> SELECT * FROM memoryusage;
+---------+---------------------+--------+------------+------------+-------------+
| node_id | memory_type | used | used_pages | total | total_pages |
+---------+---------------------+--------+------------+------------+-------------+
| 5 | Data memory | 425984 | 13 | 2147483648 | 65536 |
| 5 | Long message buffer | 393216 | 1536 | 67108864 | 262144 |
| 6 | Data memory | 425984 | 13 | 2147483648 | 65536 |
| 6 | Long message buffer | 393216 | 1536 | 67108864 | 262144 |
| 7 | Data memory | 425984 | 13 | 2147483648 | 65536 |
| 7 | Long message buffer | 393216 | 1536 | 67108864 | 262144 |
| 8 | Data memory | 425984 | 13 | 2147483648 | 65536 |
| 8 | Long message buffer | 393216 | 1536 | 67108864 | 262144 |
+---------+---------------------+--------+------------+------------+-------------+
8 rows in set (0.09 sec)
更复杂的查询,比如以下两个使用memoryusage表的SELECT语句,是可能的:
mysql> SELECT SUM(used) as 'Data Memory Used, All Nodes'
> FROM memoryusage
> WHERE memory_type = 'Data memory';
+-----------------------------+
| Data Memory Used, All Nodes |
+-----------------------------+
| 6460 |
+-----------------------------+
1 row in set (0.09 sec)
mysql> SELECT SUM(used) as 'Long Message Buffer, All Nodes'
> FROM memoryusage
> WHERE memory_type = 'Long message buffer';
+-------------------------------------+
| Long Message Buffer Used, All Nodes |
+-------------------------------------+
| 1179648 |
+-------------------------------------+
1 row in set (0.08 sec)
ndbinfo 表和列名区分大小写(ndbinfo 数据库本身的名称也是如此)。这些标识符是小写的。尝试使用错误的大小写会导致错误,如下例所示:
mysql> SELECT * FROM nodes;
+---------+--------+---------+-------------+-------------------+
| node_id | uptime | status | start_phase | config_generation |
+---------+--------+---------+-------------+-------------------+
| 5 | 17707 | STARTED | 0 | 1 |
| 6 | 17706 | STARTED | 0 | 1 |
| 7 | 17705 | STARTED | 0 | 1 |
| 8 | 17704 | STARTED | 0 | 1 |
+---------+--------+---------+-------------+-------------------+
4 rows in set (0.06 sec)
mysql> SELECT * FROM Nodes;
ERROR 1146 (42S02): Table 'ndbinfo.Nodes' doesn't exist
mysqldump 完全忽略 ndbinfo 数据库,并将其从任何输出中排除。即使使用 --databases 或 --all-databases 选项也是如此。
NDB Cluster 还在 INFORMATION_SCHEMA 信息数据库中维护表,包括包含有关用于 NDB Cluster 磁盘数据存储的文件的信息的FILES表,以及显示事务、事务协调器和 NDB Cluster API 节点之间关系的ndb_transid_mysql_connection_map表。有关更多信息,请参阅表的描述或第 25.6.17 节,“NDB Cluster 的 INFORMATION_SCHEMA 表”。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-cluster-ndbinfo-arbitrator-validity-detail.html
25.6.16.1 ndbinfo arbitrator_validity_detail 表
arbitrator_validity_detail 表显示集群中每个数据节点对仲裁者的视图。它是membership表的子集。
arbitrator_validity_detail 表包含以下列:
-
node_id此节点的节点 ID
-
仲裁者仲裁者的节点 ID
-
arb_ticket用于跟踪仲裁的内部标识符
-
arb_connected此节点是否连接到仲裁者;是
Yes或No中的一个 -
arb_state仲裁状态
备注
节点 ID 与**ndb_mgm -e "SHOW"**报告的相同。
所有节点应该显示相同的仲裁者和arb_ticket值,以及相同的arb_state值。可能的arb_state值包括ARBIT_NULL、ARBIT_INIT、ARBIT_FIND、ARBIT_PREP1、ARBIT_PREP2、ARBIT_START、ARBIT_RUN、ARBIT_CHOOSE、ARBIT_CRASH和UNKNOWN。
arb_connected 显示当前节点是否连接到仲裁者。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-cluster-ndbinfo-arbitrator-validity-summary.html
25.6.16.2 ndbinfo 仲裁者有效性摘要表
arbitrator_validity_summary 表提供了关于集群数据节点的仲裁者的综合视图。
arbitrator_validity_summary 表包含以下列:
-
arbitrator仲裁者的节点 ID
-
arb_ticket用于跟踪仲裁的内部标识符
-
arb_connected是否这个仲裁者连接到集群
-
consensus_count视为仲裁者的数据节点数量;可能是
Yes或No
备注
在正常操作中,这个表应该在相当长的时间内只有 1 行。如果在超过几分钟的时间内有多于 1 行,则可能是并非所有节点都连接到仲裁者,或者所有节点都连接了,但对同一个仲裁者意见不一致。
arbitrator 列显示仲裁者的节点 ID。
arb_ticket 是这个仲裁者使用的内部标识符。
arb_connected 显示这个节点是否作为仲裁者连接到集群。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-cluster-ndbinfo-backup-id.html
25.6.16.3 ndbinfo backup_id 表
该表提供了一种查找最近为该集群启动的备份的 ID 的方法。
backup_id 表包含一个名为 id 的单列,该列对应使用 ndb_mgm 客户端执行 START BACKUP 命令进行的备份 ID。该表包含一行。
示例: 假设在 NDB 管理客户端中发出以下一系列 START BACKUP 命令,自集群首次启动以来没有进行其他备份:
ndb_mgm> START BACKUP
Waiting for completed, this may take several minutes
Node 5: Backup 1 started from node 50
Node 5: Backup 1 started from node 50 completed
StartGCP: 27894 StopGCP: 27897
#Records: 2057 #LogRecords: 0
Data: 51580 bytes Log: 0 bytes
ndb_mgm> START BACKUP 5
Waiting for completed, this may take several minutes
Node 5: Backup 5 started from node 50
Node 5: Backup 5 started from node 50 completed
StartGCP: 27905 StopGCP: 27908
#Records: 2057 #LogRecords: 0
Data: 51580 bytes Log: 0 bytes
ndb_mgm> START BACKUP
Waiting for completed, this may take several minutes
Node 5: Backup 6 started from node 50
Node 5: Backup 6 started from node 50 completed
StartGCP: 27912 StopGCP: 27915
#Records: 2057 #LogRecords: 0
Data: 51580 bytes Log: 0 bytes
ndb_mgm> START BACKUP 3
Connected to Management Server at: localhost:1186
Waiting for completed, this may take several minutes
Node 5: Backup 3 started from node 50
Node 5: Backup 3 started from node 50 completed
StartGCP: 28149 StopGCP: 28152
#Records: 2057 #LogRecords: 0
Data: 51580 bytes Log: 0 bytes
ndb_mgm>
之后,使用 mysql 客户端,backup_id 表包含如下所示的单行:
mysql> USE ndbinfo;
Database changed
mysql> SELECT * FROM backup_id;
+------+
| id |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
如果找不到任何备份,则表中包含一个 id 值为 0 的单行。
backup_id 表在 NDB 8.0.24 中添加。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-cluster-ndbinfo-blobs.html
25.6.16.4 ndbinfo blobs 表
此表提供了存储在NDB中的 blob 值的信息。blobs表包含以下列:
-
table_id包含列的表的唯一 ID
-
database_name此表所在的数据库的名称
-
table_name表的名称
-
column_id表内此列的唯一 ID
-
column_name列的名称
-
inline_size列的内联大小
-
part_size列的部分大小
-
stripe_size列的条带大小
-
blob_table_name包含此列 blob 数据的 blob 表的名称(如果有)
此表中存在行,用于存储超过 255 字节的BLOB、TEXT值的NDB表列,因此需要使用 blob 表。超过 4000 字节的JSON值的部分也存储在此表中。有关 NDB 集群如何存储此类类型列的更多信息,请参阅字符串类型存储要求。
可以使用包含NDB表列注释的CREATE TABLE和ALTER TABLE语句设置NDB blob 列的部分和(NDB 8.0.30 及更高版本)内联大小(请参阅 NDB_COLUMN 选项);这也可以在 NDB API 应用程序中完成(请参阅Column::setPartSize()和setInlineSize())。
blobs表在 NDB 8.0.29 中添加。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-cluster-ndbinfo-blocks.html
25.6.16.5 ndbinfo 表
blocks 表是一个静态表,仅包含所有 NDB 内核块的名称和内部 ID(参见 NDB 内核块)。它供其他ndbinfo表(其中大部分实际上是视图)使用,以将块号映射到块名称,以生成人类可读的输出。
blocks 表包含以下列:
-
block_number块号
-
block_name块名称
笔记
要获取所有块名称的列表,只需执行SELECT block_name FROM ndbinfo.blocks。尽管这是一个静态表,但其内容可能会因不同的 NDB Cluster 版本而有所不同。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-cluster-ndbinfo-cluster-locks.html
25.6.16.6 ndbinfo cluster_locks表
cluster_locks表提供有关 NDB 集群中NDB表上持有和等待锁的当前锁请求的信息,并且旨在作为cluster_operations的伴随表。从cluster_locks表中获取的信息可能有助于调查停顿和死锁。
cluster_locks表包含以下列:
-
node_id报告节点的 ID
-
block_instance报告 LDM 实例的 ID
-
tableid包含此行的表的 ID
-
fragmentid包含锁定行的片段的 ID
-
rowid锁定行的 ID
-
transid事务 ID
-
mode锁请求模式
-
state锁定状态
-
detail是否是排队中第一个持有锁的
-
op操作类型
-
duration_millis等待或持有锁的毫秒数
-
lock_num锁对象的 ID
-
waiting_for等待具有此 ID 的锁
备注
表 ID(tableid列)是内部分配的,与其他ndbinfo表中使用的相同。它也显示在ndb_show_tables的输出中。
事务 ID(transid列)是由 NDB API 为请求或持有当前锁的事务生成的标识符。
mode列显示锁模式;始终是S(表示共享锁)或X(独占锁)。如果事务对给定行持有独占锁,则该行上的所有其他锁都具有相同的事务 ID。
state列显示锁状态。其值始终是H(持有)或W(等待)。等待的锁请求等待由不同事务持有的锁。
当detail列包含*(星号字符)时,这意味着这个锁是受影响行锁队列中第一个持有的锁;否则,此列为空。此信息可用于帮助识别锁请求列表中的唯一条目。
op列显示请求锁的操作类型。始终是READ、INSERT、UPDATE、DELETE、SCAN或REFRESH中的一个值。
duration_millis列显示此锁请求等待或持有锁的毫秒数。当为等待请求授予锁时,此值将重置为 0。
锁 ID(lockid列)对于此节点和块实例是唯一的。
锁定状态显示在lock_state列中;如果是W,则表示锁正在等待授予,而waiting_for列显示此请求正在等待的锁对象的锁 ID。否则,waiting_for列为空。waiting_for只能指向同一行上的锁,由node_id、block_instance、tableid、fragmentid和rowid标识。