4.5.3set命令

set attribute_assignment_list cluster_name

attribute_assignment_list:
    attribute_assignment[,attribute_assignment][,...]

attribute_assignment:
    attribute_name:process_specification[+process_specification][=value]

process_specification:
    [process_name][:process_id]

process_name:
    {ndb_mgmd|ndbd|ndbmtd|mysqld|ndbapi}

此命令用于设置一个或多个配置属性的值。可以在进程级别或实例级别设置属性。

set无论集群是否已经启动,命令都会被执行。在未运行的集群中,MySQL 集群管理器仅更新配置文件。但是,在正在运行的集群中,MySQL Cluster Manager 还会自动执行 使属性更改生效所需的任何节点重启或滚动重启(请参阅执行 NDB Cluster 的滚动重启)。然而,由于重启操作——特别是滚动重启,其中集群中的每个进程必须依次停止和重启——可能会花费大量时间,因此最好在启动集群并将其投入使用之前进行配置更改。

要在进程级别设置属性,请使用 set包含具有以下形式的属性分配的语句 attribute_nameprocess_name= value

例如,要 在ndbdDataMemory进程级别设置为 500 MB ,以便新值适用于集群中的所有ndbd进程,您可以发出包含属性分配的命令,如下所示: setDataMemory:ndbd=500M

mcm> set DataMemory:ndbd=500M mycluster;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (5.68 sec)

要验证是否正在使用新设置,您可以发出以下get命令:

mcm> get DataMemory mycluster;
+------------+-------+----------+------+----------+------+---------+---------+
| Name       | Value | Process1 | Id1  | Process2 | Id2  | Level   | Comment |
+------------+-------+----------+------+----------+------+---------+---------+
| DataMemory | 500M  | ndbd     | 1    |          |      | Process |         |
| DataMemory | 500M  | ndbd     | 2    |          |      | Process |         |
+------------+-------+----------+------+----------+------+---------+---------+
2 rows in set (0.79 sec)
笔记

有关此命令的更多信息,请参阅 第 4.5.1 节 “get命令”

要为特定流程实例设置属性,请在属性分配中包含流程 ID;这种属性赋值的形式是 attribute_name: process_name: process_id= value。例如,要将 进程 ID 为 200 的mysqld50进程的 wait_timeout 属性设置为 200,您将发出 set包含属性分配的命令wait_timeout:mysqld:51=200,如下所示:

mcm> set wait_timeout:mysqld:50=200 mycluster;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (6.18 sec)

get您可以使用适用的命令 验证设置是否生效:

mcm> get wait_timeout mycluster;
+--------------+-------+----------+------+----------+------+-------+---------+
| Name         | Value | Process1 | Id1  | Process2 | Id2  | Level | Comment |
+--------------+-------+----------+------+----------+------+-------+---------+
| wait_timeout | 200   | mysqld   | 50   |          |      |       |         |
+--------------+-------+----------+------+----------+------+-------+---------+
1 row in set (0.50 sec)

Read only不能设置 标记的属性。尝试这样做失败并出现错误,如下所示:

mcm> get :ndbd mycluster;
+--------------+-------------+----------+-----+----------+-----+-------+-----------+
| Name         | Value       | Process1 | Id1 | Process2 | Id2 | Level | Comment   |
+--------------+-------------+----------+-----+----------+-----+-------+-----------+
| DataDir      | /opt/c2data | ndbd     | 1   |          |     |       |           |
| HostName     | tonfisk     | ndbd     | 1   |          |     |       | Read only |
| NodeId       | 2           | ndbd     | 1   |          |     |       | Read only |
| DataDir      | /opt/c3data | ndbd     | 2   |          |     |       |           |
| HostName     | grindval    | ndbd     | 2   |          |     |       | Read only |
| NodeId       | 3           | ndbd     | 2   |          |     |       | Read only |
+--------------+-------------+----------+-----+----------+-----+-------+-----------+
6 rows in set (1.42 sec)
mcm> set HostName:ndbd:1=lax mycluster;
ERROR 6008 (00MGR): Config attribute HostName is read only and cannot be changed

但是,您可以设置强制属性,例如本节前面显示的示例,其中 DataDir配置属性设置为用户定义的值。

警告

NoOfReplicas必须仅在进程级别设置 强制 属性。尝试在实例级别设置它可能会使集群、MySQL 集群管理器或两者都处于无法使用的配置中。

get 命令的情况不同,您不能set全局范围内发出操作——也就是说,您不能在单个属性分配中为属性设置单个值,以便新属性值适用于所有进程,而不管进程类型,即使具有该名称的属性可以应用于所有进程类型。您也不能在单个属性分配中指定多个进程类型。尝试做这些事情中的任何一个都会导致错误,如下所示:

mcm> set DataDir=/var/cluster-data mycluster;
ERROR 3 (00MGR): Illegal syntax

mcm> set DataDir:ndb_mgmd,ndbd,mysqld=/var/cluster-data mycluster;
ERROR 3 (00MGR): Illegal syntax

相反,您必须为每个流程类型使用流程级属性分配。但是,您不一定需要为每种进程类型发出单独的设置命令。相反,您还可以在单​​个 set命令中进行多个属性分配,以逗号分隔列表的形式提供分配。此设置命令为名为的集群中的所有 MySQL 集群进程 分配/var/cdata数据目录 ( ) : DataDirmycluster

mcm> set DataDir:ndb_mgmd=/var/cdata, \
            DataDir:ndbd=/var/cdata, \
            DataDir:mysqld=/var/cdata mycluster;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (7.66 sec)

mcm> get DataDir mycluster;
+---------+------------+----------+---------+----------+---------+-------+---------+
| Name    | Value      | Process1 | NodeId1 | Process2 | NodeId2 | Level | Comment |
+---------+------------+----------+---------+----------+---------+-------+---------+
| DataDir | /var/cdata | ndbmtd   | 1       |          |         |       |         |
| DataDir | /var/cdata | ndbmtd   | 2       |          |         |       |         |
| DataDir | /var/cdata | ndb_mgmd | 49      |          |         |       |         |
| datadir | /var/cdata | mysqld   | 50      |          |         |       |         |
| datadir | /var/cdata | mysqld   | 51      |          |         |       |         |
+---------+------------+----------+---------+----------+---------+-------+---------+
5 rows in set (0.08 sec)

get 刚才的命令可以看出,属性赋值成功,并在进程级别生效。

笔记

在 MySQL Cluster Manager 中,配置属性名称不区分大小写。有关MySQL Cluster Manager 中区分大小写问题的更多信息, 请参阅字符串搜索中的区分大小写。

同样,您不能在单个属性分配中引用多个进程 ID,即使它们是同一类型的进程;以下命令不起作用

mcm> set DataMemory:ndbd:1,2=750M mycluster;
ERROR 3 (00MGR): Illegal syntax

相反,您需要使用以下命令:

mcm> set DataMemory:ndbd:1=750M,DataMemory:ndbd:2=750M mycluster;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (7.70 sec)

(当然,如果这些是中仅有的两个数据节点 mycluster,那么该命令set DataMemory:ndbd=750M mycluster也可以完成相同的任务。)

笔记

一些配置属性适用于进程之间的连接,因此需要您在设置它们的过程中引用这两个进程。在这种情况下,您必须使用特殊的流程规范语法;有关如何完成此操作的信息, 请参阅 设置 TCP 连接属性。

您也不能在单个属性分配中为多个属性设置值;这意味着以下命令 不起作用

mcm> set UndoDataBuffer=32M,UndoIndexBuffer=8M:ndbd mycluster;
ERROR 3 (00MGR): Illegal syntax

mcm> set DataMemory,IndexMemory:ndbd=1G mycluster;
ERROR 3 (00MGR): Illegal syntax

但是,如果您为要更新其值的每个属性编写完整且有效的属性分配,则可以重写这两个命令,以便它们成功执行,如下所示:

mcm> set UndoDataBuffer:ndbd=32M,UndoIndexBuffer:ndbd=8M mycluster;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (6.62 sec)

mcm> set DataMemory:ndbd=1G,IndexMemory:ndbd=1G mycluster;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (7.04 sec)

事实上,没有理由不能在一个set命令中执行所有四个赋值,使用四个属性赋值的列表,如下所示:

mcm> set UndoDataBuffer:ndbd=32M,UndoIndexBuffer:ndbd=8M, \
          DataMemory:ndbd=1G, IndexMemory:ndbd=1G mycluster;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (6.24 sec)

但是,最好不要在任何单个set命令中执行过多的属性分配,因为这会使发现错误变得更加困难。

在 Windows 上,设置其值包含路径(例如DataDir)的属性时,必须将路径中的所有反斜杠字符替换为正斜杠。假设您要使用在 Windows 上运行的名为 MySQL 集群中节点 ID 为 50的mysqldC:\temp\node50进程的 tmpdir属性 。可以使用适当的命令查看此属性的原始值: myclusterget

mcm> get tmpdir mycluster;
+--------+----------------+----------+-----+----------+-----+-------+---------+
| Name   | Value          | Process1 | Id1 | Process2 | Id2 | Level | Comment |
+--------+----------------+----------+-----+----------+-----+-------+---------+
| tmpdir | c:\c50data\tmp | mysqld   | 50  |          |     |       |         |
+--------+----------------+----------+-----+----------+-----+-------+---------+
1 row in set (0.22 sec)

进行所需配置更改的正确set命令如下所示:

mcm> set tmpdir:mysqld:50=c:/temp/node50 mycluster;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (2.62 sec)

当您使用检查值时 get——即使它最初是使用反斜杠显示的——在显示新值时使用正斜杠:

mcm> get tmpdir mycluster;
+--------+----------------+----------+-----+----------+-----+-------+---------+
| Name   | Value          | Process1 | Id1 | Process2 | Id2 | Level | Comment |
+--------+----------------+----------+-----+----------+-----+-------+---------+
| tmpdir | c:/temp/node50 | mysqld   | 50  |          |     |       |         |
+--------+----------------+----------+-----+----------+-----+-------+---------+
1 row in set (0.22 sec)

但是,如果您尝试在发出set命令时在路径中使用反斜杠,命令将失败:

mcm> set tmpdir:mysqld:4=c:\temp\4 mycluster;
Outfile disabled.
ERROR:
Unknown command '\4'.
ERROR 6014 (00MGR): Path name for parameter tmpdir must be absolute.
The value 'c:mp4' is illegal.

设置 TCP 连接属性。  对于一些仅在使用 TCP 连接时适用的属性(例如 SendBufferMemoryand ReceiveBufferMemory属性),有必要使用修改后的语法来为属性值赋值。在这种情况下,属性分配包含两个流程规范,一个用于每个流程类型或设置应用的实例,并用加号 ( +) 连接。对于以下示例,请考虑名为 的集群mycluster2,它由此处显示的进程组成:

mcm> list processes mycluster2;
+------+----------+-------------+
| Id   | Name     | Host        |
+------+----------+-------------+
| 49   | ndb_mgmd | grindval    |
| 1    | ndbd     | tonfisk     |
| 2    | ndbd     | flundra     |
| 50   | mysqld   | haj         |
| 51   | mysqld   | torsk       |
+------+----------+-------------+
5 rows in set (0.16 sec)

(有关此命令的更多信息,请参见第 4.6.3 节“list processes命令”。)

get除非已设置,否则 TCP 连接属性不会显示在命令的输出中 。这意味着,在 SendBufferMemory第一次设置之前,如果您尝试检索其值,您将获得一个空结果,如下所示:

mcm> get SendBufferMemory mycluster2;
Empty set (0.18 sec)

mcm> get --include-defaults SendBufferMemory mycluster2;
Empty set (0.93 sec)

要将 SendBufferMemory数据节点和 SQL 节点之间的所有 TCP 连接设置为 4 MB,您可以使用此处显示的命令:

mcm> set SendBufferMemory:ndbd+mysqld=4M mycluster2;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (6.44 sec)

如果您随后使用 来检查属性的值 get,您可以看到该值应用于两个 ndbd进程中的每一个和中的两个 mysqld进程中 的每一个之间的所有可能连接mycluster2,因此输出中有四行:

mcm> get SendBufferMemory mycluster2;
+------------------+-------+----------+-----+----------+-----+---------+---------+
| Name             | Value | Process1 | Id1 | Process2 | Id2 | Level   | Comment |
+------------------+-------+----------+-----+----------+-----+---------+---------+
| SendBufferMemory | 4M    | ndbd     | 2   | mysqld   | 4   | Process |         |
| SendBufferMemory | 4M    | ndbd     | 2   | mysqld   | 5   | Process |         |
| SendBufferMemory | 4M    | ndbd     | 3   | mysqld   | 4   | Process |         |
| SendBufferMemory | 4M    | ndbd     | 3   | mysqld   | 5   | Process |         |
+------------------+-------+----------+-----+----------+-----+---------+---------+
4 rows in set (1.63 sec)

要仅针对具有进程 ID 的数据节点与2mysqld 进程(进程 ID 4)之间的连接覆盖此设置,您可以在进程规范的两个部分中的每一个部分中包含进程 ID,如下所示:

mcm> set SendBufferMemory:ndbd:2+mysqld:4=8M mycluster2;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (7.95 sec)

当您使用 get命令检查结果时,您可以看到新设置适用于实例级别,并且仅适用于具有 ID2和 ; 的进程之间的连接4;之前进行的进程级设置仍然适用于其余 3 个连接:

mcm> get SendBufferMemory mycluster2;
+------------------+-------+----------+-----+----------+-----+---------+---------+
| Name             | Value | Process1 | Id1 | Process2 | Id2 | Level   | Comment |
+------------------+-------+----------+-----+----------+-----+---------+---------+
| SendBufferMemory | 8M    | ndbd     | 2   | mysqld   | 50  |         |         |
| SendBufferMemory | 4M    | ndbd     | 2   | mysqld   | 51  | Process |         |
| SendBufferMemory | 4M    | ndbd     | 3   | mysqld   | 50  | Process |         |
| SendBufferMemory | 4M    | ndbd     | 3   | mysqld   | 51  | Process |         |
+------------------+-------+----------+-----+----------+-----+---------+---------+
4 rows in set (0.24 sec)

您不能在流程规范的一部分(即连接的一端)的流程级别上设置连接属性,而在另一部分的实例级别上设置连接属性。尝试这样做失败并出现错误,如下所示:

mcm> set SendBufferMemory:ndbd+mysqld:4=2M mycluster2;
ERROR 3 (00MGR): Illegal syntax
mcm> set SendBufferMemory:ndbd:2+mysqld=2M mycluster2;
ERROR 3 (00MGR): Illegal syntax

设置mysqld节点的属性。  在 MySQL Cluster Manager 1.3.4 之前,使用set命令设置mysqld进程的任何属性总是导致进程重新启动。从 MySQL Cluster Manager 1.3.4 开始,当一个动态变量被设置时,mcmd发出一个 SET GLOBAL 语句而不是mysqld 来应用这个值,并且还将这个值保存到 mysqld配置文件中,所以这个值可以在接下来mysqld 重启;但是,当设置了非动态变量时,仍然会触发立即重启。

mysqld连接池 的设置。可以通过将 属性设置为所需的连接数来 为mysqld 启用连接池,但在创建集群时还需要一个额外的步骤。ndb-cluster-connection-pool

因为mysqld进程在启用连接池时尝试与集群建立多个连接,所以集群必须配置 备用连接。您可以通过 ndbapi在命令中使用的 process_host 列表中添加(否则)未使用的条目来执行此操作create cluster,如下所示:

mcm> create cluster -P mypackage 
   > -R ndb_mgmd@10.100.10.97,ndbd@10.100.10.98,ndbd@10.100.10.99, \
        mysqld@10.100.10.100,ndbapi@10.100.10.100, \
        ndbapi@10.100.10.100,ndbapi@10.100.10.100
   > mycluster;
+------------------------------+
| Command result               |
+------------------------------+
| Cluster created successfully |
+------------------------------+
1 row in set (6.58 sec)

在此之后,您可以使用这样的set命令根据文件中可用的超额连接数来设置连接池的大小 config.ini

mcm> set ndb_cluster_connection_pool:mysqld=4;

usermysqld不支持属性 。  当前不支持尝试为mysqlduser进程设置属性,这 会导致将警告写入 MySQL Cluster Manager 日志。